登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 按键消抖

[复制链接]
发表于 2017-2-7 18:40:36 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 按键消抖
学习安排: 按键消抖
开始时间: 2017-02-06
结束时间: 2017-02-06
本帖最后由 骆海洋 于 2017-2-7 18:40 编辑
按键消抖
昨天学习了通过按键实现数码管加一的课程,但是由于按键在按下和弹起的过程中不能一次性实现所
以会产生咱波,进而影响功能的实现,今天就通过中断来实现消除按键抖动带来的影响。
按键消抖可以通过硬件和软件来实现。
l  硬件消抖,是通过电容的充放电的原理来实现的,就是用一个滤波电容来把影响按键的杂波去除(大电容滤低频小电容滤高频),通过给按键并联一个小电容来实现,但是硬件消抖的缺点比较明显:增加了电路成本和电路的复杂程度,所以通过软件消抖就是我们的首选。
图片1.png
软件消抖代码如下:
[mw_shl_code=c,true]#include <STC12C5A60S2.H>
/*声明部分*/
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;
sbit KEY4 = P2^3;
sbit KOUT4 =P2^7;

unsigned char Ledchar[] =  //数码管显示转换表
{
        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
bit keysta = 1; //定义一个全局变量,用来储存按键值

void main ()
{
        unsigned char cnt = 0;//定义一个计数变量
        bit i = 1;//保存前一次的按键值
        
        EA = 1;//打开总中断
        ENLED = 0;
        ADDR0 = 1;
        ADDR1 = 0;
        ADDR2 = 1;
        TMOD = 0X01;
        TH0 = 0XEB;//设置一个初值,定时两毫秒
        TL0 = 0X2B;
        ET0 = 1;//打开定时器0中断
        TR0 = 1;//打开定时器0
        KOUT4 = 0;
        P0 = Ledchar[cnt];
        while(1)
        {
                if(keysta != i) //判断本次按键值与上一次按键值是否相等,若不相等说明有按键动作,
                {                    //继续判断按键值。若相等进入中断消抖和扫描按键。
                        if(i == 0 ) //判断按键值如果是0说明按键按下,进入if语句,cnt自加。
                        {
                                cnt++;
                                if(cnt == 10)//数码管计数到9所以cnt加到10是清0
                                {
                                        cnt = 0;
                                }
                                P0 = Ledchar[cnt];
                        }
                        i = keysta; //保存按键值
                }
        }
}
/*中断服务函数*/
void InterruptTimer() interrupt 1
{
        static unsigned char keybuff = 0xff;//定义一个静态变量,用作扫描按键值
        
        TH0 = 0XEB;
        TL0 = 0X2B;
        keybuff = (keybuff << 1)|KEY4;//本句实现按键扫描,扫描8次
        /*用if语句实现判断按键值8位序列*/
        if(keybuff == 0x00) //如果扫描值为0x00说明按键按下,keysta赋值0
        {
                keysta = 0;
        }
        else if (0xff)//如果扫描值为0xff说明按键弹起,keysta赋值1
        {
                keysta = 1;
        }
}[/mw_shl_code]
在这一段的学习中自我感觉到只是看视频或者看书而不去写代码,在自己再次写的时候就会感觉到力不从心。所以要多写代码,养成独立的思考算法的习惯。

人生无根蒂,生如陌上尘。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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