找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6212|回复: 10
打印 上一主题 下一主题
收起左侧

51单片机独立按键三行代码 无需延时消抖

  [复制链接]
跳转到指定楼层
楼主
ID:364328 发表于 2019-4-14 22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*独立按键三行*/
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
  }
  //其他程序
}
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:699775 发表于 2021-2-27 19:57 | 只看该作者
经典 标记一下
回复

使用道具 举报

板凳
ID:605142 发表于 2021-2-27 22:51 | 只看该作者
这是边沿检测,代替不了软件滤波,不做软件滤波会容易误触发
回复

使用道具 举报

地板
ID:69115 发表于 2021-3-6 03:09 | 只看该作者
实用的按键程序,确实是需要软件滤波才行,软件滤波还可以处理长按和连按功能.
回复

使用道具 举报

5#
ID:491577 发表于 2021-3-6 11:26 | 只看该作者
xiexugang 发表于 2021-3-6 03:09
实用的按键程序,确实是需要软件滤波才行,软件滤波还可以处理长按和连按功能.

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

使用道具 举报

6#
ID:884040 发表于 2021-10-15 07:57 | 只看该作者
hhh402 发表于 2021-3-6 11:26
延时消抖不是必须的,按键的抖动是小于10ms的,只要按键的检测间隔大于10ms就不需要消抖,原因是在按键的 ...

大佬,我昨天 试了你说的方法,是可行的...牛逼。
回复

使用道具 举报

7#
ID:66287 发表于 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;              //                 
}
回复

使用道具 举报

8#
ID:965325 发表于 2021-10-21 15:55 | 只看该作者
多谢,学习了,不知道这种方法是否可以用在模拟按键上,用ADC检测按键产生的电压,这样一个IO口可以支持多个按键。
回复

使用道具 举报

9#
ID:974214 发表于 2021-10-23 01:07 | 只看该作者
bhjyqjs 发表于 2021-10-21 08:57
void Key_Read()
{
     unsigned char ReadData = KEYPORT^0xff;

您这程序具体怎么用呀,没看懂
回复

使用道具 举报

10#
ID:115923 发表于 2021-10-23 09:10 | 只看该作者


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




}
回复

使用道具 举报

11#
ID:115923 发表于 2021-10-23 09:12 | 只看该作者
void main()
{   
while(1)
{
        newkey = P3;
       if(newkey ! =oldkey)
{
    .......
oldkey=newkey ;
}
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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