51单片机矩阵键盘实现基本计算器功能(包括负数)

功能实现

加(12)减(13)乘(14)除(15)  等于(11),清0(K3),退位(K4),在第一次运算结果上继续运算,负数输入(10),负数运算,最大显示9999999

        难点以及重点,注意延迟消抖,判断按键状态,用一个数保留前一次的结果,通过数组移位实现输入,退位,然后注意变量long /unsigned long/ 这些的取值范围这些

思路大致如下

分为3个模块

目录

1 检测输入

2 显示函数

3 计算函数


1 检测输入

void keyscan()
{{u8 temp;P1 = 0x0f;delayms(10);temp = P1^0x0f;switch(temp){case 1:kn = 0;break;case 2:kn = 1;break;case 4:kn = 2;break;case 8:kn = 3;break;}P1 = 0xf0;temp = P1>>4^0x0f;switch(temp){case 1:kn += 0;break;case 2:kn += 4;break;case 4:kn += 8;break;case 8:kn += 12;break;}delayms(4000);if(kn==0||kn==1||kn==2||kn==3||kn==4||kn==5||kn==6||kn==7||kn==8||kn==9){flag=1;}else if(kn==10){Num[7]=16;}}}

2 显示函数

void show()
{int i=0;for(; i<8;i++){P2=i*4;P0=seg[Num[i]];delayms(10);}
}

3 计算函数


void clac()
{int i;
long a,b,c; if(flag==1)           for(i=6;i>0;i--)              {Num[i]=Num[i-1];}             Num[0]=kn;                            flag=0;                                  }else if(key2==0)    {delayms(20);if(key2==0){for(i=0;i<8;i++)Num[i]=0;              while(!key2);show(); }}else if(key3==0)   {delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}while(!key3);show();}}else if(kn==12){   if (Num[7]==16)  {	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  if(kn==11) break;  if(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   {delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}while(!key3);show();}}}if (Num[7]==16) {	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;c=a+b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}else if(kn==13){if (Num[7]==16)  {	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  if(kn==11) break;  //µÈºÅif(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   {delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}show();while(!key3);}}}if (Num[7]==16)  {	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;c=a-b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}else if(kn==14){if (Num[7]==16)  {	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan(); if(kn==11) break; if(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   {delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}show();while(!key3);}}}if (Num[7]==16)  {	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;c=a*b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}else if(kn==15){if (Num[7]==16)  {	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  if(kn==11) break; if(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   {delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}show();while(!key3);}}}if (Num[7]==16)  {	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000; c=a/b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}
}

Keil

里面的注释粘过来乱码了,自己理解一下吧,挺简单的。

主函数如下

void main()
{while(1){ show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  clac();}
}

难点以及重点,注意延迟消抖,判断按键状态,用一个数保留前一次的结果,通过数组移位实现输入,然后注意变量long /unsigned long/ 这些的取值范围这些

 完整代码如下

#include 
#include
typedef unsigned char u8;//0-255
typedef unsigned int u16;//0-65535
typedef unsigned char uchar;//0-255
typedef unsigned int uint;//0-65535
typedef unsigned long u32;//0-4294967295//long -2147483648~+2147483647
/*  bit £¨ÀàËÆbool£©/sbit  ȡֵ0»ò1		*/sbit key0 = P3^1;
sbit key1 = P3^0;
sbit key2 = P3^2;
sbit key3 = P3^3;sbit led0 = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;
sbit led3 = P2^3;u8 code seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,0x40};//: 0x40  -
int Num [8]={0};   //±£´æ½á¹û
int kn = 0;
int flag;//Åжϰ´(0~9)void delayms(u16 n)//ms
{while(n--){u8 c = 10;while(c--);}
}void keyscan()
{{u8 temp;P1 = 0x0f;delayms(10);temp = P1^0x0f;switch(temp){case 1:kn = 0;break;case 2:kn = 1;break;case 4:kn = 2;break;case 8:kn = 3;break;}P1 = 0xf0;temp = P1>>4^0x0f;switch(temp){case 1:kn += 0;break;case 2:kn += 4;break;case 4:kn += 8;break;case 8:kn += 12;break;}delayms(4000);if(kn==0||kn==1||kn==2||kn==3||kn==4||kn==5||kn==6||kn==7||kn==8||kn==9){flag=1;}else if(kn==10){Num[7]=16;}}}void show()
{int i=0;for(; i<8;i++){P2=i*4;P0=seg[Num[i]];delayms(10);}
}void clac()
{int i;
long a,b,c; //¼Ç¼ÔËËã±äÁ¿if(flag==1)  //(¼Ç¼°´¼ü){                                 for(i=6;i>0;i--)              {Num[i]=Num[i-1];}             Num[0]=kn;                            flag=0;                                  }else if(key2==0)     //Çå0{delayms(20);if(key2==0){for(i=0;i<8;i++)Num[i]=0;              while(!key2);show(); }}else if(key3==0)   //ÍËλ{delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}while(!key3);show();}}else if(kn==12)// ¼Ó·¨ÔËËã{   if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  //¼Ç¼°´¼üif(kn==11) break;  //µÈºÅif(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   //ÍËλ{delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}while(!key3);show();}}}if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;c=a+b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}else if(kn==13)// ¼õ·¨ÔËËã{if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  //¼Ç¼°´¼üif(kn==11) break;  //µÈºÅif(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   //ÍËλ{delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}show();while(!key3);}}}if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;c=a-b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}else if(kn==14)// ³Ë{if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  //¼Ç¼°´¼üif(kn==11) break;  //µÈºÅif(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   //ÍËλ{delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}show();while(!key3);}}}if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;c=a*b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}else if(kn==15)// ³ý·¨ÔËËã{if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	a=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;a=-a;}elsea=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;for(i=0;i<8;i++)Num[i]=0;while(1)                                {show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  //¼Ç¼°´¼üif(kn==11) break;  //µÈºÅif(flag==1){  for(i=6;i>0;i--){Num[i]=Num[i-1];}Num[0]=kn;flag=0;}else if(key3==0)   //ÍËλ{delayms(20);if(key3==0){for(i=1;i<7;i++){Num[i-1]=Num[i];}show();while(!key3);}}}if (Num[7]==16)  //˵Ã÷ÊǸºÊý{	b=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000;b=-b;}elseb=Num[0]+Num[1]*10+Num[2]*100+Num[3]*1000+Num[4]*10000+Num[5]*100000+Num[6]*1000000; c=a/b;if(c<0){c=-c;Num[7]=16;}Num[0]=c%10;                    Num[1]=c/10%10;Num[2]=c/100%10;Num[3]=c/1000%10;Num[4]=c/10000%10;Num[5]=c/100000%10;Num[6]=c/1000000%10;show();}
}void main()
{while(1){ show();P1 = 0xf0;if(P1 != 0xf0)    keyscan();  //¼Ç¼°´¼üclac();}
}

 有些乱码但不重要,觉得有用麻烦点个赞👍!!

 有问题下方评论,互相讨论!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部