简易计算器数码管显示变化范围0~F,上电时显示0,1每按下K1键一次,数值加1,2每按下K2键一次,数值减1,3每按下K3键数值归零。
这个问题的难点在于检测按键,用中断可以实现,如果不用中断,PLC上的上升沿方式可以考虑,编程原理:设定一个很短的扫描周期,0.1s或者更短,按键1,0.1s前是0,0.1s后是1,就可以判定按键动作,即上升沿,程序中数据+1,0.1s前是0,0.1s后是0或者0.1s前是1,0.1s后是1,表示按键无动作,0.1s前是1,0.1s后是0,判定按键松开,即下降沿,我以前用STC单片机写的程序可以参考下,跟你的功能差不多:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit KEY=P1^4; //定义按键输入端口
sbit LED=P1^2; //定义led输出端口
sbit LED1=P1^1;
sbit LED2=P1^0;
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管码
unsigned char TempData[8]; //存储显示值的全局变量
void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num);
void DelayUs2x(unsigned char t);//函数声明
void DelayMs(unsigned char t);
void main (void)
{ unsigned int num=9999;
unsigned int j;
unsigned int a;
unsigned int m;
bit n1;
bit n2;
bit n3;
KEY=1; //按键输入端口电平置高
n1=1;
n2=KEY;
a=0;
while (1) //主循环
{ j++;
m=!KEY;
if(j==10) //检测当前数值显示了一小段时间后
{j=0;
a++;
n3=KEY;
if(a==100)
{a=0;
n1=!n1;
LED1=n1;
}
if((n3^n2))
{n2=n3;
if(n3==0) //上升沿
LED=!LED;
else //下降沿
LED2=!LED2;
}
完整代码
#include<reg51.h>
int digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int box[4]={0};
int i;
int KeyValue;
int KeySwitch;
void delay(int ms)
{
int x,y;
for(x= ms;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
P2=0x01;
P3=digit[box[3]];
delay(10);
P2=0x02;
P3=digit[box[2]];
delay(10);
P2=0x04;
P3=digit[box[1]];
delay(10);
P2=0x08;
P3=digit[box[0]];
delay(10);
}
void KeyDown(void)
{ int a;
a=0;
P1=0xf0;
if(P1!=0xf0)
{
delay(20);
if(P1!=0xf0)
{
P1=0xf0;
switch(P1)
{
case(0Xe0): KeyValue=0;break;
case(0Xd0): KeyValue=1;break;
case(0Xb0): KeyValue=2;break;
case(0X70): KeyValue=3;break;
}
P1=0x0f;
switch(P1)
{
case(0X0e): KeyValue=KeyValue;break;
case(0X0d): KeyValue=KeyValue+4;break;
case(0X0b): KeyValue=KeyValue+8;break;
case(0X07): KeyValue=KeyValue+12;break;
}
if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9)
{
KeySwitch=1;
}
while((a<50)&&(P1!=0x0F))
{
delay(100);
a++;
}
}
}
}
void main()
{
int a,b,c;
while(1){
display();
KeyDown();
if(KeySwitch==1)
{
for(i=3;i>0;i--)
{box[i]=box[i-1];}
box[0]=KeyValue;
KeySwitch=0;
}
else if(KeyValue==10)
{
for(i=0;i<4;i++)
box[i]=0;
display();
}
else if(KeyValue==12)
{
a=box[0]+box[1]*10+box[2]*100+box[3]*1000;
for(i=0;i<4;i++)
box[i]=0;
while(1)
{
display();
KeyDown();
if(KeySwitch==1)
{
for(i=3;i>0;i--)
{box[i]=box[i-1];}
box[0]=KeyValue;
KeySwitch=0;
}
if(KeyValue==11) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000;
c=a+b;
box[0]=c%10;
box[1]=c/10%10;
box[2]=c/100%10;
box[3]=c/1000%10;
display();
}
else if(KeyValue==13)
{
a=box[0]+box[1]*10+box[2]*100+box[3]*1000;
for(i=0;i<4;i++)
box[i]=0;
while(1)
{
display();
KeyDown();
if(KeySwitch==1)
{
for(i=3;i>0;i--)
{box[i]=box[i-1];}
box[0]=KeyValue;
KeySwitch=0;
}
if(KeyValue==11) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000;
c=a-b;
box[0]=c%10;
box[1]=c/10%10;
box[2]=c/100%10;
box[3]=c/1000%10;
display();
}
else if(KeyValue==14)
{
a=box[0]+box[1]*10+box[2]*100+box[3];
for(i=0;i<4;i++)
box[i]=0;
while(1)
{
display();
KeyDown();
if(KeySwitch==1)
{
for(i=3;i>0;i--)
{box[i]=box[i-1];}
box[0]=KeyValue;
KeySwitch=0;
}
if(KeyValue==11) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000;
c=a*b;
box[0]=c%10;
box[1]=c/10%10;
box[2]=c/100%10;
box[3]=c/1000%10;
display();
}
else if(KeyValue==15)
{
a=box[0]+box[1]*10+box[2]*100+box[3]*1000;
for(i=0;i<4;i++)
box[i]=0;
while(1)
{
display();
KeyDown();
if(KeySwitch==1)
{
for(i=3;i>0;i--)
{box[i]=box[i-1];}
box[0]=KeyValue;
KeySwitch=0;
}
if(KeyValue==11) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000;
if(b==0){
P2=0x01;
P3=0x86;
delay(200);
P2=0x02;
P3=0x88;
delay(200);
P2=0x04;
P3=0x88;
delay(200);
P2=0x08;
P3=0xC0;
delay(200);
break;
}
c=a/b;
box[0]=c%10;
box[1]=c/10%10;
box[2]=c/100%10;
box[3]=c/1000%10;
display();
}
}
}