找回密码
 立即注册
查看: 617|回复: 6

很经典的三行按键识别 非常好用

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2024-4-16 17:31:43 | 显示全部楼层 |阅读模式
本帖最后由 zhang32568 于 2024-4-16 17:33 编辑

不占用中断 不使用延时  没有死循环!!!不占用任何资源

这个按键检测程序我在20年前网上看到过。当时没有试用。今天逛论坛,又看到这个代码。于是决定测试一下




unsigned char num,trg1=0, trg2=0,cont1=0,cont2=0;//一定是全局变量
unsigned char
sbit key1=P1^1;
sbit key2=P1^2;

unsigned key1scan()
{
unsigned char a=!key1;//网上是异或运算a=key1^0x01,对于一位按键可以直接写成取反
trg1= a&(a^cont1);
cont1=a;
if(trg1&!key1) //网上是(trg1&key1)实际测试不能使用!!因为任何时候都不可能为真。只有改成(trg1&!key1)才可以完美执行!!!
return 1;//返回等于1 表示按键按下。
//{
//此处可以是自己需要执行的程序。(去掉前面的返回)
//}

}


unsigned key2scan()
{
unsigned char a=!key2;//网上是异或运算a=key2^0x01,对于一位按键可以直接写成取反
trg2= a&(a^cont2);
cont2=a;
if(trg2&!key2)  
return 1;//返回等于1 表示按键按下。
//{
//此处可以是自己需要执行的程序。(去掉前面的返回)
//}

}

void main()
{
while(1)
{
  if(key1scan()) //每次按下按键只会执行一次,按键不放开绝对不会重复执行。
  {
    //自己的程序。
  }

if(key2scan()) //每次按下按键只会执行一次,按键不放开绝对不会重复执行。
  {
    num++;
if(num==20)//按一次按键 num加1.num可以作为switch程序的条件。
num=0;
  }

}

}

我今天吧这个代码移植到一个带按键的程序中。原来的按键按下不放开的时候,显示屏停止显示。因为有一句(while(!key1).现在换成这个按键不放,单片机没有任何影响!!

此代码也可以放到中断程序 执行





回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:488
  • 最近打卡:2025-05-02 07:02:30
已绑定手机

27

主题

693

回帖

1954

积分

金牌会员

打工人

积分
1954
发表于 2024-5-8 13:16:16 | 显示全部楼层
收藏
打工人
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-07-19 10:11:39

0

主题

10

回帖

46

积分

新手上路

积分
46
发表于 2024-7-10 10:48:55 | 显示全部楼层
{:5_332:}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2024-7-10 14:33:56 | 显示全部楼层
这个代码,有点意思~
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2025-02-15 01:13:47

2

主题

15

回帖

260

积分

中级会员

积分
260
发表于 2024-7-10 15:01:15 | 显示全部楼层
收藏
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2024-7-10 16:52:57 | 显示全部楼层
把  这个代码还有一个很好的功能。把功能加 和功能减的变量不设置成全局变量。在各自的函数中设置。然后将功能加和功能减函数放到中断程序中。中断程序没200毫秒检测一次。这个时候很奇妙的事情发生了。按住按键不放,则连续加  连续键  如果中断程序是200毫秒一次,那么一秒中连续增加五 ,非常可靠方便
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:365
  • 最近打卡:2025-05-02 00:20:03

6

主题

319

回帖

2206

积分

金牌会员

积分
2206
发表于 2024-7-10 19:02:40 | 显示全部楼层
按键抖动会是什么结果?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 09:02 , Processed in 0.140338 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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