前言
学习资料参考
课程资料:
【【小蜜蜂笔记】蓝桥杯大赛-单片机设计与开发基础技能与进阶强化教程】https://www.bilibili.com/video/BV1Bt41187hw?p=6&vd_source=e2191f89c557f5ac44bb6c7aa3967c7c
LED基本控制可以参考以下笔记:
https://blog.csdn.net/zicheng_G/article/details/142025188?fromshare=blogdetail&sharetype=blogdetail&sharerId=142025188&sharerefer=PC&sharesource=zicheng_G&sharefrom=from_link
本节训练重点
- 独立按键控制LED指示灯:按下S7点亮L1指示灯,松开熄灭。S6点亮L2指示灯,S5点亮L3指示灯,S4点亮L4指示灯,都是松开熄灭。按键均作去抖。
- 独立按键的拓展应用
独立按键
原理图
对独立按键经行控制,要先将J5的跳帽接到2~3引脚。
按键按下时,P30~P33中对应的引脚输出低电平。
编程思路
独立按键控制LED指示灯
/*头文件声明区域*/
#include <REGX52.H>
/*变量声明区域*/
sbit HC138_A0_A = P2^5;
sbit HC138_A1_B = P2^6;
sbit HC138_A2_C = P2^7;
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;
/*延时函数*/
void Delay(unsigned int xms) //@12.000MHz
{
while(xms--);
}
/*138译码器Y口选中情况*/
void HC138_NumberY(unsigned char x)
{
switch(x)
{
case 4:
{
HC138_A0_A=0;
HC138_A1_B=0;
HC138_A2_C=1;
break;
}
}
}
/*独立按键的基本控制*/
void Key_Scan()
{
if(S7==0)
{
Delay(100);//去抖
if(S7==0)
{
L1=0;
while(S7==0);
L1=1;
}
}
if(S6==0)
{
Delay(100);//去抖
if(S6==0)
{
L2=0;
while(S6==0);
L2=1;
}
}
if(S5==0)
{
Delay(100);//去抖
if(S5==0)
{
L3=0;
while(S5==0);
L3=1;
}
}
if(S4==0)
{
Delay(100);//去抖
if(S4==0)
{
L4=0;
while(S4==0);
L4=1;
}
}
}
/*主函数*/
void main()
{
HC138_NumberY(4);
while(1)
{
Key_Scan();
}
}
独立按键的拓展应用
按键S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3,S4控制L4,再次按下S7,L1指示灯熄灭,S6可响应操作。
按键S6点亮L2指示灯,L2点亮后,S7不响应操作,S5控制L5,S4控制L6,再次按下S6,L2指示灯熄灭,S6可响应操作。
S6和S7未按下时,即L1或L2未点亮时S5和S4不响应操作。
/*头文件声明区域*/
#include <REGX52.H>
/*变量声明区域*/
sbit HC138_A0_A = P2^5;
sbit HC138_A1_B = P2^6;
sbit HC138_A2_C = P2^7;
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;
unsigned char flag;//标记S6和S7是否按下
/*延时函数*/
void Delay(unsigned int xms) //@12.000MHz
{
while(xms--);
}
/*138译码器Y口选中情况*/
void HC138_NumberY(unsigned char x)
{
switch(x)
{
case 4:
{
HC138_A0_A=0;
HC138_A1_B=0;
HC138_A2_C=1;
break;
}
}
}
/*按键*/
void Key_Scan()
{
if(S7==0)
{
Delay(100);//去抖
if(S7==0)
{
if(flag==0)
{
L1=0;
flag=1;
}
else if(flag==1)
{
L1=1;
flag=0;
}
}
while(S7==0); //避免一次按下多次读取
}
if(S6==0)
{
Delay(100);//去抖
if(S6==0)
{
if(flag==0)
{
L2=0;
flag=2;
}
else if(flag==2)
{
L2=1;
flag=0;
}
}
while(S6==0); //避免一次按下多次读取
}
if(S5==0)
{
Delay(100);//去抖
if(S5==0)
{
if(flag==1) //S7按下状态,S5按下控制L3
{
L3=0;
while(S5==0);
L3=1;
}
else if(flag==2) //S7按下状态,S5按下控制L5
{
L5=0;
while(S5==0);
L5=1;
}
}
}
if(S4==0)
{
Delay(100);//去抖
if(S4==0)
{
if(flag==1) //S7按下状态,S4按下控制L4
{
L4=0;
while(S4==0);
L4=1;
}
else if(flag==2) //S6按下状态,S4按下控制L6
{
L6=0;
while(S4==0);
L6=1;
}
}
}
}
/*主函数*/
void main()
{
HC138_NumberY(4);
while(1)
{
Key_Scan();
}
}