标题: 51单片机独立按键三行代码 无需延时消抖 [打印本页]

作者: qwthh    时间: 2019-4-14 22:29
标题: 51单片机独立按键三行代码 无需延时消抖
/*独立按键三行*/
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
  }
  //其他程序
}
}



作者: liulianww    时间: 2021-2-27 19:57
经典 标记一下
作者: hefq    时间: 2021-2-27 22:51
这是边沿检测,代替不了软件滤波,不做软件滤波会容易误触发
作者: xiexugang    时间: 2021-3-6 03:09
实用的按键程序,确实是需要软件滤波才行,软件滤波还可以处理长按和连按功能.
作者: hhh402    时间: 2021-3-6 11:26
xiexugang 发表于 2021-3-6 03:09
实用的按键程序,确实是需要软件滤波才行,软件滤波还可以处理长按和连按功能.

延时消抖不是必须的,按键的抖动是小于10ms的,只要按键的检测间隔大于10ms就不需要消抖,原因是在按键的抖动的时间10ms内最多只会检测一次,不管检测到是0还是1都不会影响按键的检测。而人按按键最快也要100ms,10ms检测间隔足够快了不会漏检,只要在10ms中断中执行按键检测就可以了。在中断中执行按键的检测还有一个好处,永远不会漏检。如果是在主程序中执行按键检测遇到100ms以上的延时是有可能按键漏检的,而且新手很喜欢用100ms以上的延时。
作者: qqbbs80    时间: 2021-10-15 07:57
hhh402 发表于 2021-3-6 11:26
延时消抖不是必须的,按键的抖动是小于10ms的,只要按键的检测间隔大于10ms就不需要消抖,原因是在按键的 ...

大佬,我昨天 试了你说的方法,是可行的...牛逼。
作者: bhjyqjs    时间: 2021-10-21 08:57
void Key_Read()
{
     unsigned char ReadData = KEYPORT^0xff;
     Trg = ReadData & (ReadData ^ Cont);      
     Cont = ReadData;                           
}
以上函数可简化,更精炼。
void Key_Read()
{
    ReadData = ~ReadData;     //
    Trg  = ReadData & ~Cont;  // 注“~”优先级高于& ;ReadData为本次键状态,Cont为上次键状态
    Cont = ReadData;              //                 
}
作者: 岳耳    时间: 2021-10-21 15:55
多谢,学习了,不知道这种方法是否可以用在模拟按键上,用ADC检测按键产生的电压,这样一个IO口可以支持多个按键。
作者: rp_0825    时间: 2021-10-23 01:07
bhjyqjs 发表于 2021-10-21 08:57
void Key_Read()
{
     unsigned char ReadData = KEYPORT^0xff;

您这程序具体怎么用呀,没看懂
作者: zhaobolove    时间: 2021-10-23 09:10


如果是这样,  我这样写, 更好理解
void main()
{   
while(1)
{




}
作者: zhaobolove    时间: 2021-10-23 09:12
void main()
{   
while(1)
{
        newkey = P3;
       if(newkey ! =oldkey)
{
    .......
oldkey=newkey ;
}
}




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