给楼主提个建议,将按键扫描和动态显示分别做一个模块。采用分时的方法,在键盘扫描中定义一个标志位keyflag,当按键按下按下时,keyflag=1;按键弹起来时,keyflag置1,这样就检测标志位就不用一行一行的扫描键盘,消耗cpu的时间,同时也避免了按键扫描和动态显示之间的时间冲突,比如,按一下按键,数码管会闪一下。一个小段程序可能体现不出来,但如果是一个大型复杂的程序,问题就非常重要了,所以分时的思想在单片机中非常重要。当然也可以用中断解决,但是单片机中断源有限,能节约硬件资源就节约一下吧。
标志位的状态,如果不清楚的话,可以自己写一下,就会明白了。
#include<reg51.h>
#define uchar unsigned char
sbit key=P3^3;
bit keyflag;
char counter=0;
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//***********延时10ms*********//
void delay()
{
uchar i,j=10;
while(j--)
{
for(i=120;i>0;i--);
}
}
//**********动态扫描*********//
void display(void)
{
P2=0xfd;
P1=seg[counter/10];
delay();
P2=0xfe;
P1=seg[counter%10];
delay();
}
//***********按键扫描*********//
void keyread(void)
{
if(!key)
{
if(keyflag==0)//按键标志位
{
delay();
if(!key)
{
keyflag=1;
counter++;
if(counter==100)//计满100,清0
counter=0;
}
}
}
else
keyflag=0;
}
void main(void)
{
while( 1 )
{
keyread();
display();
}
}
|