#include<reg52.h>
sbit S7 = P3^0; //独立按键
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
sbit L1 = P0^0; //LED
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
sbit L6 = P0^5;
unsigned char state = 0; //状态位,0表示没有按键被按下
void Delay_keys() //延时函数:10ms,去抖动处理
{
unsigned char i = 108,j = 145;
do
{
while(--j);
} while(--i);
}
void Select_HC138(unsigned char n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
}
}
void Scan_keys()
{
if(S7 == 0)
{
Delay_keys();
if(S7 == 0)
{
if(state == 0)
{
L1 = 0; //点亮L1
state = 1; //1表示S7被按下
}
else if(state == 1) //再次按下S
{
L1 = 1; //关闭L1
state = 0;
}
}
while(S7 == 0); //防止闪烁
}
if(S6 == 0)
{
Delay_keys();
if(S6 == 0)
{
if(state == 0)
{
L2 = 0;
state = 2; //2表示S6被按下
}
else if(state == 2) //再次按下S6
{
L2 = 1;
state = 0;
}
}
while(S6 == 0);
}
if(S5 == 0)
{
Delay_keys();
if(S5 == 0)
{
if(state == 1) //S7被按下时
{
L3 = 0; //按下S5点亮L3
while(S5 == 0); //松开熄灭
L3 = 1;
}
else if(state == 2) //S6被按下时
{
L5 = 0; //按下S5点亮L5
while(S5 == 0); //松开熄灭
L5 = 1;
}
}
while(S5 == 0);
}
if(S4 == 0)
{
Delay_keys();
if(S4 == 0)
{
if(state == 1) //S7被按下时
{
L4 = 0; //按下S4点亮L4
while(S4 == 0); //松开熄灭
L4 = 1;
}
else if(state == 2) //S6被按下时
{
L6 = 0; //按下S4点亮L6
while(S4 == 0); //松开熄灭
L6 = 1;
}
}
while(S4 == 0);
}
}
void main()
{
Select_HC138(5);
P0 = 0x00; //关闭蜂鸣器和继电器
Select_HC138(4);
P0 = 0xff;
while(1)
{
Scan_keys();
}
}
蓝桥杯单片机CT107D_05_独立按键的应用
最新推荐文章于 2022-01-27 17:15:19 发布