一.按键的使用
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)
}
}