用延时做按键长按检测+数码管的记数:这是我学习中写的一个程序,希望大家看看,还有什么不足的地方可以改进!下面是程序!
#include<reg52.h>
unsigned char smduan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //p0口为段选
unsigned char smwei[4]={0xf7,0xFb,0xfd,0xfe};//p2为位选
sbit k4=P3^5; //按键
unsigned char i;
unsigned char ge;
unsigned char bai;
unsigned char shi;
unsigned char jishu;
void delay_ms(unsigned int ms) //延时
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
void xianshi() //数码管 显示
{
bai=i/100;
shi=i%100/10;
ge=i%10;
P2=smwei[2];
P0=smduan[bai];
delay_ms(3);
P2=smwei[1];
P0=smduan[shi];
delay_ms(3);
P2=smwei[0];
P0=smduan[ge];
delay_ms(3);
}
void main ()
{
k4=1; //按键至1
i=0; //初始
while(1) //大循环
{
if(k4==0) //判断按键是否按下
{
delay_ms(4) ; //去抖
if(k4==0) //再判断按键是否还是按下
i++; //按键是按下,记数+1
}
while(!k4) //等待按键释放
{
xianshi() ; //显示
delay_ms(1);
jishu++; //按键按下时间
delay_ms(1);
if(jishu>254) //判断按键是否按下时间超过半秒
{
i++; //实现快速+1
delay_ms(4);
jishu=250;
}
}
if(k4==1)
delay_ms(5);
if(k4==1);
xianshi();
jishu=0; //按键按下时间清0
}
}