第三节 独立按键模块
目录
一、独立按键介绍
二、C语言知识
1.C51数据运算
2.C51基本语句
三、程序设计
1、独立按键控制LED灯
2、独立按键控制LED状态
3、独立按键控制LED显示二进制
4、独立按键控制LED位移
一、独立按键介绍
- 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
2、C51单片机的独立按键(左下角)
注意:
- 按键按下时低电平为0,没有按下时是高电平为1。
- K1接P3_1口,K2接P3_0口,顺序上是反过来的。
3、电路原理图
当按键K1按下时, K1为低电平。
3、按键消抖
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
如何解决按键抖动问题?
(1)、软件:使用延迟函数延长20ms。
(2)、硬件:加一个电路来消抖,成本高,不建议使用。
二、C语言知识
1.C51数据运算
(1)、算术运算
5 / 2 = 2 ; 5 % 2 = 1。
(2)、逻辑运算
&&:要所有条件为真才真,即一假全假。
|| : 有真则真。
!: 用于对单个命题的真值进行取反操作。
(3)、位运算
(一)按位左移(<<)
将一个数的各二进制位全部左移若干位,高位丢弃,低位补 0 。
例如,a = 0000 0010(十进制 2 ),a << 1 后变为 0000 0100(十进制 4 )。
(二)按位右移(>>)
运算规则:把一个数的各二进制位全部右移若干位,正数时,高位补 0;负数时,高位补 1 。
比如 a = 0000 0100,a >> 1 后变为0000 0010。
(三)按位与(&)
运算规则:两个相应的二进制位都为 1 时,结果位才为 1 ,否则为 0。即 0&0 = 0
,0&1 = 0
,1&0 = 0
,1&1 = 1
。
例如 a = 0000 0101
,b = 0000 0110
,a & b = 0000 0100
。
(四)按位或(|)
运算规则:两个相应的二进制位只要有一个为 1 ,结果位就为 1 。即 0|0 = 0
,0|1 = 1
,1|0 = 1
,1|1 = 1
。
例如 a = 0000 0101
,b = 0000 0110
,a | b = 0000 0111
。
(六)按位取反(~)
运算规则:对一个数的所有二进制位取反,即 0 变 1 ,1 变 0 。
例如 a = 0000 0101 ,~a = 1111 1010 。
2.C51基本语句
三、程序设计
1、独立按键控制LED灯
#include<regx52.h>
void main()
{while(1){if (P3_2==0){P2_0=0; //press the key and turn on the LED}else{P2_0=1;}}
2、独立按键控制LED状态
1、设计延迟函数
2、程序
#include<regx52.h>
void Delay(unsigned int xms) //@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main()
{while(1){// 判断K3按键是否按下if (P3_2==0){Delay(20); //按下前消抖while(P3_2==0); // 继续判断K3按键是否按下Delay(20); // 松开按键消抖P2_0 = ~P2_0;// 初始时,P2_0为高电平,取反后为低电平}}
}
3、独立按键控制LED显示二进制
#include<regx52.h>
void Delay(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;while(1){if (P3_2==0){Delay(20); while(P3_2==0); Delay(20); LEDNum++;P2 = ~LEDNum;}}
}
代码讲解:
LEDNum=0
时,P2=0xFF
,所有 LED 灭(显示二进制11111111
)LEDNum=1
时,P2=0xFE
,仅 D1 亮(显示二进制11111110
)LEDNum=2
时,P2=0xFD
,仅 D2 亮(显示二进制11111101
)- 依此类推,直到
LEDNum=255
时,P2=0x00
,所有 LED 亮(显示二进制00000000
)
4、独立按键控制LED位移
#include<regx52.h>
void Delay(unsigned int xms) //@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}unsigned char LEDNum;
void main()
{P2 = ~0x01;while(1){// ÅжÏK3°´¼üÊÇ·ñ°´ÏÂif (P3_2==0){Delay(20); while(P3_2==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);}}}