基于c51的简易计算机

躺平摆烂大学生一枚,心血来潮,用51做了一个简易计算机,欢迎各位大佬批评指正,共同学习

思路

0   1   2   3

4   5   6   7

8   9 

+   -   *    /

归零键用复位键代替

下面是代码

public.h

#ifndef _public_H
#define _public_H
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;


void delay1ms(u8 i);
void delay10us(u8 i);


#endif

public.c

#include "public.h"


void delay1ms(u8 i)  //延时1ms 
{
	while(i--)
	{
    u8 a,b;
    for(b=199;b>0;b--)
        for(a=1;a>0;a--);
	}
}

void delay10us(u8 i)  //延时10us
{
	while(i--)
	{
    unsigned char a,b;
    for(b=1;b>0;b--)
   		for(a=2;a>0;a--);
	}
}

key.h

#ifndef _key_H
#define _key_H
#include "public.h"
#define KEY_MATRIX_PORT P1


u8 key_matrix_flip_scan(void);  //按键扫描函数

extern u8 keyflag; //数字按下标志位




#endif

key.c

#include "key.h"

u8 keyflag=0;


u8 key_matrix_flip_scan(void)   //线翻转扫描
{
static u8 key_value=0;
	
KEY_MATRIX_PORT=0x0f;
	
if(KEY_MATRIX_PORT!=0x0f)
{
delay10us(1000);
if(KEY_MATRIX_PORT!=0x0f)
{
KEY_MATRIX_PORT=0x0f;
switch(KEY_MATRIX_PORT)
{
case 0x07: key_value=0;break;
case 0x0b: key_value=1;break;
case 0x0d: key_value=2;break;
case 0x0e: key_value=3;break;
}

KEY_MATRIX_PORT=0xf0;
switch(KEY_MATRIX_PORT)
{
case 0x70: key_value=key_value;break;
case 0xb0: key_value=key_value+4;break;
case 0xd0: key_value=key_value+8;break;
case 0xe0: key_value=key_value+12;break;
}            
   if(key_value==0||key_value==1||key_value==2||key_value==3||key_value==4||key_value==5||key_value==6||key_value==7||key_value==8||key_value==9)
   {
       keyflag=1;
   }
    while(KEY_MATRIX_PORT!=0xf0);
   }
}

return key_value;
}

smg.h

#ifndef _smg_H
#define _smg_H
#include "public.h"
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

void smginit();
extern u8 smg[17];
extern u8 wei[8];

#endif

smg.c

#include "smg.h"
u8 smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
u8 wei[8]={0};
void smginit()    
{    
     LSA=1; LSB=1; LSC=1; GPIO_DIG=smg[wei[7]];delay10us(10); GPIO_DIG=0x00; 
     LSA=0; LSB=1; LSC=1; GPIO_DIG=smg[wei[6]];delay10us(10); GPIO_DIG=0x00;
     LSA=1; LSB=0; LSC=1; GPIO_DIG=smg[wei[5]];delay10us(10); GPIO_DIG=0x00; 
     LSA=0; LSB=0; LSC=1; GPIO_DIG=smg[wei[4]];delay10us(10); GPIO_DIG=0x00; 
     LSA=1; LSB=1; LSC=0; GPIO_DIG=smg[wei[3]];delay10us(10); GPIO_DIG=0x00; 
     LSA=0; LSB=1; LSC=0; GPIO_DIG=smg[wei[2]];delay10us(10); GPIO_DIG=0x00; 
     LSA=1; LSB=0; LSC=0; GPIO_DIG=smg[wei[1]];delay10us(10); GPIO_DIG=0x00; 
     LSA=0; LSB=0; LSC=0; GPIO_DIG=smg[wei[0]];delay10us(10); GPIO_DIG=0x00; 
}

main.c

#include "key.h"
#include "smg.h"
void resultcount()//ÊýÖµ½ÓÊÕÔËËãÄ£¿é
{
u8 num1=0,num2=0,i=0,value=0,result=0;
	while(1)
	{
    value=key_matrix_flip_scan();
		smginit();
		if(keyflag==1)
			{
				for(i=8;i>0;i--)
				
				{wei[i]=wei[i-1];}
				wei[0]=value;
				keyflag=0;
			}	
		
	 if(value==12)  //加法运算
		{
		  
			u8 i=0;
			num1=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;			
      for(i=0;i<8;i++)
			{wei[i]=0;}
			
			while(1)
			{	
			  smginit();
			  value=key_matrix_flip_scan();
			  if(value==10)break;
				if(keyflag==1)
				{
					for(i=8;i>0;i--)
					{
							wei[i]=wei[i-1];
					}
				wei[0]=value;
				keyflag=0;                                                                                                                                                                                                                        
				}
			
			}				
		num2=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
		result=num1+num2;
		wei[7]=result/10000000;
	  wei[6]=result%10000000/1000000;
	  wei[5]=result%1000000/100000;
	  wei[4]=result%100000/10000;
	  wei[3]=result%10000/1000;
	  wei[2]=result%1000/100;
	  wei[1]=result%100/10;
	  wei[0]=result%10;
		}
		
  	if(value==13)    //减法运算
		{
			u8 i=0;
			num1=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;			
      for(i=0;i<8;i++)
			{wei[i]=0;}
			while(1)
			{  
				smginit();
			  value=key_matrix_flip_scan();
			  if(value==10)break;
			  if(keyflag==1)
				{
					for(i=8;i>0;i--)
					{
						wei[i]=wei[i-1];
					}
				wei[0]=value;
				keyflag=0;
				}
			
			}				
		  num2=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
		  result=num1-num2;
			wei[7]=result/10000000;
	    wei[6]=result%10000000/1000000;
	    wei[5]=result%1000000/100000;
	    wei[4]=result%100000/10000;
	    wei[3]=result%10000/1000;
	    wei[2]=result%1000/100;
	    wei[1]=result%100/10;
	    wei[0]=result%10;
		}
			
		
  	if(value==14)   //乘法运算
		{
			u8 i=0;
			num1=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;			
      for(i=0;i<8;i++)
			{wei[i]=0;}
			while(1)
			{  
				smginit();
			  value=key_matrix_flip_scan();
			  if(value==10)break;
			  if(keyflag==1)
				{
					for(i=8;i>0;i--)
					{
						wei[i]=wei[i-1];
					}
				wei[0]=value;
				keyflag=0;
				}
			
			}				
		  num2=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
		  result=num1*num2;
			wei[7]=result/10000000;
	    wei[6]=result%10000000/1000000;
	    wei[5]=result%1000000/100000;
	    wei[4]=result%100000/10000;
	    wei[3]=result%10000/1000;
	    wei[2]=result%1000/100;
	    wei[1]=result%100/10;
	    wei[0]=result%10;
		}
	
		if(value==15)    //除法运算
		{
		  u8 i=0;
			num1=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;			
      for(i=0;i<8;i++)
			{wei[i]=0;}
			
			while(1)
			{ 
				smginit();
			  value=key_matrix_flip_scan();
			  if(value==10)break;
				if(keyflag==1)
				{
					for(i=8;i>0;i--)
					{
							wei[i]=wei[i-1];
					}
				 wei[0]=value;
				 keyflag=0;
				}
		  }				
		num2=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
		result=num1/num2;
	  wei[7]=result/10000000;
	  wei[6]=result%10000000/1000000;
	  wei[5]=result%1000000/100000;
	  wei[4]=result%100000/10000;
	  wei[3]=result%10000/1000;
	  wei[2]=result%1000/100;
	  wei[1]=result%100/10;
	  wei[0]=result%10;

	 }

  }

}



void main()
{
while(1)
{
resultcount();
smginit();	
}







}

计算机实现的功能比较简单,显示的结果也只能是整数,对减法的结果如果为负数也没有进行一个判断,后期会进行合理的优化。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值