微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 新型的按键扫描程序,仅三行代码

新型的按键扫描程序,仅三行代码

时间:12-01 来源:互联网 点击:

  1. unsigned char ReadData = PINB^0xff; // 1,读端口数据即端口字节值,异或运算(或->

    抖动,则进入按键处理程序。
    当然,不要跟我说你delay(20)那样去死循环去,真是那样的话,我衷心的建议你先放下手上所有的东西,好好的去了解一下操作系统的分时工作原理,大概知道思想就可以,不需要详细看原理,否则你永远逃不出“菜鸟”这个圈子。当然我也是菜鸟。我的意思是,真正的单片机入门,是从学会处理多任务开始的,这个也是学校程序跟公司程序的最大差别。当然,本文不是专门说这个的,所以也不献丑了。
    我的主程序架构是这样的:
    volatile unsigned char Intrcnt;
    void InterruptHandle() // 中断服务程序
    {
    Intrcnt++; // 1ms 中断1次,可变
    }
    void main(void)
    {
    SysInit();
    while(1) // 每20ms 执行一次大循环
    {
    KeyRead(); // 将每个子程序都扫描一遍
    KeyProc();
    Func1();
    Funt2();


    while(1)
    {
    if (Intrcnt>20) // 一直在等,直到20ms时间到
    {
    Intrcnt="0";
    break; // 返回主循环
    }
    }
    }
    }
    貌似扯远了,回到我们刚才的问题,也就是怎么做按键消抖处理。我们将读按键的程序放在了主循环,也就是说,每20ms我们会执行一次KeyRead()函数来得到新的Trg 和 Cont 值。好了,下面是我的消抖部分:很简单
    基本架构如上,我自己比较喜欢的,一直在用。当然,和这个配合,每个子程序必须执行时间不长,更加不能死循环,一般采用有限状态机的办法来实现,具体参考其它资料咯。
    懂得基本原理之后,至于怎么用就大家慢慢思考了,我想也难不到聪明的工程师们。例如还有一些处理,
    怎么判断按键释放?很简单,Trg 和Cont都为0 则肯定已经释放了。

    每当我看完这篇帖子,就感觉有所收获。学习就是要多交流,广开门路!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top