高级会员
主题
回帖0
积分2906
阅读权限30
注册时间2012-2-1
最后登录1970-1-1
在线时间 小时
|
我看实例是4行扫描用4段重复代码,太浪费,我喜欢精简,改成了4循环,并且用反回值,方便引用键值。
//============
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//uchar code dig[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管0~F 码表
uchar code dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管 0-F的码表
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
/*--------------------ms延时函数-----------------------*/
void delay_ms(unsigned int ms_number) // ms延时函数 (AT89C51 @ 11.0592MHz)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms_number;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
uchar keyscan()
{
uchar p,k,i,key[]={0xfe,0xfd,0xfb,0xf7};
for(i=0;i<4;i++)
{
P3=key[i];
p=P3;
p&=0xf0;
if(p!=0xf0)
{
delay_ms(20);
p=P3;
p&=0xf0;
if(p!=0xf0)
{
switch(p)
{
case(0xe0):
k=0;
break;
case(0xd0):
k=1;
break;
case(0xb0):
k=2;
break;
case(0x70):
k=3;
break;
}
//beep=0; //按键声音
while(p!=0xf0) //等待释放按键
{
p=P3;
p&=0xf0;
}
delay_ms(100);
//beep=1;
k+=4*i;
return k;
}
}
}
return 0xff;
}
void main()
{
uchar i,k;
P0=0xff;
wela=1;
wela=0;
for(i=0;i<16;i++)
{
P0=dig[i];
dula=1;
dula=0;
delay_ms(500);
}
P0=dig[0];
dula=1;
dula=0;
while(1)
{
k=keyscan();
while(k==0xff)k=keyscan();
P0=dig[k]; //数码管显示按键值。
dula=1;
dula=0;
}
} |
|