单片机学习——独立按键基础(自用)
原理:
轻触按键,相当于一种电子开关,按下使开关接通,松开时开关断开,K1、K2、K3、K4公共端接GND,另一端分别接单片机I/O口的P3^0到P3^3,因为单片机4组I/O口P0—P3都是高电平有效,当按键按下时,将I/O口拉到低电平使按键有效。
按键抖动:
一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动,单片机会检测出来。
按键消抖:
(1)硬件消抖: 加一个电路,将总电路经过触发器之类的操作进行电路过滤。
(2)软件消抖: 检测按键按下时,延时时间,再继续操作,松手也同样道理。
软件部分:
#include "reg52.h"
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3; //定义按键IO端口
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5; //定义LED灯IO端口
void selectHC573(unsigned char n)
{
switch(n)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
}
}
void delayk(unsigned char t)
{
while(t--);
}
void Scankeys_alone() //扫描独立按键
{
if(S7==0) //判断是否按下S7
{
delayk(100);
if(S7==0) //延时消抖后S7依然处于低电平,则确定按下
{
L1=0;
while(S7==0); //判断S7是否依然工作(神来之笔!)
L1=1; //关灯,完成检测
}
}
if(S6==0)
{
delayk(100);
if(S6==0)
{
L2=0;
while(S7==0);
L2=1;
}
}
if(S5==0)
{
delayk(100);
if(S5==0)
{
L3=0;
while(S5==0);
L3=1;
}
}
if(S4==0)
{
delayk(100);
if(S4==0)
{
L4=0;
while(S4==0);
L4=1;
}
}
}
void main()
{
selectHC573(4);//选择锁存器处于打开状态
while(1)
{
Scankeys_alone();//不断扫描是否有按键按下
}
}

