登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 按键的简单应用和按键消抖

[复制链接]
发表于 2021-1-18 19:19:58 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 按键的简单应用和按键的消抖
开始时间: 2021-01-17
结束时间: 2021-01-17
  一个是用按键点亮LED,一个使用按键控制数码管。咱的开发板和金沙滩的不一样,按键可以使用的很少。这个是用按键控制LED:
#include <STC12C5A60S2.H>

sbit ENLED = P1^1;
sbit LED6 = P0^3;
sbit KEY4 = P2^3;

void main()
{
   ENLED = 0; //使能74HC245  
   P2 = 0x7E;//因为我们的板子按键和74HC138公用单片机的同一端口,所以这里可以直接使能,但能用的按键也变少了
   while(1)
   {
         LED6 = KEY4;//不按时为1,按下时为0,对应的LED点亮
   }
}
这个是用按键控制数码管
#include <STC12C5A60S2.H>

sbit ENLED = P1^1;
sbit KEY4 = P2^3;

unsigned char code LedChar[] = {
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};//用数组来储存数码管的真值表,

void main()
{

  bit backup = 1; //定义一个位变量,保存前一次扫描的按键值
  unsigned char cnt = 0;//定义一个计数变量,记录按键按下的次数
  ENLED = 0;//打开74HC245
  P2 =0x7D;//利用三八译码器打开最右边的三极管,因为共用缘故,所以只能用P23对应的按键
  P0 = LedChar[cnt];//显示按键初始值
  while (1)
  {
    if (KEY4!=backup) //当前值与前次值不相等则说明按键有动作
        {
           if(backup == 0) //如果前次值为0,则说明当前为从0变1,即按键弹起
           {
              cnt++;//按键次数加1
                  if(cnt>=10)
                  {
                    cnt = 0;//因为只用一个数码管,所以加到10就清0
                  }
                  P0 = LedChar[cnt];//计数值显示到数码管上
           }
           backup = KEY4;//更新备份为当前值,以便下次比较
        }
  }

}

这个是按键的消抖:
#include <STC12C5A60S2.H>

sbit ENLED = P1^1;
sbit KEY4 = P2^3;

unsigned char code LedChar[]={
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};//用数组来储存数码管的真值表,

bit KeySta = 1;        //当前按键状态

void main()
{
   unsigned char cnt = 0;//按键计数
   bit backup = 1;//按键值备份,保存前一次的扫描值

   ENLED = 0;//使能74HC245;
   EA = 1; //使能总中断
   TMOD = 0x01;//设置定时器为模式1
   TH0 = 0xEB;
   TL0 = 0x2B;//为定时器赋初始值,定时2毫秒
   TR0 = 1;//启动定时器
   ET0 = 1;//启动中断
   P2 = 0x7D;//利用三八译码器打开最右边的三极管,因为按键与三八译码器有冲突,所以只能用P23对应的按键
   P0 = LedChar[cnt];//显示按键次数初始值
   while(1)
   {
      if(KeySta!=backup)//如果当前值与前次值不相等则说明此时按键有动作
          {
             if(backup == 0)//如果前一次值为0,则说明当前是从0到1的弹起动作
                 {
                    cnt++;//按键次数加一
                        if(cnt>=10)
                        {
                          cnt = 0;
                        }//只用一个数码管,加到10之后清0,重新开始
                        P0 = LedChar[cnt];//计数值显示到数码管上
                 }
                 backup = KEY4;//更新备份为当前值,以备下次比较
          }
   }
}
void InterruptTimer0() interrupt 1//中断服务函数,用于按键的扫描与消抖
{
   static unsigned char keybuf = 0xFF;//扫描缓冲区,保存一段时间的扫描值
   TH0 = 0xEB;
   TL0 = 0x2B;//重新加载初值
   keybuf = (keybuf<<1)|KEY4;//缓存区左移一位,并将当前扫描值移入最低位
   if(keybuf == 0x00)
   {
      KeySta = 0;
   }                                                //连续8次的扫描值都是0,即16秒内都检验到按下状态时,可以认为按键已经按下
   else if(keybuf == 0xFF)
   {
     KeySta = 1;
   }                                                //连续8次的扫描值都是1,即16秒内都检验到弹起状态时,可以认为按键已经弹起
   else
   {}                                                //其他情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新
}






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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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