单片机学习(三)---独立按键和矩阵按键

一.按键的使用

1.原理图

如果K1按下,则P1.0=0,但是按键有抖动,需要消抖(软件消抖为主,也有硬件消抖)

如何消抖(软件),先检测(默认是高电平),一直等着低电平,

2.代码

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;

void DelayMS(uint x)
{
    uchar t;
    while(x--)
  {
    for(t=120;t>0;t--);
  }
}

void main()
{
    P0=0xff;
    P1=0xff;
    while(1)
    {
    LED1=K1; //直接把LED与按键相连,K1按下后为0,LED灯亮
    LED2=K2;//长按与点按的差别
    if(K3==0) //消抖
    {
    while(K3==0);//若K3=0,就一直在原地等待
    DelayMS(10);//等完后增加一段小延时
    LED 3=~LED3;//处理


}
    if(K4==0)
    {
        while(K4==0);
        DelayMS(10);//等完后增加一段小延时
        LED4=~LED4;

    }
    DelayMS(10);

}






二.矩阵按键

 0xf0 下面全是低电平,上面全是高电平

 所有IO公共端都设置为高电平,高四位进行设置,设置为高的,低四位看是否按下,若按下,对应的IO会被拉高,P0默认0x00,P1默认1111 0000 即0xf0

K0按下,则K0为高电平,读数为0xf1  即1111 0001

void DelayMS(uint ms)
{
    uchar t;
    while(ms--)
    {
        for(t=0;t<120,t++);
    }

}
void Keys_Scan() //看低位变成了什么值
{
    uchar Tmp;
    P1=0x0f;
    DelayMS(1);
    Tmp =P1^0x0f;
    switch(Tmp)
  {
   
  case 1:KeyNO =0;break;   //不正常的话,1的话,IO1,P1.0 1点亮
  case 2:KeyNO =1;break;
  case 4:KeyNO =2;break;
  case 8:KeyNO =3;break;
  default:KeyNO=16;
  }
}
void Beep()
{
    uchar i;
    for(i=0;i<100;i++)
    {
        DelayMS(1);
        BEEP = ~BEEP;
    }
    BEEP =1;
}
void main()
{
    P0=0X00;  //P0控制灯
    while(1)
  {
    P1=0xf0;  //初始化
    if(P1!=0xf0)//判断按键初始值是否正常,不正常进行按键扫描
        Keys_Scan();
    if(Pre_KeyNO!=KeyNO)
     {
        P0=~DSY_CODE[KeyNO];//写数码管的操作,按几显示几
        Beep(); //蜂鸣器  无源的,需要上下脉冲
        Pre_KeyNO =KeyNO;
     }

   DelayMS(100)

   }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值