找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6367|回复: 6
收起左侧

三行代码的C语言按键扫描程序详解

  [复制链接]
ID:586511 发表于 2019-7-18 17:43 | 显示全部楼层 |阅读模式
uchar cont,trg;    //triger触发 continue连续
void KeyScan()
{
     uchar ReadData = P3^0xff;
  trg = ReadData&(ReadData^cont);
  cont = ReadData;
}

1)       没有按键的时候
端口为0xff,ReadData读端口并且取反,很显然,就是 0x00 了。
Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。
Cont = ReadData; 保存Cont 其实就是等于ReadData,为0;
结果就是:
ReadData = 0;
Trg = 0;
Cont = 0;
(2)       第一次PB0按下的情况
端口数据为0xfe,ReadData读端口并且取反,很显然,就是 0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。那么这个式子的值也不难算,也就是 Trg = 0x01 & (0x01^0x00) = 0x01
Cont = ReadData = 0x01;
结果就是:
ReadData = 0x01;
Trg = 0x01;Trg只会在这个时候对应位的值为1,其它时候都为0
Cont = 0x01;
(3)       PB0按着不松(长按键)的情况
端口数据为0xfe,ReadData读端口并且取反是 0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是连续按下,所以Cont是上次的值,应为为0x01。那么这个式子就变成了 Trg = 0x01 & (0x01^0x01) = 0x00
Cont = ReadData = 0x01;
结果就是:
ReadData = 0x01;
Trg = 0x00;
Cont = 0x01;
因为现在按键是长按着,所以MCU会每个一定时间(20ms左右)不断的执行这个函数,那么下次执行的时候情况会是怎么样的呢?
ReadData = 0x01;这个不会变,因为按键没有松开
Trg = ReadData & (ReadData ^ Cont) = 0x01 & (0x01 ^ 0x01) = 0 ,只要按键没有松开,这个Trg值永远为 0 !!!
Cont = 0x01;只要按键没有松开,这个值永远是0x01!!
(4)       按键松开的情况
端口数据为0xff,ReadData读端口并且取反是 0x00 了。
Trg = ReadData & (ReadData ^ Cont) = 0x00 & (0x00^0x01) = 0x00
Cont = ReadData = 0x00;
结果就是:
ReadData = 0x00;
Trg = 0x00;
Cont = 0x00;
很显然,这个回到了初始状态,也就是没有按键按下的状态。



评分

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

查看全部评分

回复

使用道具 举报

ID:66287 发表于 2019-7-19 09:10 | 显示全部楼层
    我这有个简化处理版,原理一样,短小精悍。
     ReadData = ~ReadData;      // 1
    Trg  = ReadData & ~Cont;   // 2 注“~”优先级高于& ;ReadData为本次键状态,Cont为上次键状态
    Cont = ReadData;               // 3
    很好用的啊!
回复

使用道具 举报

ID:156220 发表于 2019-7-19 09:10 | 显示全部楼层
讲解的很详细
回复

使用道具 举报

ID:427492 发表于 2019-7-19 12:13 | 显示全部楼层
这个能通过某一个按键按一次给一个变量只加一次1,长按可以连续加吗
回复

使用道具 举报

ID:384252 发表于 2019-7-22 21:13 来自手机 | 显示全部楼层
这个确实不错,很解析得也很详细
回复

使用道具 举报

ID:370231 发表于 2019-9-25 09:36 | 显示全部楼层
每天进步一点点,学习了
回复

使用道具 举报

ID:146089 发表于 2019-9-25 15:41 | 显示全部楼层
转载需要注明,否则就是偷盗!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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