筒子们,上周参考了好多单片机计算器的文章,但是全文阅读基本都是付费,看了好几篇;参考了某个思路,终于完成了一个简易版的计算器; 1.8位数码管显示 2.简单的四则运算(加减乘除) 3.PS,以下代码目前还不具备累计功能,后续待完善; 数据移位那里是否可以利用指针,简化代码,还有待完善,有知道的大神们,也可以留言分享哦~
8位数码管简易计算器代码如下
#include #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((ccase 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 n = 0; m = 0; l = 0;} } }}//以上这个函数判断哪个键按下,并将计算器的0~9,四则运算符号等赋值定义到4*4矩阵键盘;void DigDisplay(){ u8 i; for(i=0;icase(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 if(a!=-5&&acase -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(tDisplayData[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&&tDisplayData[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&tDisplayData[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&tDisplayData[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 KeyDown(); shuruzhi();yunsuan(); DigDisplay(); }}