ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:23.98KB ,
资源ID:650033      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-650033.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(点阵屏显示原理及实验详解.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

点阵屏显示原理及实验详解.docx

1、点阵屏显示原理及实验详解标题:LED点阵屏学习攻略 共享资料LED点阵屏学习攻略 在经历了将近一个学期断断续续的点阵屏学习后,最后终于在AVR平台下完成了128*32点阵屏的无闪烁显示。现把整个学习过程总结如下:无论是51单片机还是AVR单片机,点阵屏的显示原理是一样的,所以首先从51讲起。说明:以下所有试验如无特殊说明均在Keil uVision3 + Proteus 6.9 SP5下仿真完成。一基于51的点阵屏显示:(1)点亮第一个8*8点阵: 1.首先在Proteus下选择我们需要的元件,AT89C52、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Prot

2、eus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-8*8-RED。在这里请大家牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。 2.在选择完以上三个元件后,我们开始布线,具体如下图:这里P2是列选,P3连接38译码器后作为行选。选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好与点阵屏的低电平选中行相对,并且节省了I/O

3、口,大大方便了我们的编程和以后的扩展。3.下面让我们把它点亮,先看一个简单的程序:(将奇数行偶数列的点点亮,效果如下图)下面是源代码:/*8*8LED点阵屏显示*/#includevoid delay(int z) /延时函数 int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void main() while(1) P3=0; /行选,选择第一行 P2=0x55; /列选,即该行显示的数据 delay(5); /延时 /*下同*/ P3=2; /第三行 P2=0x55; delay(5); P3=4; /第五行 P2=0x55; delay(5); P3=6;

4、 /第七行 P2=0x55; delay(5); 上面的程序实现了将此8*8点阵的奇数行偶数列的点点亮的功能。重点让我们看while循环内,首先是行选P3=0,此时38译码器的输入端为000,则输出端为01111111,即B0端为低电平,此时选中了点阵屏的第一行,接着列选我们给P2口赋0x55,即01010101,此时又选中了偶数列,紧接着延时。然后分别对第三、五、七行进行相同的列选。这样就点亮了此点阵屏奇数行偶数列交叉的点。完成这个程序,我们会发现其实点阵屏的原理是如此简单,和数码管的动态显示非常相似,只不过换了一种方式而已。4.完成了上面的点亮过程,下面我们让这个8*8的点阵屏显示一个汉字

5、:“明”先看效果图:源代码如下:/*8*8LED点阵屏显示*/#includechar code table=0x0f,0xe9,0xaf,0xe9,0xaf,0xa9,0xeb,0x11; /明 字编码 void delay(int z) /延时函数 int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void main() int num; while(1) /循环显示 for(num=0;num8;num+) /8行扫描 P3行选,P2列选 P3=num; /行选 P2=tablenum; /列选 delay(5); /延时 因为要显示一个汉字,这里我们使用

6、了一个数组table 来存储该字的编码,重点还是来看while循环,首先在for循环内完成对8*8点阵屏的8行依次扫描。我们来分析第一行的情况即num=0的时候,首先P3=0,选中第一行,然后P2=table0,即P2等于table数组中第一个数据0x0f,则此时就点亮了第一行相应的点。接着延时,其他行同理。这样我们就完成了一个最简单汉字的显示。(2)16*16点阵的显示原理 1.虽然完成了上面8*8点阵的显示,但是由于点的数量太少以至于它的显示效果并不是很理想,事实上现在大部分点阵的汉字都是16*16显示的,下面让我们来学习16*16点阵的显示。和上面一样我们先选择元件:AT89C52,74

7、LS138,,MATRIX-8*8-GREEN,因为要显示16*16的汉字,我们就不能再使用一个38译码器进行行选了,这里我们用两个38译码器组合成一个4选16的译码器(当然也可以使用74159)。而MATRIX-8*8-GREEN点阵需要4个。完成后如下图:2.先来看看4选16的译码器是如何工作的,这里有4个输入端a、b、c、d,16个输出端H0H15,如上图连线后即可完成类似于38译码器一样的工作。只不过扩展到了16行选。关于连线的原理这里不再赘述,只要明白38译码器的原理这个可以轻松理解。接着完成全部布线。如下图所示:3.连好线后,P1作为行选,P2、P3一起作为列选。现在16*16的点

8、阵被分成两块并不完整的部分,我们可以整体移动(包括点阵屏、连线以及连接点,)来方便我们观察显示的效果(最好同时去掉仿真中电平的指示灯)。接着我们来看一个程序,还是让此点阵屏显示一个汉字:“明”。先看效果图:源代码如下:/*16*16LED点阵屏显示*/#includechar code table=0x00,0x20,0x20,0x7F,0x7E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x80,0x20,0x80,0x20,0x40,0x

9、28,0x20,0x10; / “明” void delay(int z) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void main() int num; while(1) for(num=0;num16;num+) P1=num; /行选 P2=table2*num; /列选 P3=table2*num+1; /列选 delay(2); 4.先来看这次使用的table数组,因为是16*16的点阵,所以总共有32个数据,其中第1、2个数据用于第一行的显示,第2、3个数据用于第二行的显示,以此类推,总共16行。然后还是来看while循环内,同样for循

10、环依次扫描16行,以第一行为例,即num=0时,首先P1=0,选中第一行,P2=table0、P3=table1送出列选数据,即第一行要显示的两个字节的数据。其他行同理。这样很轻松的我们就完成了16*16点阵的显示。程序虽然完成了,但是回过头来看一看就会发现,我们在这里使用了P2与P3口一起来做列选,浪费了大量的I/O/资源,而且现在点阵屏的大小还只有16*16,如果想要扩展的更大,已经没有足够的I/O口可用了。所以一定要想出更好的办法进行列选。5.为了解决上面提到的问题,我们来学习一个新的元件:74HC595。它实质上是一个串行移位寄存器,能够实现“串入并出”的功能,关于它的使用我们还是用上

11、一个列子来讲解,先来看看它的实现,如图:可以看到这里我们仅使用了三个I/O口就完成了列选数据的发送。主要来看74HC595是如何实现“串入并出”的,这里我们使用了两个595进行了级联,即第二个595的数据输入端连接了第一个595的级联输出口Q7。也就是说,我们只需要从第一个595的输入端串行输入数据,便可以实现把数据送入第二个595的功能。而且595的数量可以进行无限的级联,而不管有多少个595,我们只需要一个数据输入端就可以,这样就大大节省了I/O资源。对于595的具体使用还是来看程序。源代码如下:/*16*16LED点阵屏显示*/#includesbit R=P20; /数据输入端口 sb

12、it CLK=P21; / 时钟信号 sbit STB=P22; / 锁存端 char code table=0x00,0x20,0x20,0x7F,0x7E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x80,0x20,0x80,0x20,0x40,0x28,0x20,0x10; / “明” void delay(int z) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void WriteByte(c

13、har dat) /写一个字节的数据 char i; for(i=0;i1; /右移一位,取出该字节的最低位 R=CY; /将该字节的最低位传给R CLK=0; /将数据移入595,上升沿 CLK=1; void main() int num; while(1) for(num=0;num1,把要输入的数据右移一位,这样最低位便进入移位寄存器CY中,紧接着我们让R=CY,把该位传给595的输入端,CLK一个上升沿的跳变就实现了把该位数据移入595的功能。8次循环便可以将一个字节的数据送出。重点还是看while循环内,同样也是16行的扫描,然后就是WriteByte(table2*num)等同于

14、上面的P2=table2*num,WriteByte(table2*num+1)等同于P3=table2*num+1,完成列选,接着行选,然后有一个STB的下降沿的跳变,这个变化能够实现并行输出移位寄存器中的数据。这样就完成了整个过程。(3)16*16点阵的移位控制 点阵的移位一般有上、下、左、右的移动,这里我们重点讲上移和左移,其它同理。1. 点阵的上移:点阵的上移相对来说很简单,看效果图如下:源代码:(该程序实现了循环上移显示“邢台”)/*16*16LED点阵屏显示*/#includesbit R=P20; /数据输入端口 sbit CLK=P21; / 时钟信号 sbit STB=P22

15、; / 锁存端 char code table=/*- 文字: 邢 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/ 0x00,0x00,0xFE,0x3E,0x48,0x22,0x48,0x22, 0x48,0x12,0x48,0x12,0x48,0x0A,0xFF,0x13, 0x48,0x22,0x48,0x42,0x48,0x42,0x48,0x46, 0x44,0x2A,0x44,0x12,0x42,0x02,0x40,0x02,/*- 文字: 台 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/ 0x40,0x00,0x40,0x00

16、,0x20,0x00,0x10,0x04, 0x08,0x08,0x04,0x10,0xFE,0x3F,0x00,0x20, 0x00,0x08,0xF8,0x1F,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,; void delay(int z) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void WriteByte(char dat) /写一个字节的数据 char i; for(i=0;i1; /右移一位,取出该字节的最低位 R=CY; /将该字节的最低位传给R CLK=0

17、; /将数据送出,上升沿 CLK=1; void main() int num,move,speed; while(1) if(+speed8) /移动速度控制 speed=0; move+; /移位 if(move16) /是否完成移位一个汉字 move=0; /从头开始 for(num=0;numtempyid) | (BUFFs+1(8-tempyid)。这里temp作为要发送的一个字节数据,它由数据缓冲区中的数据组合而成,并且动态的变化,大致来说就是首先第一个字节的数据右移tempyid位,第二个字节的数据左移8-tempyid位,两者相或后组成一个字节新的数据,只要我们一直不断地移位

18、、相或、发送,就能实现左移的效果。不太好理解,先来看实例(循环左移显示“邢台学院”),效果图如下:见源代码:#include #define uchar unsigned char#define uint unsigned intuchar yid,h; /YID为移动计数器,H为行段计数器 uint zimuo; /字模计数器 uchar code hanzi; /汉字字模 uchar BUFF4; /缓存void in_data(void); /调整数据void rxd_data(void); /发送数据void sbuf_out(); /16段扫描 uchar code table=/篇幅有限,省略编码;void main(void)uchar i,d=10;yid=0;zimuo=0; while(1) while(yid16) /数据移位。 for(i=0;i=96) /到最后从头开始,有字数决定 zimuo=0; /*/void sbuf_out() for(h=0;h16;h+) /16行扫描 in_data(); /调整数据 rxd_data(); /串口发送数据 P1=0x7f; /关闭显示。 P1_7=1; /锁存为高,595锁存信号 P1=h;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2