找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1706|回复: 0
收起左侧

注释详细的单片机独立按键工作源程序,非延时,定时器4MS一个定时

[复制链接]
ID:548551 发表于 2020-7-14 17:45 | 显示全部楼层 |阅读模式
独立按键扫描模块,注意两个事项:1 中断定时4MS ,2 IO口初始化设置时对应的按键IO口设置为输入状态,并且打开内部上拉功能.

单片机源程序如下(有非常详细的代码注释):
void KEY_SCAN(void)
{
        if(!f_key_press)                                                //首先来读取标志位状态, 为0标志已经弹起状态了,我们要做的就是如何确定其按下
        {
                if(P_KEY){press_cnt=0;}                        //消抖过程,因为开了上拉,只要中途检测到IO口为高电平就清除之前的计数
                press_cnt++;                                        //读取到的电平不论是低还是高都++;上一行代码是读取到低就清零 所以不需担心读取到高会一直加
                if(press_cnt>=10)                                //低电平累加到10*4MS 即40ms的时候.表示按下已经稳定了
                {
                        press_cnt=0;                                //清零累加次数.不管任何时候,累加的次数到了以后第一时间清零
                        f_key_press=1;                                //按下的标志位置1 ,这个时候只是表示按下了.非一个完整的按下弹起过程
                        //用户可以根据需要添加功能 比如亮灯 比如转动马达等
                }
        }
        else                                                                //因为之前已经按下了f_key_press这个标志位已经置1了,现在我们要做的是如何确定弹起
        {
                if(!P_KEY){press_cnt=0;}                        //消抖过程,因为开了上拉,弹起IO口应该是读取到高电平,所以只要读取到低电平就清零之前的计数
                press_cnt++;                                        //高电平累加,原理同按下哪里一个原理
                if(press_cnt>=10)                                //高电平累加10*4MS即40ms的时候,表示弹起已经稳定了,接下来要做的是如何确定其弹起
                {                                                        //就是清零计数 清零标志位 让其下一次读取的电平的时候按照程序走
                        press_cnt=0;                                //清零累加次数.不管任何时候,累加的次数到了以后第一时间清零
                        f_key_press=0;                                //清零标志位,为下一次按下做准备
                        //用户可以根据需要添加功能,这里是弹起的时候添加功能,上面是按下的时候增加功能,
                }
        }
}

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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