1.实现原理
先观察电路图和实物图
我们知道要想控制独立按键的话首先要先使J5跳帽连接到2和3
当按键被按下时,对应I/O口的电平信号应该是和GND一样,也就是0(低电平)我们可以通过检测I/O口的电平信号来知道按键是否被按下。
例:
当S4被按下时,P3.3被置为低电平,此时读取P3.3口的电平信号即可知道按键的状态
2.代码实现
#include "reg52.h"
sbit S7 = P3^0; //定义按键对应的I/O口
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
sbit L1 = P0^0; //定义LED灯对应的I/O口
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
void Delay(unsigned char t) //延时程序
{
while(t--)
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
}
void HC138Init(unsigned char n) //138译码器选通函数
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;//让Y4输出低电平,此时Y4C为高电平
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;//让Y5输出低电平,此时Y5C为高电平
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;//让Y6输出低电平,此时Y6C为高电平
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;//让Y7输出低电平,此时Y7C为高电平
break;
}
}
void keyscan_alone() //独立键盘扫描函数
{
if(S4 == 0) //当S4被按下时
{
Delay(20); //延时20ms防抖
while(S4 == 0); //当手未松开时卡在循环里,当松手时向下执行
Delay(20); //延迟20ms防抖
L1 = ~L1; //LED1状态取反
}
if(S5 == 0) //道理同上
{
Delay(20);
while(S5 == 0);
Delay(20);
L2 = ~L2;
}
if(S6 == 0)
{
Delay(20);
while(S6 == 0);
Delay(20);
L3 = ~L3;
}
if(S7 == 0)
{
Delay(20);
while(S7 == 0);
Delay(20);
L4 = ~L4;
}
}
void main()
{
HC138Init(4); //先选通38译码器的4通道,不然无法控制LED灯
while(1)
{
keyscan_alone(); //调用函数扫描
}
}
本小节大家可能会觉得较为简单,但后续有时间会写一篇拓展应用。