200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 51单片机8位数码管简易计算器(4*4矩阵键盘)

51单片机8位数码管简易计算器(4*4矩阵键盘)

时间:2019-07-24 22:35:00

相关推荐

51单片机8位数码管简易计算器(4*4矩阵键盘)

筒子们,上周参考了好多单片机计算器的文章,但是全文阅读基本都是付费,看了好几篇;参考了某个思路,终于完成了一个简易版的计算器;

1.8位数码管显示

2.简单的四则运算(加减乘除)

3.PS,以下代码目前还不具备累计功能,后续待完善;

数据移位那里是否可以利用指针,简化代码,还有待完善,有知道的大神们,也可以留言分享哦~

8位数码管简易计算器代码如下

#include <reg52.h> #include "math.h"typedef unsigned int u16;typedef unsigned char u8;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;long m,l;long t;char a, j;u8 b[8]; char n=0, fuhao;char bj=0, xs, xsbj, xsb=0, x,xa;char Equal_Set = 0;u8 KeyValue;u8 DisplayData[8];u8 data smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~F的值u8 data smgxiaoshu[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};void delay(u16 i){while(i--); }void KeyDown(void){char c=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{delay(1000);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{//测试列GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}//测试行GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((c<50)&&(GPIO_KEY!=0xf0)) {delay(1000);c++;}switch(KeyValue){case 0: a=7;break;case 1: a=8;break;case 2: a=9;break;case 3: a=-1;break;case 4: a=4;break;case 5: a=5;break;case 6: a=6;break;case 7: a=-2;break;case 8: a=1;break;case 9: a=2;break;case 10: a=3;break;case 11: a=-3;break;case 12: a=-4;break;case 13: a=0;break;case 14: a=-5;break;case 15: a=-6;break;}if(a>=0){n++;}/*if(a<0&&a!=-5&&a!=-4)*/if(a<0&&a!=-5){n=0;}if(a == -4){n = 0;m = 0;l = 0;}}}}//以上这个函数判断哪个键按下,并将计算器的0~9,四则运算符号等赋值定义到4*4矩阵键盘;void DigDisplay(){u8 i;for(i=0;i<8;i++){switch(i) {case(0):LSA=1;LSB=1;LSC=1; break;//显示第0位case(1):LSA=0;LSB=1;LSC=1; break;//显示第1位case(2):LSA=1;LSB=0;LSC=1; break;//显示第2位case(3):LSA=0;LSB=0;LSC=1; break;//显示第3位case(4):LSA=1;LSB=1;LSC=0; break;//显示第4位case(5):LSA=0;LSB=1;LSC=0; break;//显示第5位case(6):LSA=1;LSB=0;LSC=0; break;//显示第6位case(7):LSA=0;LSB=0;LSC=0; break;//显示第7位}P0=DisplayData[i];delay(100); //间隔一段时间扫描 P0=0x00;//消隐}}//以上函数利用138译码器进行位选void shuruzhi(){static int i = 0;if(n==0){b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=0;b[6]=0;b[7]=0;b[0]=0;}switch(n){case 0:DisplayData[0]=0x00;DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;i=0; break;case 1:if(i==0){b[0]=a;DisplayData[0]=smgduan[a]; DisplayData[1]=0x00;DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;i++;x=1;}break;case 2:if(i==1){b[1]=b[0];b[0]=a;DisplayData[1]=DisplayData[0];DisplayData[2]=0x00;DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=2;}break;case 3:if(i==2){b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[3]=0x00;DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=3;}break;case 4:if(i==3){b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[4]=0x00;DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=4;}break;case 5:if(i==4){b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[5]=0x00;DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=5;}break;case 6:if(i==5){b[5]=b[4];b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[5]=DisplayData[4];DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[6]=0x00;DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=6;}break;case 7:if(i==6){b[6]=b[5]; b[5]=b[4];b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[6]=DisplayData[5];DisplayData[5]=DisplayData[4];DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[7]=0x00;DisplayData[0]=smgduan[a];i++;x=7;}break;case 8:if(i==7){b[7]=b[6];b[6]=b[5]; b[5]=b[4];b[4]=b[3];b[3]=b[2];b[2]=b[1];b[1]=b[0];b[0]=a;DisplayData[7]=DisplayData[6];DisplayData[6]=DisplayData[5];DisplayData[5]=DisplayData[4];DisplayData[4]=DisplayData[3];DisplayData[3]=DisplayData[2];DisplayData[2]=DisplayData[1];DisplayData[1]=DisplayData[0];DisplayData[0]=smgduan[a];i++;i = 0;x=8;}break;}if(n > 0){l=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);}}void yunsuan(){if((bj == 0)&&(a<0)&&(a!= -4)){m=l;bj++;fuhao=a;a=66; }else{if(a!=-5&&a<0&&a!=-4){switch(fuhao){case -1:m=m+l;fuhao=a;a=66;break;case -2:m=m-l; fuhao=a;a=66;break;case -3:m=m*l;fuhao=a;a=66;break;case -6:m=m/l;fuhao=a;a=66;break; }}if(a==-5){switch(fuhao){case -1:m=m+l;fuhao=-1;a=66;break;case -2:m=m-l; fuhao=-2;a=66;break;case -3:m=m*l;fuhao=-3;a=66;break;case -6:m=m/l;fuhao=-6;a=66;break; }bj = 0;l = 0;t=m;}if(t<10){DisplayData[7]=0x00; DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00; DisplayData[3]=0x00; DisplayData[2]=0x00;DisplayData[1]=0x00;DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=10&&t<100){DisplayData[7]=0x00; DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00;DisplayData[3]=0x00;DisplayData[2]=0x00;DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=100&&t<1000){DisplayData[7]=0x00; DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00;DisplayData[3]=0x00;DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];} if(t>=1000&t<10000){DisplayData[7]=0x00; DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=0x00;DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10]; }if(t>=10000&t<100000){DisplayData[7]=0x00; DisplayData[6]=0x00;DisplayData[5]=0x00;DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=100000&t<1000000){DisplayData[7]=0x00; DisplayData[6]=0x00;DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=1000000&t<10000000){DisplayData[7]=0x00; DisplayData[6]=smgduan[(t%10000000)/1000000];DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}if(t>=10000000&t<100000000){DisplayData[7]=smgduan[t/10000000]; DisplayData[6]=smgduan[(t%10000000)/1000000];DisplayData[5]=smgduan[((t%10000000)%1000000)/100000];DisplayData[4]=smgduan[(((t%10000000)%1000000)%100000)/10000];DisplayData[3]=smgduan[(((t%10000000)%1000000)%100000)%10000/1000];DisplayData[2]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000/100];DisplayData[1]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100/10];DisplayData[0]=smgduan[(((t%10000000)%1000000)%100000)%10000%1000%100%10];}}}}}void main(){char i,t=0;for(i=0;i<8;i++){DisplayData[i]=~0x3f; //此次实验的数码管是共阳数码管;b[i]=0;} while(1){KeyDown();shuruzhi(); yunsuan();DigDisplay();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。