独立按键控制
-
独立按键
按下的时候金属片接触,开关接通。按下的时候IO口变为低电平,断开的时候是高电平 0代表按下,1代表松开
因为按键开关直接与MCU连接默认是高电平,寄存器去读这个IO口的时候,如果IO口是断开的话读到的还是本身的高电平
REGX52.H头文件中声明了单独的 LED 接口,比如 P2_1,对他们操作可以直接控制单个 LED 接口
#include <REGX52.H>
P2 = 0xFE
P2_0 = 0 //这两行代码效果完全一样
而这种单独的接口还可以读取 IO 口的数据,可以用这些接口来获取按键的接通情况 0代表按下,1代表松开
#include <REGX52.H>
void main(void){
while(1){
if(P3_1 == 0){ //假如按键 1 被接通
P2_0 = 0; //就点亮 LED
}
else{ //假如按键 1 没有被接通
P2_0 = 1;
}
}
}
-
单片机中的位运算
位运算符 意义 << 按位左移 >> 按位右移 & 按位与 | 按位或 ^ 按位异或 ~ 按位非 异或:相同为 0 ,不同为 1
实例:
0011 1100 << 1 -> 0111 1000 按位左移
0011 1100 >> 1 -> 0001 1110 按位右移
0011 1000 & 0011 1010 -> 0011 1000 按位与
0011 1000 | 0011 1011 -> 0011 1011 按位或
0011 1000 ^ 0011 1010 -> 0000 0110 按位异或
~0011 -> 1100 按位取反
-
按键的抖动
由于机械触点的弹性作用,按键在闭合时会伴随着一连串的抖动,可能会导致误操作
抖动的消除:硬件处理,软件处理(先延时 20ms 等待抖动稳定再执行判断)
同时在按键检测中需要检测松手
void main(void) { while(1) { if(P3_1 == 0) { Delay(20); //消除按下时的抖动 while(P3_1 == 0); //检测松手(直到松手时才进行下一步操作) Delay(20); //消除松开时的抖动 } } }
-
通过独立按键实现二进制加减
void main() { unsigned int LEDnum = 0; //八位存储空间正好用来放一个寄存器的数据 while(1) { if(P3_1 == 0) { Delay(20); while(P3_1 == 0); //消除抖动 Delay(20); LEDnum ++; //每按一次就二进制加一 P2 = LEDnum; //把加一后的二进制数赋值给 P2 } } }
-
使用独立按键控制LED移位
#include <REGX52.H> void Delay(int xms); //@12.000MHz void main(void) { there: while(1) //当按下第一个按键时,灯从全灭变成第一个亮,也就是 P2 从 1111 1111 变成 1111 1110 { if(P3_1 == 0) { Delay(20); while(P3_1 == 0); Delay(20); P2_0 = 0; break; } } while(1) { if(P3_1 == 0) { Delay(20); while(P3_1 == 0); Delay(20); P2 = P2 * 2 + 1; //按下非第一个按键时,就把 P2 乘2再加一,使得 P2 中的0位向左移动一位 } if(P2 == 0xFF) goto there; //假如灯又全没了就回到开始的地方 } } void Delay(int xms) //@12.000MHz { unsigned char i, j; while(xms) { i = 2; j = 239; do { while (--j); } while (--i); xms--; } }
或者直接使用左移位运算( 更加优雅,省去了 goto )
void main(void) { unsigned char LEDnum = 0; while(1) { if(P3_1 == 0) { Delay(20); while(P3_1 == 0); Delay(20); LEDnum++; if(LEDnum>=8) LEDnum = 0; P2 = ~(0x01<<LEDnum); } /* if(P3_0 == 0) //同理,稍加修改可使得按下第二个按键时候灯发生左移 { Delay(20); while(P3_0 == 0); Delay(20); if(LEDnum == 0) LEDnum = 7; else LEDnum--; P2 = ~(0x01<<LEDnum); } */ } }
注意:在STC89C52RC中,独立按键第一个和第二个是反的,所以P3_1代表第一个,P3_0代表第二个
IO接口 代表按键 P3_1 第一个 P3_0 第二个 P3_2 第三个 P3_3 第四个