蓝桥杯之单片机学习(五)——独立按键的基本操作与扩展应用
一、训练任务
任务一
独立按键的基本操作
1.1 任务描述
在CT107D单片机综合训练平台上,首先将J5处的跳帽接到2-3引脚,使按键S4-S7四个按键的另外一端接地从而成为4个独立键盘。在扫描按键的过程中,发现有按键触发信号后,先做去抖动处理,当确认为按键按下时,才进行相应的功能处理。
1.2 基本操作
按下S7,点亮L1,松开按键熄灭;
按下S6,点亮L2,松开按键熄灭;
按下S5,点亮L3,松开按键熄灭;
按下S4,点亮L4,松开按键熄灭;
按键均做去抖
任务二
独立按键的扩展应用
1.1 任务描述
按键S7和S6为选择键,确定控制键控制那组LED指示灯。按键S5和S4为控制键,按键该键点亮指定的LED指示灯,松开后熄灭。
1.2 基本操作
按下S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3, S4控制L4,再次按下S7, L1指示灯熄灭,S6可可响应操作。
按下S6点亮E2指示灯,L2点亮后,S7不响应操作,S5控制L5, S4控制L6,再次按下S6, L2指示灯熄灭,S7可可响应操作。
S7和S6未按下时,即L1或L 2未点亮时S5和S4不响应操作,也就是未作LED灯区域选择时,控制键不能操作。
二、原理图
当你没有按下时,I/O口是高电平,当你按下时,接地,I/O口是低电平
眺帽接到BTN
三、代码展示
3.1 任务一代码
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
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;
//配置HC138
void SelectHC138(uchar channel)
{
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 Initsys()
{
SelectHC138(5);
P0 = 0X00;//关闭蜂鸣器和继电器
SelectHC138(4);
P0 = 0XFF;//关闭LED
}
void DelayK(uint n)
{
while(n--);
}
//配置独立按键
void ScanKeys_Alone()
{
if(S7 == 0)
{
DelayK(100); //去抖
if(S7 == 0)
{
L1 = 0;
while(S7 == 0);
L1 = 1;
}
}
if(S6 == 0)
{
DelayK(100); //去抖
if(S6 == 0)
{
L2 = 0;
while(S6 == 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()
{
Initsys();
while(1)
{
SelectHC138(4);
ScanKeys_Alone();
}
}
3.2 任务二代码
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
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;
//配置HC138
void SelectHC138(uchar channel)
{
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 Initsys()
{
SelectHC138(5);
P0 = 0X00;//关闭蜂鸣器和继电器
SelectHC138(4);
P0 = 0XFF;//关闭LED
}
void DelayK(uint n)
{
while(n--);
}
//状态变量
uchar 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(L3 == 0);
L3 = 1;
}
else if(stat_K == 2)
{
L4 = 0;
while(L4 == 0);
L4 = 1;
}
}
}
if(S4 == 0)
{
DelayK(100); //去抖
if(S4 == 0)
{
if(stat_K == 1)
{
L5 = 0;
while(L5 == 0);
L5 = 1;
}
else if(stat_K == 2)
{
L6 = 0;
while(L6 == 0);
L6 = 1;
}
}
}
}
void main()
{
Initsys();
while(1)
{
SelectHC138(4);
ScanKeys_Alone();
}
}
注意事项
独立按键不需要配置HC138译码器
主函数里,初始化系统写在while(1)外面
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)