单片机中用矩阵键盘实现计算器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算器
1.程序要求:
用矩阵按键实现简单的加减乘除运算。
2.程序代码:
#include
#include
sbit col_1=P1^4;
sbit col_2=P1^5;
sbit col_3=P1^6;
sbit col_4=P1^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管
unsigned char keynum,flag;
unsigned char num1,num2,flag1,flag2,flag3,flag4;
void keyscan(void);
void display();
void keyfind(unsigned char);
void keyprocess(void);
void delay(unsigned int z) //延时1ms
{
unsigned int x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
void main(void)
{
while(1)
{
keyscan(); //按键扫描函数
keyprocess(); //数据处理
display(); //数据显示
}
}
void keyscan(void)
{
col_1=0;
col_2=0;
col_3=0;
col_4=0;
if ((P1&0x0f)!=0x0f) //判断行线是否全为1,不是则处理{
col_1=0; //第一列输出'0'
col_2=1;
col_3=1;
col_4=1;
keyfind(0);
col_1=1; //第二列输出'0'
col_2=0;
col_3=1;
col_4=1;
keyfind(4);
col_1=1; //第三列输出'0'
col_2=1;
col_3=0;
col_4=1;
keyfind(8);
col_1=1; //第四列输出'0'
col_2=1;
col_3=1;
col_4=0;
keyfind(12);
col_1=0; //列线输出全为'0'
col_2=0;
col_3=0;
col_4=0;
flag++; //每按一下标志位加1
while(((P1&0x0f)!=0x0f)); //等待按键释放
}
}
void keyfind(unsigned char col_dat)
{
unsigned char temp;
temp=(~P1)&0x0f; //求取各行状态
switch(temp) //键值计算
{
case 1:
keynum=1+col_dat;
case 2:
keynum=2+col_dat;
break;
case 4:
keynum=3+col_dat;
break;
case 8:
keynum=4+col_dat;
break;
}
}
void keyprocess(void)
{
switch(keynum)
{
case 1:if(flag==1) //flag=1表示是第一次按下,按得是被除数num1=7; //第一个键按下对应是数字7
if(flag==3) //flag=3表示是第三次按下,按的是除数
num2=7;
break;
case 2:if(flag==1)
num1=4;
if(flag==3)
num2=4;
break;
case 3:if(flag==1)
num1=1;
if(flag==3)
num2=1;
break;
case 5:if(flag==1)
num1=8;
if(flag==3)
num2=8;
break;
case 6:if(flag==1)
num1=5;
if(flag==3)
num2=5;
case 7:if(flag==1)
num1=2;
if(flag==3)
num2=2;
break;
case 8:if(flag==1)
num1=0;
if(flag==3)
num2=0;
break;
case 9:if(flag==1)
num1=9;
if(flag==3)
num2=9;
break;
case 10:if(flag==1)
num1=6;
if(flag==3)
num2=6;
break;
case 11:if(flag==1)
num1=3;
if(flag==3)
num2=3;
break;
case 4:
flag1=1;//“C”清除键按下,用flag1=1来记下
break;
case 12:
flag1=2;//“=”等号键按下,用flag1=2标记下
break;
case 13:
flag2=1;//“/”除号键按下,用flag2=1来标记
break;
case 14:
flag2=2;//“*”
break;
case 15:
flag2=3;//“-”
break;
case 16:
flag2=4;//“+”
break;