首先先看一下我的板子,如果我们板子不相同,可能操作也不太相同
我们就不讲底层原理了,直接看,我们可以看到板子上有 8个LED灯
那这个8个LED用什么来控制呢,我们先看底层的线路图,所有的LEDD都连接到了P2带后缀的接口上,那么只需要操作这几个接口的高低电频,就可以让他亮起来,0是亮1是不亮
而这几个接口对应着二进制数字,比如我输入11111110,注意这里是8位数字,对应着板子上的8个灯,只有最后一位是0,那么就只有最后一位会亮,但是板子他不识别2进制代码,我们要转换为16进制代码
例如就刚刚的11111110,转换为2进制就是FE,因为F是1111,E是1110,两个加起来就对了
上代码
#include <REGX52.H>
void main(){
//我是重复执行
while(1){
//我是注释,0x代表他是16进制
P2=0xFE;
}
}
结果:
接下来我们需要用按键来控制,那其实按键也是靠正低电平来区分
按键模块
我们可以看见按键模块是连接在p3.多少的位置,那如果你要控制p31的按键那么就要去找p3.1,要控制p32的按键,就要去找p3.2
那接下来我们来控制灯光,我们还要一种新的办法来控制灯,不用一直写二进制来找灯的位置,而是通过选中某个灯来决定,还是这张图,例如我们要控制p20的灯,那么就去单片机核心去找他连接的位置,我们可以看见p20连接的是p2.0,那么我们就可以对他进行控制
上代码:
这段代码很简单,就是按下的时候就亮,不按就不亮。
#include <REGX52.H>
void main(){
while(1){
//判断是否被按下,按下是0,不按是1
if (P3_1==0){
//如果按下就让他亮
P2_0=0;
}else{//否则,就等于是1,就不亮
P2_0=1;
}
}
}
接下来我们要通过按键来控制,例如按下一次我们依次让灯亮起来,那其实按照我们之前给他设定二进制的值的时候,他的数值就是,11111110,11111101,这样依次往前变化,他就能实现了,关键我们要怎么去处理这件事情
>>> int('00000001',2)
1
>>> int('00000010',2)
2
>>> int('00000100',2)
SyntaxError: unexpected indent
>>> int('00000100',2)
4
>>> int('00001000',2)
8
>>> int('00010000',2)
16
可以看到这个代码,2进制的数字是不是也每次向前动了一位,不过动的是1,但是1是不亮啊,0才是亮,所以最后我们可以对他们进行取反,0取反就是1,所以00000001,取反就是11111110,那么就可以完成了,再看他们的十进制数字的规律,每次都是乘以2,那么我们是不是可以用十进制的数字来解决这道题,(这里会有些绕,需要大家理解,或者直接看代码)
#include <REGX52.H>
#include <stdio.h>
void Delay1ms(unsigned int xms) //这是一个延时器,不用管他,每次调用延时
{
unsigned char i, j;
while(xms){
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main(){
unsigned char LEDNum=1;//设置一个变量
{
while(1){
//判断是否按下
if (P3_1==0){
//延时2o毫秒
Delay1ms(20);
while(P3_1==0);
Delay1ms(20);
//重要看这里,我们将值取反
P2=~LEDNum;
//然后每次乘以2
LEDNum=LEDNum*2;
}
}
}
}
这样我们每次按下按键就会依次点亮