一、简介
独立按键是直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键电路配置灵活,软件结构简单。
独立键盘理想的波形是按下去时保持低电平,实际上在上升沿和下降沿的过程中(即按键和离键时的一段微小时间)会出现抖动。消抖的方法有两种,一种是通过硬件:在电路上连个电容;另一种是软件消抖,根据经验增加10ms的延时。
二、图解
在CT107D单片机综合训练平台上,首先将J5处的跳帽接到 2~3引脚,使
按键S4~S7四个按键的另外一端接地从而成为4个独立键盘。在扫描按键的过程中,发现有按键触发信号后,先做去抖动处理,当确认为按键按下时,才进行相应的功能处理。
三、独立按键控制LED实验
硬件说明: IAP15F2K61S2
实验目标: 在CT107D单片机综合训练平台上,通过独立按键实现对LED灯闪烁的控制。
实验要求:按键S7和S6为选择键,确定控制键控制那组LED指示灯。按键S5和S4为控制键,按键该键点亮指定的LED指示灯,松开后熄灭。
按下S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3, S4控制
L4,再次按下S7, L1指示灯熄灭,S6可可响应操作。
按下S6点亮L2指示灯,L2点亮后,S7不响应操作,S5控制L5,S4控制
L6,再次按下S6,L2指示灯熄灭,S7可可响应操作。
程序代码:
#include "reg52.h"
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;/*独立按键*/
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灯*/
void SelectHC573(unsigned char channel)/*74HC573锁存器*/
{
switch(channel)
{
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--);
}
unsigned char stat_k = 0; /*模式标志位*/
void ScanKeys_Alone()/*按键扫描*/
{
if(S7 == 0)
{
DelayK(100);
if(S7 == 0)
{
if(stat_k == 0)
{
L1 = 0;
stat_k = 1;
}
else if(stat_k == 1)
{
L1 = 1;
stat_k = 0;
}
while(S7 == 0);
}
}
if(S6 == 0)
{
DelayK(100);
if(S6 == 0)
{
if(stat_k == 0)
{
L2 = 0;
stat_k = 2;
}
else if(stat_k == 2)
{
L2 = 1;
stat_k = 0;
}
while(S6 == 0);
}
}
if(S5 == 0)
{
DelayK(100);
if(S5 == 0)
{
if(stat_k == 1)
{
L3 = 0;
while(S5 == 0);
L3 = 1;
}
else if(stat_k == 2)
{
L5 = 0;
while(S5 == 0);
L5 = 1;
}
}
}
if(S4 == 0)
{
DelayK(100);
if(S4 == 0)
{
if(stat_k == 1)
{
L4 = 0;
while(S4 == 0);
L4 = 1;
}
else if(stat_k == 2)
{
L6 = 0;
while(S4 == 0);
L6 = 1;
}
}
}
}
void main()
{
SelectHC573(4);
while(1)
{
ScanKeys_Alone();
}
}