通过前面我们都知道点亮我们的不管是点阵,数码管,还是LED灯,不仅要熟悉我们的代码还要会看我们的原理图和真值表,所以我们如果真的要写代码倒是其次的,首先我们得学会看我们的原理图和真值表,但是认识那个我们可以在网上找教程的,所以啊我这里就不去重诉别人的话了。那么我们今天要讨论什么问题勒!?我们今天讲一下点阵吧,点阵说实话对于单片机来说虽然并不是最重要的,但是点阵却是我们单片机中花样最多的之一。可能说到这么有人会说了,学了单片机我们有什么用呢,那么我们可以留意一下我们身边的一些物品,比如我们常在街上可以看见一些商店利用那些LED灯做出的花样,什么闪烁啊,各种图形变化啊,其实和我们的点阵原理都很像,不过他们那些控制的位更多,而我们51 单片机操作的位少一些,只有八位而已。但是我们其实把他的原理弄懂了我们学其他的或者操作更多的位也是很容易的。
我们其实刚开始我们学习51单片机上面的点阵可能会疑惑,我们照着老师的代码敲我们可以点亮他说的灯,但是我们通过原理图来点亮我们的灯却不是那么容易,为什么呢?或许我们细心的同学会发现我们要点亮的灯和我们的代码所写不一样,不一样在什么地方呢?每一排的位操作挺好像是相反的。那么前面的疑惑我们就解决了,我们要操作的点阵和我们的代码点亮是相反的!在我们的51单片机中我们0称做低电平,而1被叫做高电平,低电平是将灯点亮,高电平不亮。我们正对单片机如果我们要点阵第一个灯,那么我们我们要写的代码是P0=0x01;而转换成二进制就是0000 0001(这里我们可以在网上去看2进制和16进制相互转换的一些资料)我们可以知道的是他和我们设想的有些差别,比如我们就是要点亮第一排第一个灯,输入了P0=0x01我们却看见和我们的二进制数不符合,就像我们的灯一样每个灯就是我们的一个位,每个灯有两种状态,一个是1,另一个就是0。实际上我们就可以得出结论操作我们的灯就是操作我们的二进制。那么可以看一下我们的代码,来验证我们的猜想:
/*点亮我们的点阵第一排第一个灯*/
#include
sbit ADDR0=P0^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//延时函数
delay(unsigned int x)
{
while(x--);
}
//
dz(unsigned int d,c,b,a)
{
ENLED=1;
ADDR3=d;
ADDR2=c;
ADDR1=b;
ADDR0=a;
}
void main()
{
P0=0x01;
dz(0,0,0,1);
delay(300);//延时函数的调用
}
其实我们的点阵的灯就是操作我们的一个八位数的位,每个灯就是一位,因为我们点阵就是一排八个灯(这个一定得记住)那么我们知道了点亮我们的点阵第一排第一个,我们可不可以点亮我们的点阵第一排呢?!代码如下:
/*点亮我们的点阵第一排灯*/
#include
sbit ADDR0=P0^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//延时函数
delay(unsigned int x)
{
while(x--);
}
//
dz(unsigned int d,c,b,a)
{
ENLED=1;
ADDR3=d;
ADDR2=c;
ADDR1=b;
ADDR0=a;
}
void main()
{
P0=0x00;
dz(0,0,0,1);
delay(300);//延时函数的调用
}
其实代码都差不多,就是我们怎么用了,那么思考我们想多点几排呢?比如我们就要“同时”点亮两排三排或者更多呢?记住我们 一定得看真值表!
代码如下:
/*点亮我们的点阵第一排第一个灯*/
#include
sbit ADDR0=P0^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//延时函数
delay(unsigned int x)
{
while(x--);
}
//
dz(unsigned int d,c,b,a)
{
ENLED=1;
ADDR3=d;
ADDR2=c;
ADDR1=b;
ADDR0=a;
}
void main()
{
//第一行
P0=0x00;
dz(0,0,0,1);
delay(300);//延时函数的调用
//第二行
dz(0,0,0,1);
P0=0x00;
delay(300);
}
我们知道了一些点阵的原理那么我们就来尝试点亮我们全部数码管呗:
#include
sbit ADDR0=P0^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//延时函数
delay(unsigned int x)
{
while(x--);
}
//
dz(unsigned int d,c,b,a)
{
ENLED=1;
ADDR3=d;
ADDR2=c;
ADDR1=b;
ADDR0=a;
}
void main(){
while(1){
//第一行
LSD(0,0,0,0);
P0=0x00;
delay(300);
//第二行
LSD(0,0,0,1);
P0=0x00;
delay(100);
//第三行
LSD(0,0,1,0);
P0=0x00;
delay(100);
//第4行
LSD(0,0,1,1);
P0=0x00;
delay(100);
//第5行
LSD(0,1,0,0);
P0=0x00;
delay(100);
//第6行
LSD(0,1,0,1);
P0=0x00;
delay(100);
//第7行
LSD(0,1,1,0);
P0=0x00;
delay(100);
//第8行
LSD(0,1,1,1);
P0=0x00;
delay(100);
}
}
大家可以自己将代码复制在自己的程序中看一下代码和我说的效果有什么差别没有。
其实我们有没有想过我们该如何将我们的点阵对角线点亮一行呢?
#include
sbit ADDR0=P0^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//延时函数
delay(unsigned int x)
{
while(x--);
}
//
dz(unsigned int d,c,b,a)
{
ENLED=1;
ADDR3=d;
ADDR2=c;
ADDR1=b;
ADDR0=a;
}
void main()
{
while(1)
{
//第一行第一颗
dz(0,0,0);
P0=0xFE;
delay(100);
//第2行第2颗
dz(0,0,1);
P0=0xFD;
delay(100);
//第3行第3颗
dz(0,1,0);
P0=0xFB;
delay(100);
//第4行第4
dz(0,1,1);
P0=0xF7;
delay(100);
//第5行第 5
dz(1,0,0);
P0=0xEF;
delay(100);
//第6行第 6
dz(1,0,1);
P0=0xDF;
delay(100);
//第7行第7
dz(1,1,0);
P0=0xBF;
delay(100);
//第8行第8
dz(1,1,1);
P0=0x7F;
delay(100);
}
}