16x16 LED点阵实验Word文件下载.docx
《16x16 LED点阵实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《16x16 LED点阵实验Word文件下载.docx(16页珍藏版)》请在冰点文库上搜索。
74HC595:
LD-QA~LD-QP:
点阵行控制信号
LD-1~LD-16:
点阵列控制信号
SER(14脚):
串行数据输入端
-SCLR(10脚):
低电平时将移位寄存器的数据清零。
通常将它接Vcc。
SCK(11脚):
上升沿时将串行数据移入移位寄存器。
RCK(12脚):
上升沿时移位寄存器的数据锁存入数据寄存器。
-G(13脚):
高电平时禁止输出(高阻态)
时序图:
实验内容:
在16×
16LED点阵上分别用静态方式和滚屏方式显示自己的姓(行扫描)。
实验步骤:
使用导线将A2区的P10~P14与C3区的L_DAT_H、L_DAT_L、L_CLK、L_OE、L_STR
实验设计:
电路图:
(修改后加上了74HC595输出端口与LED点阵相连的端口名称)
1、静态方式:
流程图:
代码及注释:
HLEQU70H;
行信号低位内存地址
LLEQU72H;
列信号低位内存地址
HDEQUP1.0;
p1.0口连行信号输入端
LDEQUP1.1;
P1.1口连列信号输入端
SCKEQUP1.2;
P1.2口连移位寄存器
OEEQUP1.3;
P1.3口连使能端
RCKEQUP1.4;
P1.4口连锁存器
ORG8000H;
硬件仿真程序
LJMPMAIN
ORG8100H;
MAIN:
MOVDPTR,#DISPLAY;
字模表地址
MOVR1,#00H;
字模表起始地址偏移量
MOVHL,#01H;
行扫描信号的初值0001H
MOVHL+1,#00H
LOOP:
MOVA,R1
MOVCA,@A+DPTR
MOVLL,A;
找到列低位数据,存入内存地址中
INCR1
MOVLL+1,A;
找到列高位数据,存入内存地址中
LCALLSENDD;
调用传输数据的程序
LCALLDELAY;
调用延时程序
CLRC;
位处理累加器清零
MOVA,HL
RLCA;
左移行扫描信号低8位
MOVHL,A
MOVA,HL+1
左移行扫描信号高8位
MOVHL+1,A
CJNER1,#20H,LOOP;
判断一轮扫描是否结束
LJMPMAIN
SENDD:
CLROE;
使能信号低电平有效
CLRRCK;
RCK信号置0
MOVR2,#08H
MOVR3,LL+1;
列信号高八位地址
MOVR4,HL+1;
行信号高八位地址
BACK:
CLRSCK;
SCK信号置0
MOVA,R3
RLCA
MOVR3,A
MOVLD,C;
列信号逐位传输
MOVA,R4
MOVR4,A
MOVHD,C;
行信号逐位传输
SETBSCK;
SCK信号上升沿到来,将串行数据移入移位寄存器
DJNZR2,BACK;
判断高8位信号是否传输完毕
MOVR3,LL;
列信号低8位地址
MOVR4,HL;
行信号低8位地址
BACK1:
DJNZR2,BACK1;
判断低8位信号是否传输完毕
SETBRCK;
RCK信号上升沿到来,移位寄存器的数据锁存入数据寄存器
RET
DELAY:
;
延时子程序
MOVR7,#50
DELAY1:
MOVR6,#10
DELAY2:
DJNZR6,$
DJNZR7,DELAY1
DISPLAY:
DB0xFF,0xFE,0xE0,0xEE,0xEF,0xCE,0xEF,0xF6,0xE1,0xFA,0xFD,0xFC,0xFD,0xFE,0x3D,0x80;
DB0xE0,0xFA,0xED,0xFA,0xEF,0xF6,0xEF,0xF6,0xEF,0xEE,0xEF,0x9A,0x6B,0xDC,0xF7,0xFE;
"
张"
END
2、滚屏方式
HLEQU70H;
LLEQU72H;
SCKEQUP1.2;
OEEQUP1.3;
RCKEQUP1.4;
LJMPMAIN
MOVR1,#00H
MOVR7,#00H;
R7用来表示字模表起始位置偏移量
MOVR5,#20;
R5用来表示延时,改变R5的值可改变滚屏速度
LOOP1:
MOVR6,#10H;
R6用来判断是否扫描完一轮
MOVA,R7;
将R7的值赋值给R1
MOVR1,A
MOVHL,#01H;
LOOP2:
MOVCA,@A+DPTR
左移行扫描信号低八位
MOVHL,A
左移行扫描信号高八位
DECR6
CJNER6,#00H,LOOP2;
通过R6判断是否扫描完一轮,R6减为0,一轮扫描结束
DJNZR5,LOOP1;
通过R5判断一帧的延时是否达到
INCR7;
改变字模表的偏移量
R7连续加2,相当于换行
CJNER7,#40H,LOOP;
判断字模表是否结束
列信号高8位地址
行信号高8位地址
SCK信号置0
判断高八位信号是否传输完毕
MOVR2,#08H
列信号低八位地址
行信号低八位地址
判断低八位信号是否传输完毕
MOVR2,#50
MOVR3,#10
DJNZR3,$
DJNZR2,DELAY1
DB0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
DB0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;
预留空白
实验结果与分析:
1、程序正确运行后,可看到16x16LED点阵显示屏上显示“张”,LED灯的亮暗程度有些不均匀。
2、程序正确运行后,可看到16x16LED点阵显示屏上“张”滚动显示,方向由下至上,两个“张”字的显示间一段黑屏。
生成字模的设置为阳码,逐行式,逆向提取,十六进制。
刚开始做实验时,显示屏上显示的“张”字是暗的,而其余部分为亮。
因为最初用字模生成软件生成字模时选用的是阴码,故显示出的亮暗正好相反。
后将其改成了阳码,使所需显示的字点亮,而其余部分为暗。
由于实验中采用的是行扫描,字模生成时选择逐行式,每次扫描时将这一行置为高电平。
用于LED点阵每行的驱动能力有限,所以当某一行要点亮的LED灯的数量较多时,这一行点亮的LED灯的亮度会较暗;
反之,某一行要点亮的LED灯的数量较少时,被点亮的LED灯的亮度就会较亮。
因此,显示屏上显示的字的亮度会不均匀,且某些笔画较简单的字亮度的差别更为明显,而一些笔画较复杂的字亮度虽然差别不是特别大但整体显示较暗。
为使LED灯显示的亮度更均匀,需针对每行不同的情况外加驱动能力不同的驱动电路。
生成字模时选用逆向提取,故从第一行开始从左向右每取8个点作为一个字节,如果最后不足8个点就补满8位。
取模顺序为从低到高,即第一个点作为最低位。
如第一行第一列的点亮,则该点字模取为00000001。
实验中在实现静态显示时,行信号是用程序产生的,列信号则是通过字模提取软件自动生成的。
设置行信号的初值为0001H,每扫描完一行后,将其左移一位,扫描下一行。
当扫描到某一行时,将该行行信号的低位和高位分别存入两个内存地址70H和71H中,同时将列信号的低位和高位也存入两个内存地址72H和73H中。
然后调用传输数据的程序,将行列信号移入锁存移位寄存器中。
将使能端置0,开启锁存移位寄存器,将锁存信号RCK和移位信号SCK也置0,先将行列信号的高八位进行左移,左移一位后将SCK信号置1,产生上升沿,此时将信号移入移位寄存器;
当高八位信号都左移后再将行列信号的低八位进行左移,也在SCK信号上升沿到来时将其移入移位寄存器。
当行和列的16位信号都左移一次,即将这一行的扫描信号都存入移位寄存器中后,再将RCK信号置1,产生上升沿,此时将信号锁存进锁存器中。
而后调用一个延时程序,即每一行信号扫描完后经过一定的延时再进行下一行信号的扫描。
在实验中设置延时约为500us,若延时过短,显示时灯可能会有闪烁;
若延时过长,视觉上可能会觉得字的显示是一行一行的,而不是将字完整的显示出来。
扫描完一行后,只需将行信号左移一位,并将字模表的地址偏移量加1,即可进行下一行的扫描。
故可用字模表地址偏移量的累加次数来判断是否扫描完所有的行。
因为字模的高位和低位存在两个不同的内存地址中,从低位到高位的转换中,偏移地址也要加1,因此当地址偏移量为20H时,所有行的一轮扫描结束。
此时,再从头开始扫描,行信号从0001H开始,列信号从字模表首地址开始。
在滚屏显示中,单帧的扫描原理和静态扫描的时候是一样的。
但当扫描下一帧时,行信号还是左移一位,而列信号扫描完一帧后的首地址不再是字模表的首地址,而要将偏移地址加2,对显示信号进行换行。
即下一帧扫描的第一行相当于上一帧扫描的第二行,由此实现字向上滚动。
在滚屏时,除了每一行信号有延时外,每一帧也需要延时,这个延时用来控制滚屏的速度。
这个延时也是通过软件定时来完成的,即通过改变循环的次数来改变延时。
增加循环次数可以降低滚屏速度。
不过在实验中改变循环次数,速度的改变并不是很明显。
在实验中,我在字模表的前加入了预先留白,即在要显示的字的字模表前插入32字节的0FFH,用来表示黑屏。
这样滚屏的时候就不会字连着字,而是两个字显示的中间会有一段黑屏。
但需注意的是,加入黑屏后,判断所有帧是否扫描结束的参数也需做相应的改变。
因为插入了32个字节,所以用来判断字模表扫描是否结束的地址偏移量R7的累加次数应改为40H。
因为实验中使用的是行扫描,所以纵向滚屏会较容易实现。
这是因为在行扫描中列信号字模表可以以字节为单位进行移动;
若要实现横向扫描则需要以每个位为单位进行移动,实现的代码会复杂许多。
反之,若扫描方式为列扫描,则横向滚屏是以字节为单位进行移动,较容易实现。
这也是我在实验中用纵向滚屏的原因。