先进行知识梳理:
位运算;
<<按位左移,>>按位右移,&按位与,| 按位或,^按位异或,~按位取反
例:按位左移就是将八位数每一位为向左移动一位,最高位去掉,最低为补0;
0110 1101<<1(按位左移一位) 变为 1101 1010
>>按位右移同理;
0110 1101>>2 (按位右移两位) 变为0001 1011
&按位与 每一位一次相比,与C语言中&&类似,一假即假;
0101 1101&0110 1110 结果为0100 1100
| 按位或 每一位依次相比 与C语言中||类似 一真即真;
0101 1101 | 0110 1110 结果为0111 1111
^按位异或 每一位一次相比,一样取0,不一样取1;
0101 1101^0110 1110 结果为0011 0011
~按位取反即每一位1变0,0变1
~0101 1101 结果为1010 0010
下面了解一下开关原理图
单片机上有四个按键为独立按键,它有四个接口,它的端口用P3表示,led用P2表示
当按键按下时可以表示为P3_1==0(第一个按键)
代码如下:
#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 main()
{
while(1)
{
if(P3_1==0)
{
Delay1ms(20); /*由于按键按下瞬间有反弹现象,时间为5-20ms单片机较为精确
此时运行生误所以用延时函数来消除反弹在进行正常运行*/
while(P3_1==0);
Delay1ms(20); //同理按键松手瞬间也有反弹现象
P2_0=~P2_0;
}
}
}
现象:当按一下开关后第一个LED灯亮,再次按下LED灯熄灭