一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 8840|回复: 28

[其他综合] 按键中断老是按一次跳好几次,谁能给出一个防抖例程?

  [复制链接]
发表于 2012-8-5 10:57 | 显示全部楼层 |阅读模式
void extern0()interrupt 0
{
EX0=0;
    delay(500);
if(MODEKEY==0)
{
  hour++;
  if(hour>=24)
  {
   hour=0;
   day++;
  }
  Display3[0]=hour/10+0x30;
  Display3[1]=hour%10+0x30;
     delay(10);
}
EX0=1;
}

本程序是1602液晶万年历,主程序的中断初始化如下:
TMOD=0x01;
    TH0=(65536-46080)/256; //   TH0=0xdc;
    TL0=(65536-46080)%256;
    EA=1;
    ET0=1;  //T0中断
EX0=1; //开外部中断0
EX1=1; //开外部中断1
    TR0=1;
IT0=1;
IT1=1;
second=(Display3[6]-0x30)*0x0a+Display3[7]-0x30;
minite=(Display3[3]-0x30)*0x0a+Display3[4]-0x30;
hour=(Display3[0]-0x30)*0x0a+Display3[1]-0x30;

请问达人,按一次跳多次是何原因?


void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=100;y>0;y--);
}
发表于 2012-8-5 11:21 | 显示全部楼层
找一下草版的翻页钟程序,里边用到有。
回复

使用道具 举报

发表于 2012-8-5 11:22 | 显示全部楼层
中断内不要出现延时函数,否则会丢失中断的。
回复

使用道具 举报

 楼主| 发表于 2012-8-5 11:29 | 显示全部楼层
回复 2# 199003326


   阁下,艹版的程序,在哪呀?
回复

使用道具 举报

 楼主| 发表于 2012-8-5 11:50 | 显示全部楼层
回复 3# 199003326 丢中断?我看中断已经够多的了,按一次还中断好几次,丢了才好呢。
回复

使用道具 举报

发表于 2012-8-5 12:02 | 显示全部楼层
中断内还延时, 还有除法, 单片机累不?
回复

使用道具 举报

 楼主| 发表于 2012-8-5 16:07 | 显示全部楼层
是想把延时去掉,但问题依旧。至于除法,中断内不做,主程序内也得做,累是应该的。呵呵。
回复

使用道具 举报

发表于 2012-8-5 22:43 | 显示全部楼层
草版的程序直接在论坛里搜“翻页钟”就是了。
外部中断作按键的话可以在按键两端并个电容硬件消抖,但俺还是感觉用定时器检测按键做消抖容易,详见草版的程序。
回复

使用道具 举报

 楼主| 发表于 2012-8-6 07:51 | 显示全部楼层
看样子得用电容消抖试试了,艹版的程序参考了一样,用的是主程序里的扫描,而不是中断。待把中断搞定后,再尝试下主程序按键扫描。
回复

使用道具 举报

发表于 2012-8-6 13:07 | 显示全部楼层
看样子得用电容消抖试试了,艹版的程序参考了一样,用的是主程序里的扫描,而不是中断。待把中断搞定后,再 ...
dianzichina 发表于 2012-8-6 07:51 https://www.yleee.com.cn/images/common/back.gif



    草版的程序确定是用的定时器中断扫描,而不是外部中断。

另外就算是加电容硬件消抖,还是要把中断服务函数时的延时去掉,可以用一个标志位来解决,主程序内循环检测标志位。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-2 04:18 , Processed in 0.044698 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表