一.独立按键
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); } } }