【51单片机入门:独立按键控制LED亮灭】
一.独立按键
1.特点:同侧导通,异侧断开
2.独立按键的I/O口
单片机上电后,所有I/O口默认都是高电平。没有按开关时都是高电平,按下后变成低电平。
寄存器通过检测高低电平检测按键是否被按下
1)由下原理图可知,独立按键 K1 = P3_0 K2 = P3_1 K3 = P3_2 K4 = P3_3
二.LED
1. 16进制表示
点亮第1个LED P2 = 0xFE; //1111 1110
点亮第2个LED P2 = 0xFD; //1111 1101
点亮第3个LED P2 = 0xFB; //1111 1011
点亮第4个LED P2 = 0xF7; //1111 0111
点亮第5个LED P2 = 0xEF; //1110 1111
点亮第6个LED P2 = 0xDF; //1101 1111
点亮第7个LED P2 = 0xBF; //1011 1111
点亮第8个LED P2 = 0x7F; //0111 1111
2.I/O口表示
点亮第1个LED P2_0=0; 熄灭第1个LED P2_0=1;
点亮第2个LED P2_1=0; 熄灭第2个LED P2_1=1;
点亮第3个LED P2_2=0; 熄灭第2个LED P2_2=1;
后面的LED以此类推
三.按键的抖动
为了除去抖动造成的影响,可以在按键抖动期间使用延时函数,从而避开抖动时间
while(1){
if(P3_1==0)
{
//除去抖动
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
//LED亮暗取反
P2_0 = ~P2_0;
}
}
四.实例应用
1.实现除去抖动、按下按键后改变灯的暗亮的功能
功能:按一次,LED变亮,再按一次,LED变暗,再按一次,LED变亮,以此类推。
if(P3_1==0) //按键按一次
{
P2_0 = ~P2_0; //LED电平取反一次
}
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms --;
}
}
void mian()
{
while(1){
if(P3_1==0)
{
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
P2_0 = ~P2_0;
}
}
}
2.独立按键控制LED显示二进制
功能:按一次开关,二进制计数+1
unsigned char LEDNum=0; //0000 0000
while(1)
{
if(P3_1==0)
{
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
LEDNum++; //0000 0001
P2=~LEDNum; //1111 1110(取反)
}
}
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms --;
}
}
void main()
{
unsigned char LEDNum=0; //0000 0000
while(1)
{
if(P3_1==0)
{
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
LEDNum++; //0000 0001
P2=~LEDNum; //1111 1110(取反)
}
}
}
3.独立按键控制LED位移(按键版流水灯)
功能:每按一次开关,LED灯移动一次。
按位左移<<
按位左移的代码实现
unsigned char LEDNum = 0 ;
while(1)
{
if(P3_1==0)
{
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum); //“<<”按位左移
}
}
#include <REGX52.H>
void Delay1ms(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms --;
}
}
void mian()
{
unsigned char LEDNum = 0 ;
while(1)
{
if(P3_1==0)
{
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);
}
}
}