标题:
普中51单片机数码管矩阵按键计算器代码
[打印本页]
作者:
accssory
时间:
2021-11-2 10:19
标题:
普中51单片机数码管矩阵按键计算器代码
这里使用的是普中科技的A2开发板,开发板用了一个38译码器来控制数码管,利用数码管动态显示可以实现一个简易计算器的功能。
#include <reg52.h>
#define GPIO_KEY P1
#define u16 unsigned int
#define u8 unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 b[8]={0,0,0,0,0,0,0,0};
u16 num1,num2,mode;
int KeyValue;
u8 DisplayData[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i)
{
u8 k;
while(i--)
for(k=110;k>0;k--);
}
void KeyDown()
{
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(10);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0X0f;
switch(GPIO_KEY)
{
case(0X07): KeyValue=9;break;
case(0X0b): KeyValue=8;break;
case(0X0d): KeyValue=7;break;
case(0X0e): KeyValue=-1;break;
}
GPIO_KEY=0Xf0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue-3;break;
case(0Xd0): KeyValue=KeyValue-6;break;
case(0Xe0): KeyValue=KeyValue-9;break;
}
}
if(KeyValue>=0)
{
mode=1;
}
else if(KeyValue==-1)
{
mode=2;
}
else if(KeyValue==-4)
{
mode=3;
}
else if(KeyValue==-7)
{
mode=4;
}
else if(KeyValue==-10)
{
mode=5;
}
else if(KeyValue==-2)
{
mode=6;
}
while(GPIO_KEY!=0Xf0)
{
delay(1);
}
}
}
void DigDisplay()
{
u8 j;
for(j=0;j<8;j++)
{
switch(j)
{
case(7):
LSA=1;LSB=1;LSC=1;break;
case(6):
LSA=0;LSB=1;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(2):
LSA=0;LSB=1;LSC=0;break;
case(1):
LSA=1;LSB=0;LSC=0;break;
case(0):
LSA=0;LSB=0;LSC=0;break;
}
P0=DisplayData[j];
delay(1);
P0=0x00;
}
}
void Init_timer0()
{
TMOD=0x01;
TH0=0xb8;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
void output_number(u16*p,u16 t);
void main()
{
u16 i,f,g=0,d;
u16 num[8]={0,0,0,0,0,0,0,0};
Init_timer0();
while(1)
{
KeyDown();
if(mode==1)
{
for(i=7;i>0;i--)
{
b[i]=b[i-1];
}
b[0]=KeyValue;
if(g==0)
{
num1=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
}
else
{
num2=(b[7]*10000000 + b[6]*1000000 + b[5]*100000 + b[4]*10000 + b[3]*1000 + b[2]*100 + b[1]*10 + b[0]);
}
for(i=0;i<8;i++)
{
if(b[i]!=0)
{
f=i+1;
}
}
for(i=0;i<f;i++)
{
DisplayData[i]=smgduan[b[i]];
}
mode=0;
}
if(mode==2)
{
for(i=0;i<8;i++)
{
b[i]=0;
DisplayData[i]=0x00;
}
mode=0;
g++;
d=1;
}
if(mode==3)
{
for(i=0;i<8;i++)
{
b[i]=0;
DisplayData[i]=0x00;
}
mode=0;
g++;
d=2;
}
if(mode==4)
{
for(i=0;i<8;i++)
{
b[i]=0;
DisplayData[i]=0x00;
}
mode=0;
g++;
d=3;
}
if(mode==5)
{
for(i=0;i<8;i++)
{
b[i]=0;
DisplayData[i]=0x00;
}
mode=0;
g++;
d=4;
}
if(mode==6)
{
if(d==1)
{
output_number(num,num1+num2);
for(i=0;i<8;i++)
{
if(num[i]!=0)
{
f=i+1;
}
}
for(i=0;i<f;i++)
{
DisplayData[i]=smgduan[num[i]];
}
for(i=f;i<8;i++)
{
DisplayData[i]=0x00;
}
}
if(d==2)
{
output_number(num,num1-num2);
for(i=0;i<8;i++)
{
if(num[i]!=0)
{
f=i+1;
}
}
for(i=0;i<f;i++)
{
DisplayData[i]=smgduan[num[i]];
}
for(i=f;i<8;i++)
{
DisplayData[i]=0x00;
}
}
if(d==3)
{
output_number(num,num1*num2);
for(i=0;i<8;i++)
{
if(num[i]!=0)
{
f=i+1;
}
}
for(i=0;i<f;i++)
{
DisplayData[i]=smgduan[num[i]];
}
for(i=f;i<8;i++)
{
DisplayData[i]=0x00;
}
}
if(d==4)
{
output_number(num,num1/num2);
for(i=0;i<8;i++)
{
if(num[i]!=0)
{
f=i+1;
}
}
for(i=0;i<f;i++)
{
DisplayData[i]=smgduan[num[i]];
}
for(i=f;i<8;i++)
{
DisplayData[i]=0x00;
}
}
}
}
}
void output_number(u16 *p,u16 t)
{
p[7]=t/10000000;
p[6]=(t%10000000)/1000000;
p[5]=((t%10000000)%1000000)/100000;
p[4]=(((t%10000000)%1000000)%100000)/10000;
p[3]=(((t%10000000)%1000000)%100000)%10000/1000;
p[2]=(((t%10000000)%1000000)%100000)%10000%1000/100;
p[1]=(((t%10000000)%1000000)%100000)%10000%1000%100/10;
p[0]=(((t%10000000)%1000000)%100000)%10000%1000%100%10;
}
void timer0() interrupt 1
{
TH0=0xb8;
TL0=0x00;
DigDisplay();
KeyDown();
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1