这节我们来实现独立按键的第三个功能,独立按键控制LED显示二进制
新创建一个工程文件,然后上来我们就要把基本框架写好,这是基本的习惯
老规矩,然后把Delay 1ms的代码复制过来
复制过来后改造一下:
把1ms删掉,然后给Delay函数传个参数unsigned int xms
把延时1ms的那段代码移到一个while(xms--)里面
Delay函数定义后之后,先写程序点亮测试一下
编译无错误下载程序,重启板子看看效果
点亮
延时500ms
灭掉
延时500ms
此时它正在以1秒为周期闪烁,证明程序写的没错
把测试程序的这段代码删掉
换成上一节的按键判断程序
这节主要讲解状态取反的新形式
上一节我们只是对P2的0口取反(P2_0=~P2_0)
那如果我们想要对P2的8个口都取反怎么办?
我们要引入一个变量,变量名为LEDnum,类型是unsigned char(因为char类型占1个字节,8个比特位,刚好等于寄存器的一组,寄存器以8个为一组)
我们可以先让LEDnum++然后再让它取反,赋值给P2的8个口
代码如下:
代码逻辑如下:
LEDnum原本是0,即0000 0000
第一次循环后:
LEDnum++;//0000 0001
~LEDnum;//1111 1110 (D1亮)
第二次循环后:
LEDnum++;//0000 0010
~LEDnum;//1111 1101 (D2亮)
第三次循环后:
LEDnum++;//0000 0011
~LEDnum;//1111 1100 (D1,D2亮)
第四次循环后:
LEDnum++;//0000 0100
~LEDnum;//1111 1011
第五次循环后:
LEDnum++;//0000 0101
~LEDnum;//1111 1010
第六次循环后:
LEDnum++;//0000 0110
~LEDnum;//1111 1001
第七次循环后:
LEDnum++;//0000 0111
~LEDnum;//1111 1000
第八次循环后:
LEDnum++;//0000 1000
~LEDnum;//1111 0111
第九次循环后:
LEDnum++;//0000 1001
~LEDnum;//1111 0110
第十次循环后:
LEDnum++;//0000 1010
~LEDnum;//1111 0101
第十一次循环后:
LEDnum++;//0000 1011
~LEDnum;//1111 0100
第十二次循环后:
LEDnum++;//0000 1100
~LEDnum;//1111 0011
第十三次循环后:
LEDnum++;//0000 1101
~LEDnum;//1111 0010
第十四次循环后:
LEDnum++;//0000 1110
~LEDnum;//1111 0001
第十五次循环后:
LEDnum++;//0000 1111
~LEDnum;//1111 0000
第十六次循环后:
LEDnum++;//0001 0000
~LEDnum;//1110 1111
第十七次循环后:
LEDnum++;//0001 0001
~LEDnum;//1110 1110
第十八次循环后:
LEDnum++;//0001 0010
~LEDnum;//1110 1101
......
第255次循环后:
LEDnum++;//1111 1111
~LEDnum;//0000 0000 (全灭)
完整代码如下
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)//后置--操作完之后给xms减1
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
unsigned char LEDnum=0;//0000 0000
while(1)
{
if(P3_1==0)
{
//按键判断
Delay(20);//按下要消抖
while(P3_1==0);//判断是否松手,松手变成==1
Delay(20);//松开要消抖
//状态取反
LEDnum++;//0000 0001
P2=~LEDnum;//1111 1110
}
}
编译无错误下载查看效果
按第一次,D1亮
按第二次,D2亮
按第二次,D1,D2亮
......
按第254次时才是全亮
按第255次时全灭
按256次之后开启第二轮循环
以上就是这节要实现的效果!