微机接口实验16x16点阵显示Word格式文档下载.docx
《微机接口实验16x16点阵显示Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机接口实验16x16点阵显示Word格式文档下载.docx(20页珍藏版)》请在冰点文库上搜索。
•RCK(12脚):
上升沿时移位寄存器的数据锁存入数据寄存器。
•-G(13脚):
高电平时禁止输出(高阻态)。
实验内容:
在16×
16LED点阵上分别用静态方式和滚屏方式显示自己的姓(行扫描)。
两个实验部分的电原理图是相同的,如下所示:
静态方式:
流程图:
程序代码:
L_DAT_HBITP1.0
L_DAT_LBITP1.1
L_STRBITP1.2
L_CLKBITP1.3
L_OEBITP1.4
ROWHEQU40H;
字模信号(顺向取膜,高位在前)
ROWLEQU41H
SELHEQU42H;
行扫描信号
SELLEQU43H
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVR1,#01H;
配合字模信号
MOVR2,#01H;
高字节在后,故从01开始
MOVR3,#10H;
循环16次
LOAD:
MOVDPTR,#SEL_DATA;
存储行扫描信号
MOVA,R1
MOVCA,@A+DPTR
MOVSELH,A;
存储高字节
DECR1;
R1-1,指向低字节
MOVSELL,A;
存储低字节
INCR1
INCR1
INCR1;
指向下一个高字节
MOVDPTR,#ROW_DATA;
存储字模数据,过程同上
MOVA,R2
MOVROWH,A
DECR2
MOVCA,@A+DPTR
MOVROWL,A
INCR2
LCALLLATCH;
运行锁存自程序
LCALLDELAY;
延时
DJNZR3,LOAD;
重复执行16次,显示所有行
LJMPMAIN;
静态显示
LATCH:
CLRL_OE;
允许输出
CLRL_STR;
为上升沿将移位寄存器数据锁存入数据寄存器
MOVR4,SELH;
做准备
MOVR5,ROWH;
高位行扫描型号和字模信号
MOVR6,#08H;
高低位分开读,每次读8位
LATCH1:
CLRL_CLK;
为上升沿读入移位寄存器做准备
MOVA,R4
RRCA;
移出最高位
MOVR4,A
MOVL_DAT_H,C;
由P1.0输出准备进入移位寄存器
MOVA,R5
RRCA
MOVR5,A
MOVL_DAT_L,C;
由P1.1输出准备进入移位寄存器
SETBL_CLK;
CLK上升沿,P1.0和P1.1数据进入移位寄存器
DJNZR6,LATCH1
;
MOVR4,SELL
MOVR5,ROWL
MOVR6,#08H
LATCH2:
;
同上
CLRL_CLK
MOVL_DAT_H,C
MOVL_DAT_L,C
SETBL_CLK
DJNZR6,LATCH2
SETBL_STR;
STR上升沿移位寄存器数据所存入数据寄存器
显示
RET
DELAY:
延迟程序
MOVR6,#02H
LOOP1:
MOVR7,#0F8H;
估算:
1us*2*(1+2*248+2)=998us≈1ms
LOOP2:
DJNZR7,LOOP2
DJNZR6,LOOP1
SEL_DATA:
;
SELECTROW
DB80H,00H
DB40H,00H
DB20H,00H
DB10H,00H
DB08H,00H
DB04H,00H
DB02H,00H
DB01H,00H
DB00H,80H
DB00H,40H
DB00H,20H
DB00H,10H
DB00H,08H
DB00H,04H
DB00H,02H
DB00H,01H
ROW_DATA:
DB0FFH,0FFH,80H,03H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0C0H,07H;
DB0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,00H,01H,0FFH,0FFH;
"
王"
0
END
实验效果:
字模效果:
LED显示效果:
滚屏方式:
ROWHEQU40H
SELHEQU42H
WAITEQU44H;
负责控制滚动速度
MOVR0,#01H;
每次重新滚动时初始化
NEXT:
MOVWAIT,#0AH;
滚动速度设置,数字越大滚动越慢
ROLL:
MOVA,R0;
变换显示的第一行以完成滚动
MOVR1,#01H;
行扫描信号不变
MOVR2,A
MOVR3,#10H
MOVSELH,A;
LOADHIGHBYTE
DECR1;
OFSELECTSIGNAL
MOVSELL,A;
LOADLOWBYTE
INCR1;
MOVDPTR,#ROW_DATA
MOVROWH,A
LCALLLATCH
LCALLDELAY
DJNZR3,LOAD
以上与第一部分相同
DJNZWAIT,ROLL;
循环以延时
INCR0
INCR0;
R0指向下一行,以实现滚动
CJNER0,#61H,NEXT;
所有字符显示完毕后开始新的一轮
以下与第一部分相同
CLRL_OE
CLRL_STR
MOVR4,SELH
MOVR5,ROWH
SETBL_STR
MOVR7,#0F8H
DB80H,00H
DB40H,00H
DB20H,00H
DB10H,00H
DB08H,00H
DB04H,00H
DB02H,00H
DB01H,00H
DB00H,80H
DB00H,40H
DB00H,20H
DB00H,10H
DB00H,08H
DB00H,04H
DB00H,02H
DB00H,01H
DB0FFH,0FFH,80H,03H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0C0H,07H;
DB0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,00H,01H,0FFH,0FFH;
DB0F7H,0DFH,0F7H,0DFH,81H,03H,0F7H,0DFH,0E3H,8FH,0D5H,57H,37H,0D9H,0FBH,0FFH;
DB0F8H,0FH,0F7H,0EFH,0EBH,0DFH,0DDH,0BFH,0FEH,7FH,0FDH,0FFH,0F3H,0FFH,8FH,0FFH;
梦"
1
DB0FFH,0FFH,0FCH,01H,03H,0DFH,0EFH,0BFH,0EEH,03H,0DEH,0FBH,0C2H,0FBH,9AH,0DBH;
DB9AH,0DBH,5AH,0DBH,0DAH,0DBH,0DAH,0BBH,0C3H,0AFH,0DBH,77H,0DEH,0FBH,0FDH,0FBH;
硕"
2
;
为了实现无间隙滚动,最后16行与最前十六行设置相同字模数据
END
字模效果:
LED点阵效果:
实验现象与记录:
静态显示:
正确地显示了“王”字,但是很明显地:
每一行的所有点亮的等亮度相同,并且对每一行而言,亮的灯越多,则每盏灯越暗。
如“王”字,每一横的亮度都很低,但三横中夹着的两短竖则很亮。
其中的原理见实验分析部分。
滚屏显示:
实际中采用了竖滚方式,重复“王梦硕”三个字,“硕”字后面紧跟着“王”字,实际实验中的效果与设计是一致的。
同样,也有静态显示中遇到的点阵亮暗不一的问题。
实验分析与改进:
点阵的亮暗不一:
根据点阵的工作原理(见实验原理部分),若要某一个坐标上LED点亮,则要求其所在列为低电平,而其所在行为高电平。
本次试验采用了行扫描模式,当一行有多盏灯被点亮时,每一盏LED并联,都通过同样电流。
因为每一行的得到的驱动电流恒定,点亮的LED越多,通过每一盏LED的电流就越小。
这就解释了为什么某一行中点亮的LED越多,这些LED的亮度就越小。
但是在列扫描中就不存在这种问题,因为同一时刻每一行只有一盏LED被点亮,所有的驱动电流都流经这个LED,故所有点亮的LED都处在亮度最大的状态。
但这也带来了问题:
每盏LED导通时都流过非常大的电流,LED的寿命因此大大减小。
解决点阵亮暗不一问题的两种方案:
方案一:
增加点亮LED数较多行的显示时间
假设一个字符显示完(16行扫描完成)的时间固定,并且每一行的点亮点数相同,则若一行点亮的时间所占比重越大,则这一行看上去亮度相对较大,因为有更充足的时间让LED施放能量;
反之,若一行点亮的时间所占比重越小,则这一行看上去亮度相对较小。
增加某一行的显示时间的最简单方法就是增加其循环次数,以我的程序为例,要增加某一行的点亮时间,只需在这一行的字模数据和行选通数据被锁存之后加长DELAY子程序的延迟时间,如循环执行X次原DELAY程序,X为这一行的点亮LED数。
获得X的子程序可如下编写:
GETX:
MOVC,#0
MOVR4,#8
MOVR5,#0
MOVA,ROWH
ROLL1:
JNCNEXTX1
INCR5
NEXTX1:
DJNZR4,ROLL
MOVR4,#8
MOVA,ROWL
ROLL2:
JNCNEXTX2
NEXTX2:
DJNZR4,ROLL2
RET
这样,X就会被保存在R5中,再如下修改DELY子程序:
MOVR6,R5
这样,DELAY子程序会根据每一行点亮LED数来更改其点亮时间,从而调整每一行显示时间占总显示时间的比重。
方案二:
逐点点亮
方案一有一个明显的缺点,即在提升了点亮LED数较多的行的显示时间的同时,减少了点亮LED数较少行的显示时间,虽然这可以保证所有行的亮度比较均匀,整体亮度并没有提升。
为了在保证亮度足够大的情况下,使所有行的亮度均匀,可以采用逐点点亮的方法,即:
将原来每次锁存一行字模数据改为每次锁存一行中某一点的字模数据,然后延时。
这样将一行分为16次显示,每次显示最多有一盏LED点亮,就保证了亮度。
具体实现的步骤是:
将原来对每一行字模数据和行选通数据锁存的步骤改为:
A、字模数据第一位以外,其余全部置1,将此处理过后的16位数据与行选通数据移入移位寄存器,再通过STR锁存显示并延时。
B、字模数据第二位以外,其余全部置1,将此处理过后的16位数据与行选通数据移入移位寄存器,再通过STR锁存显示并延时。
C、如此重复直到16位字模数据分别独自显示,开始扫描下一行。
这种方案有如下缺点:
A、程序复杂,可以看到原来的程序对每一行字模数据只需进行一次移位寄存器和锁存延时操作,但现在必须队一行字模数据重复16次上述操作,并且在操作时需要滤出一个有效位而将其它位置1。
程序复杂度有明显提高。
B、扫描速度明显减慢,这是很显而易见的,原来显示一行的时间现在只能用来显示一点。
C、LED寿命减短,理由同列扫描的缺点。
3·
滚动显示的字模数据放置:
根据我的程序思路,一开始“王”字全部显示,然后开始向上滚动,在滚动显示完“王梦硕”三个字后,需等待“硕”字的最后一行移出点阵后才会开始新的一轮显示,如果在“硕”的字模数据后不放置其他数据,则在滚动的最后16x16的LED会全部点亮,因为程序取到的数据全是0000H。
为了避免这种情况,可以将“硕”字后的的8x32个储存单元全部设为0FFH,这样最后16x16的LED全部不亮,比较美观。
但我的想法是让“王梦硕”三个字无缝轮流滚动,故很自然地想到在“硕”字字模数据后再放置一次“王”字字模数据,这样在“硕”字显示完后“王”字会紧随其后,直到次“王”字的16行全部显示完毕后,切换到最初状态,即“王”字全部显示在16x16的点阵上,这种的切换是无法被察觉的,产生的效果就是无缝衔接的滚动。