找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 931|回复: 2
收起左侧

很经典不占用资源的单片机按键检测程序

[复制链接]
ID:30165 发表于 2024-4-17 08:39 | 显示全部楼层 |阅读模式
不占用中断 不使用延时  没有死循环!!!不占用任何资源
这个按键检测程序我在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).现在换成这个按键不放,单片机没有任何影响!!

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

评分

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

查看全部评分

回复

使用道具 举报

ID:1001436 发表于 2024-4-17 16:30 | 显示全部楼层
原来大概就是靠现在MCU的高主频,狂刷按键状态,然后根据状态变化处理按键
回复

使用道具 举报

ID:385637 发表于 2024-4-18 17:53 | 显示全部楼层
按键不用防抖的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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