各位大侠
我的问题是 板上 5 个按键 5 个数码管 由于电路中没法加电容 我在按键时 采用延时防抖 可是 这样出现了 程序以为是连续按键 这样产生了 程序 连续运行 和 延时时 数码管黑掉了 放开按键 数码管才正常亮
请给个高招
不胜感激
如果允许连续按键,例如一直按着会不停的(一般每秒效应个3~4次像电脑键盘一样)响应
说个思路,这个版块有个键盘防抖的讨论可以看下
sbit key1=P1^0;
....
void timer0 interruput 1
{
if(key1==0)
{
delayms(10);
if(key1==0)//如果10毫秒后还是按着的说明按键有效
{
//按键响应
}
}
}
按键要有全局标志,代表按键状态,按下,释放,连续键等标志,连续键是在按键被按下的状态下,满足连续键的时间之后被设置。延时程序照着,数码管刷新在定时中断服务程序里做,这样就不会受按键延时代码的影响。
用软件来时先防抖动
你应该把按键是否已经释放来作为你判别按键是否已经按过了的标准
if(!k){
delay() //延时等待按键稳定
while(!k); //如果按键没放就让它停住,不执行下面的程序,直到你的按键释放。
。。。。。//下面再写按键响应程序
}
楼上说的对。你是不是按下键后,不松手时数码管是黑的,不显示呢?你应该按下键时,继续送数。
while(1)
{
..................//送数据
}
if(!k){
delay() //延时等待按键稳定
if(!k)
{
。。。。。。。。//向数码管送数据
}
while(!k); //如果按键没放就让它停住,不执行下面的程序,直到你的按键释放。
一直闪的原因应该是延时时间的控制。一般10MS吧
你的数码管显示程序应该用计时器中断来实现,定时器溢出设为10MS左右。这样不会应为主程序停留导致数码管闪烁。
5楼的方法正确
实际上扫描键盘也可以放在定时器中断中做