一.独立按键

    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); } } }

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信