标题: 简洁的单片机按键消抖程序分享 [打印本页]

作者: 1111513    时间: 2021-11-4 17:25
标题: 简洁的单片机按键消抖程序分享
/*独立按键三行*/
unsigned char Trg;           
unsigned char Cont;
#define KEYPORT P3
void Key_Read( void )
{
    unsigned char ReadData = KEYPORT^0xff;
    Trg = ReadData & (ReadData ^ Cont);      
    Cont = ReadData;                           
}
void main()
{   
while(1)
{
  Key_Read();
  if(Trg & 0x08)//S4按下
  {
      //操作1
  }
  if(Trg & 0x04)//S5
  {
     //操作2
  }
  //其他程序
}
}

作者: wzqwxx    时间: 2021-11-6 08:55
谢谢分享,这个确实不错,实际应用非常好。
作者: ShawZJ    时间: 2023-3-30 11:44
谢谢分享,这个非常不错
作者: joyb    时间: 2023-3-30 14:14
这个按键消抖的原理是什么
作者: lkc8210    时间: 2023-3-30 15:03
joyb 发表于 2023-3-30 14:14
这个按键消抖的原理是什么

这不是消抖,这只是下降沿触发
没按键时
KEYPORT => 0xFF
ReadData => 0xFF ^ 0xFF => 0x00
Trg => 0x00 & (0x00 ^ 0x00) => 0x00 & 0x00 => 0x00
Cont => 0x00

P30 按下
KEYPORT => 0xFE
ReadData => 0xFE ^ 0xFF => 0x01
Trg => 0x01 & (0x01 ^ 0x00) => 0x01 & 0x01 => 0x01 (P30下降沿触发)
Cont => 0x01

P30 继续按下
KEYPORT => 0xFE
ReadData => 0xFE ^ 0xFF => 0x01
Trg => 0x01 & (0x01 ^ 0x01) => 0x01 & 0x00 => 0x00
Cont => 0x01

所以放在whil(1)是没有消抖效果的
必需以固定的时间(如10ms)来扫描才可以消抖




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1