躺平摆烂大学生一枚,心血来潮,用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();
}
}
计算机实现的功能比较简单,显示的结果也只能是整数,对减法的结果如果为负数也没有进行一个判断,后期会进行合理的优化。