单片机矩阵计算机程序
/* 1 2 3 +(10)
4 5 6 -(11)
7 8 9 *(12)
'='(15) 0 AC(13) key(14)
这是键盘功能表
*/
#include
#define uchar unsigned char #define uint unsigned int sbit dula=P2^6;
sbit wela=P2^7;
uchar code
a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar b[6]={0,0,0,0,0,0}; int cal1=0,cal2=0; //计算器的两个运算操作数,cal1为被减数或者
被加数
int result=0; //运算结果 uchar sin=3,key=255; //运算符号 0:+ 1:- 2:无意义
void delayms(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display(key) //数码管显示函数
{
dula=1;
P0=b[0];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
dula=1;
P0=a[b[1]];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1;
P0=a[b[2]];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1;
P0=a[b[3]];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
dula=1;
P0=a[b[4]];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);
dula=1;
P0=a[b[5]];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}
uchar skey()//键盘扫描函数 {
uchar temp,key=255;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:key=1;break;
case 0xde:key=2;break;
case 0xbe:key=3;break;
case 0x7e:key=10;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=11;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key=7;break;
case 0xdb:key=8;break;
case 0xbb:key=9;break;
case 0x7b:key=12;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:key=15;break;
case 0xd7:key=0;break;
case 0xb7:key=13;break;
case 0x77:key=14;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return key;
}
void dis_change(int dis) //显示数据更新函数,参数为待显示函数 {
if(dis<0)
{
dis=-dis;
b[0]=0x40;
}
else b[0]=0x00;
b[1]=(dis/10000)%10;
b[2]=(dis/1000)%10;
b[3]=(dis/100)%10;
b[4]=(dis/10)%10;
b[5]=dis%10;
if(dis<10000) b[1]=0x40;
if(dis<1000) b[2]=0x40;
if(dis<100) b[3]=0x40;
if(dis<10) b[4]=0x40;
}
void chukey(uchar key) //键盘处理函数
{
if(key<10) //按下0~9数字键
{
if(sin<3)
{
cal2=cal2*10+key;//将输入的数据存入cal2
dis_change(cal2);
}
else
{
cal1=cal1*10+key;
dis_change(cal1);
}
}
else // 按下了控制键
{
switch(key)
{
case 10:sin=0;break;//'+'
case 11:sin=1;break;//'-'
case 12:sin=2;break;//'*'
case 13:cal1=cal2=0;//操作清零
result=0;
sin=3;
dis_change(0);
break;
case 15: //'='
{
switch(sin)
{
case 0:result=cal1+cal2;
dis_change(result);break;
case 1:result=cal1-cal2;
dis_change(result);break;
case 2:result=cal1*cal2;
dis_change(result);break;
case 3: break;
default :break;
}
cal1=cal2=0;
result=0;
sin=3;
break;
}
default:break;
}
}
}
void main() //主函数调用 {
int a;
dis_change(0);
while(1)
{
a=skey();
if(a!=255)
{
if(a==14)
{
b[5]=0x40;
b[4]=0x40;
b[3]=0x40;
b[2]=0x40;
b[1]=0x40;
b[0]=0x00;
}
else
chukey(a);
}
display(key);
}
}