登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习笔记] 按键消抖

[复制链接]
发表于 2022-1-28 13:48:37 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 单片机
开始时间: 2022-01-27
结束时间: 2022-01-28
  用按键控制数码管,每按下一次按键,数码管加一,按键如果不消抖,就会造成一次加两个数字甚至更多,会造成数码管的叠加;
  以下有消抖和不消抖的代码;
一:不消抖:
#include <reg52.h>


sbit ADDR2 = P2^2;
sbit ADDR1 = P2^1;
sbit ADDR0 = P2^0;
sbit ENLED = P1^1;


sbit KOUT4 = P2^7;


sbit KEY4 = P2^3;


//sbit LED5 = P0^4;
//sbit LED6 = P0^5;
//sbit LED7 = P0^6;
//sbit LED8 = P0^7;






   unsigned char ledchar[]={
      0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
      0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
   unsigned char cnt = 0;
unsigned char  i = 0;
  bit backup = 1;
  bit keybuff = 1;
void main()
{
  ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 0;
  ENLED = 0;
        KOUT4 = 0;
        KEY4 = 1;
        P0 = ledchar[cnt];
while(1)
{   
   if(backup != KEY4)
         {
                 if(backup == 0)
                 {
                         cnt++;
                         P0 = ledchar[cnt];
                         if(cnt>=10)
                         {
                                 cnt=0;
                   }
           }
           backup = KEY4;
   }
}
}


二:消抖代码

#include <reg52.h>

sbit ADDR2 = P2^2;
sbit ADDR1 = P2^1;
sbit ADDR0 = P2^0;
sbit ENLED = P1^1;

sbit KOUT4 = P2^7;

sbit KEY4 = P2^3;

//sbit LED5 = P0^4;
//sbit LED6 = P0^5;
//sbit LED7 = P0^6;
//sbit LED8 = P0^7;



   unsigned char ledchar[]={
      0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
      0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
   unsigned char cnt = 0;
unsigned char  i = 0;
  void delay();
  bit backup = 1;
  bit keybuff = 1;
void main()
{
  ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 0;
  ENLED = 0;
        KOUT4 = 0;
        KEY4 = 1;
        P0 = ledchar[cnt];
while(1)
{
        keybuff = KEY4;
        if(keybuff != backup)
        {
                delay();
                if(keybuff == KEY4)
                {
                if(backup == 0)
                 {
                  cnt++;
                         if(cnt>=10)
                          {
                          cnt = 0;
                          }
                        P0 = ledchar[cnt];
                  }
            backup = keybuff;
          }
  }
}
}


void delay()
{
        unsigned int i =0;
         i = 1000;
  while(i--);
}
消抖的时候就是用延时 可以把void delay这个

直接换成for延时 可以达到同样的效果
for(i=0;i<=100;i++);




好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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