经过学习,今天整理了8*8点阵学习的基础,有Proteus仿真图和单片机程序、word说明文档、取模软件,适合新手,应能看懂入门。后续随时间增加移动、16*16等。我也在学习,期待高手帮助,谢谢。
在Proteus中,有4种8*8点阵模型,分别为MATRIX-8*8-BLUE(蓝色,上图第1个)、MATRIX-8*8-GREEN (绿色,上图第2个)、 MATRIX-8*8-ORANGE (橙色,上图第3个)、MATRIX-8*8-RED(红色,上图第4个)。每个8*8点阵均由64个LED小灯组成,如左边D1、D2所示:当在D1加正向电压时,LED小灯点亮,当在D2加反向电压时,LED不亮,这是点阵学习的基础。 如上图,在Proteus中,,不进行任何旋转操作,直接放置4种点阵,加上电源后,只有红色点阵第1排亮2个灯,其他均不亮。由图可知道,上排2根线,有2列有灯亮,即上排接通的列选,下排接通行选。当高电平选中列、低电平选中行时,相应LED灯亮。 如上图,当我们把电源极性相反后,红色点阵不亮,其他3种都为左边第1、2排第1列亮2个LED灯。上排有2根线,而第1排、第2排有灯亮,即说明上排接通行选,因为有2根线所以有2行有灯亮,那下排就是接通列选。由图可知,这3种也是高电平选中列、低电平选中行时,相应LED灯亮。 由此,我们得出3点结论: 1、仿真效果上看,绿色和红色显示较清楚,蓝和橙色显示不够清楚,这就是我们下面选红或绿做仿真的原因。 2、红色的点阵是上列选下行选,其他3种是上行选下列选。如图1,红色上面接2根线,因为上面是列选,说明选择了2列,下面接了1根线,说明选择了1行,所以就是第一行左边2个灯亮。图2同理是点了2排的第1个。 3、以上4种点阵,无论上列选下行选还是上行选下列选,都是当高电平选中列、低电平选中行时,相应LED灯亮。此为编程的基础。 例如我要点亮红色点阵的第一行,因为它是上列选,下行选,高电平选中列、低电平选中行时相应LED灯亮,所以需在下面第1个端子加GND,上面8个端子加VCC,如下图: 如果我要1、3、5、6行亮,则只需将行选信号(下端子)第1、3、5、6加GND即可,如下图: 这样,红色点灯点亮方法我们就知道了。接下来我们看看其他点阵点亮的方法,以绿色为例。还是以点亮点阵的第一行为例。绿色点阵,上行选下列选,高电平选中列、低电平选中行时相应LED灯亮。所以应该为上面第1个端子为行选信号,接一个GND,下面的端子为列信号,全部给VCC即可,如下图: 如果我要2、4、6行亮,该怎样办呢?很显然,就是行信号相应位置选中(给GND)即可,如图:  明白了这点,我们可以开始我们的编程了。上面示例为硬件测试,由读者自行在Proteus中画出即可。 第1节:通过编程,控制绿色点阵点亮左上角第一个LED灯。 分析:绿色点阵为上行选,下列选,高电平给列,低电平给行时即亮。因此,编程将上端子第1个端子写0,下端子第1个端子写1即可。原理图如下: 程序如下: //本程序点亮绿色点阵第一个灯,P2.7接上排第1个,行选,应给低电平;P3.7接上排第1个,列选,应给高电平。 #include<reg52.h> //定义头文件 void main() //主函数开始 { P2=0x7f;//0111 1111 第1位P2.7为0,即给行选一个低电平; P3=0x80;//1000 0000 第1位P3.7为1,即给列选一个高电平; while(1);//死循环,能让程序停在这里 } 第2节:通过编程,控制绿色点阵点亮左上角第一排LED灯亮。 与上节相比,第1排仍需给低电平,再将列信号全部给高电平即可,仿真图如下: 源程序如下: #include<reg52.h> //定义头文件 void main() //主函数开始 { P2=0x7f;//0111 1111 第1位P2.7为0,即给行选一个低电平; P3=0xff;//给列选全部加一个高电平; while(1);//死循环,能让程序停在这里 } 其他行、列等由读者按自己想法完成,接下来,介绍如果点亮我们需要的字符。 一般我们按行扫描方式,就是列信号给高电平,算出第一行的列信号哪个亮哪个不亮,待程序扫描完第一行,再到第二行,直到扫描完8行就完成一个字符的显示了。“同一时刻,有且只有一行在亮”,这是编程的基础,和数码管动态显示一样的。下面我们在点阵上显示“中国”的中字。首先我们把原理图画出来,如下图: 分析:绿色点阵,上行选下列选,高电平选中列、低电平选中行时相应LED灯亮,这是编程的基础。就上图而言,我们按行扫描方式,第1行时,即给P2.7低电平时,P3口控制第一行哪一列亮就给高电平,否则给低电平。依次扫描完8行即可。我们可以把扫描第一行时,列信号应该给第一行送什么数先算出,其他一样,这样,先把列信号算出,可以用取模软件。 1、新建图像,选择宽度是8,高度是8,即8*8点阵。 2、在取模方法选择横向取模,一般行扫描方式就选这个。字节倒序是满足一些硬件需求,比如第一位应该是接最高位,但硬件第1位接最低位,所以此处不选即可。 3、在模拟动画中,放大格点,把“中”字点选出来。以后到16*16时,可在文件输入区输入即可。在8*8时,还是手工选择即可。 4、在取模方式中,选C51格式,点阵生成区出现了8*8点阵,行扫描时的列信号,将其复制到程序中即可。 完整程序如下: #include<reg52.h> //包含头文件 char code hang[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //行编码,分别选中第一行至第8行 char code lie[]={0x00,0x08,0x7f,0x49,0x49,0x7f,0x08,0x08}; //行扫描时,列信号编码 void delay(int a) //延时函数 { int x,y; for(x=0;x<a;x++) for(y=0;y<110;y++); } void main() //主函数 { int num; while(1) { for(num=0;num<8;num++)//行扫描8次,轮流选中第一行,第1个列编码,直到第8行; { P2=hang[num]; //送行编码,当num=0时送第一行时的编码,依次类推送完1至8行; P3=lie[num]; //送列编码,每一行把相应列该亮哪个灯送到端口。 delay(5); //送完行和列,适当做一下延时。 } } } 效果图如下: 程序不变,只需改变char code lie[]里的编码,即可改变显示不同的字符。如字符1。在取模软件得出列信号为:0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C,效果图如下: 至此,点阵学习基础就学完了。我们可以在8*8点阵上显示固定的一些字符了。要显示汉字,后续将8*8拼成16*16再进行。8*8点阵,如何移动等问题还没解决,而且8*8就用去了16个IO口,后续需减少IO口的使用,增加74LS138、74LS595等。我也在学习中,本文把学到的知识自己总结好发出来,希望对初学点阵的朋友有帮助!
全部资料51hei下载地址:
点阵学习基础.rar
(689.63 KB, 下载次数: 44)
|