/*每次按下任意一个按键都可以实现数码管加一,按下不同的按键会在不同的位
显示出*/
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define key P1 //定义P1为key
u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};// 段选
u8 smgwei[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; //位选
//u8 keydat[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//存储按键的值
void delay(u16 i)
{
while(i--);
}
void keyscan()
{
static u8 k=0;
switch(key)
{
case 0xfe: if(key==0xfe)
{
delay(1000);
if(key==0xfe)
{
P0=smgduan[k];
P2=smgwei[0];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k1
case 0xfd: if(key==0xfd)
{
delay(1000);
if(key==0xfd)
{
P0=smgduan[k];
P2=smgwei[1];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k2
case 0xfb: if(key==0xfb)
{
delay(1000);
if(key==0xfb)
{
P0=smgduan[k];
P2=smgwei[2];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k3
case 0xf7: if(key==0xf7)
{
delay(1000);
if(key==0xf7)
{
P0=smgduan[k];
P2=smgwei[3];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k4
case 0xef: if(key==0xef)
{
delay(1000);
if(key==0xef)
{
P0=smgduan[k];
P2=smgwei[4];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k5
case 0xdf: if(key==0xdf)
{
delay(1000);
if(key==0xdf)
{
P0=smgduan[k];
P2=smgwei[5];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k6
case 0xbf: if(key==0xbf)
{
delay(1000);
if(key==0xbf)
{
P0=smgduan[k];
P2=smgwei[6];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k7
case 0x7f: if(key==0x7f)
{
delay(1000);
if(key==0x7f)
{
P0=smgduan[k];
P2=smgwei[7];
while(key==0xfd);
k++;
if(k==10)k=0;
}
}break;//k8
default : break;
}
}
void main()
{
P0=0x00;//数码管清零
while(1)
{
keyscan();
delay(20000);//延时起到控制每个加数累加的间隔
}
}