微机接口实验-16x16点阵显示

上传人:文**** 文档编号:63936307 上传时间:2022-03-20 格式:DOCX 页数:14 大小:405.90KB
返回 下载 相关 举报
微机接口实验-16x16点阵显示_第1页
第1页 / 共14页
微机接口实验-16x16点阵显示_第2页
第2页 / 共14页
微机接口实验-16x16点阵显示_第3页
第3页 / 共14页
点击查看更多>>
资源描述
精选优质文档-倾情为你奉上实验04LED显示器王梦硕实验目的:在理解LED点阵工作原理的基础上,实践使用点阵显示字符。实验原理:1点阵式显示器:发光二级管排列成矩阵,由亮与暗来产生字符或图形。每一样的阳极连在一起,每一列的阴极连在一起,如右图所示。点阵显示器每一列的阴极连在一起,对每一列而言相当于一个共阴显示器。同时每一行的阳极连在一起,相当于七段显示器的比划。可采用动态显示电路,以笔画锁存器控制行信号,以位锁存器控制列信号。274HC595实验中使用两片8位输出锁存移位寄存器74HC595(三态输出、串入并出),将单片机I/O口发出的串行数据转换为并行数据LD_QALD_QP,作为16x16 LED点阵显示器的行线,使用另外两片8位74HC595作为16x16 LED点阵显示器的列线LD_1LD_16。当行输出高电平、列输出低电平时,可以点亮点阵。74HC595的工作时序图和推荐的连接方法如下:下图中: LD-QALD-QP:点阵行控制信号 LD-1LD-16:点阵列控制信号 SER(14脚):串行数据输入端 -SCLR(10脚): 低电平时将移位寄存器的数据清零。通常将它接Vcc。 SCK(11脚):上升沿时将串行数据移入移位寄存器。 RCK(12脚):上升沿时移位寄存器的数据锁存入数据寄存器。 -G(13脚): 高电平时禁止输出(高阻态)。实验内容:在1616LED点阵上分别用静态方式和滚屏方式显示自己的姓(行扫描)。两个实验部分的电原理图是相同的,如下所示:1静态方式:流程图:程序代码:L_DAT_HBITP1.0L_DAT_LBITP1.1L_STRBITP1.2L_CLKBITP1.3L_OEBITP1.4ROWHEQU40H;字模信号(顺向取膜,高位在前)ROWLEQU41HSELHEQU42H;行扫描信号SELLEQU43HORG0000HLJMPMAINORG0100HMAIN:MOVR1, #01H;配合字模信号MOVR2, #01H;高字节在后,故从01开始MOVR3, #10H;循环16次LOAD:MOVDPTR, #SEL_DATA;存储行扫描信号MOVA, R1MOVCA, A+DPTRMOVSELH, A;存储高字节DECR1;R1-1,指向低字节MOVA, R1MOVCA, A+DPTRMOVSELL, A;存储低字节INCR1INCR1INCR1;指向下一个高字节MOVDPTR, #ROW_DATA;存储字模数据,过程同上MOVA, R2MOVCA, A+DPTRMOVROWH, ADECR2MOVA, R2MOVCA, A+DPTRMOVROWL, AINCR2INCR2INCR2LCALLLATCH;运行锁存自程序LCALLDELAY;延时DJNZR3, LOAD;重复执行16次,显示所有行LJMPMAIN;静态显示LATCH:CLRL_OE;允许输出CLRL_STR;为上升沿将移位寄存器数据锁存入数据寄存器MOVR4, SELH;做准备MOVR5, ROWH;高位行扫描型号和字模信号MOVR6, #08H;高低位分开读,每次读8位LATCH1:CLRL_CLK;为上升沿读入移位寄存器做准备MOVA, R4RRCA;移出最高位MOVR4, AMOVL_DAT_H, C;由P1.0输出准备进入移位寄存器MOVA, R5RRCAMOVR5, AMOVL_DAT_L, C;由P1.1输出准备进入移位寄存器SETBL_CLK;CLK上升沿,P1.0和P1.1数据进入移位寄存器DJNZR6, LATCH1;MOVR4, SELLMOVR5, ROWLMOVR6, #08HLATCH2:;同上CLRL_CLKMOVA, R4RRCAMOVR4, AMOVL_DAT_H, CMOVA, R5RRCAMOVR5, AMOVL_DAT_L, CSETBL_CLKDJNZR6, LATCH2;SETBL_STR;STR上升沿移位寄存器数据所存入数据寄存器;显示RETDELAY:;延迟程序MOVR6, #02HLOOP1:MOVR7, #0F8H;估算:1us*2*(1+2*248+2) = 998us 1msLOOP2:DJNZR7, LOOP2DJNZR6, LOOP1;RETSEL_DATA:;SELECT ROWDB80H, 00HDB40H, 00HDB20H, 00HDB10H, 00HDB08H, 00HDB04H, 00HDB02H, 00HDB01H, 00HDB00H, 80HDB00H, 40HDB00H, 20HDB00H, 10HDB00H, 08HDB00H, 04HDB00H, 02HDB00H, 01HROW_DATA:DB 0FFH, 0FFH, 80H, 03H, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0C0H, 07H;DB 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 00H, 01H, 0FFH, 0FFH;王,0;END实验效果:字模效果:LED显示效果: 2滚屏方式:流程图:程序代码:L_DAT_HBITP1.0L_DAT_LBITP1.1L_STRBITP1.2L_CLKBITP1.3L_OEBITP1.4ROWHEQU40HROWLEQU41HSELHEQU42HSELLEQU43HWAITEQU44H;负责控制滚动速度ORG0000HLJMPMAINORG0100HMAIN:MOVR0, #01H;每次重新滚动时初始化NEXT:MOVWAIT, #0AH;滚动速度设置,数字越大滚动越慢ROLL:MOVA, R0;变换显示的第一行以完成滚动MOVR1, #01H;行扫描信号不变MOVR2, AMOVR3, #10HLOAD:MOVDPTR, #SEL_DATA;MOVA, R1MOVCA, A+DPTRMOVSELH, A;LOAD HIGH BYTEDECR1;OF SELECT SIGNALMOVA, R1MOVCA, A+DPTRMOVSELL, A;LOAD LOW BYTEINCR1;OF SELECT SIGNALINCR1INCR1MOVDPTR, #ROW_DATAMOVA, R2MOVCA, A+DPTRMOVROWH, ADECR2MOVA, R2MOVCA, A+DPTRMOVROWL, AINCR2INCR2INCR2LCALLLATCHLCALLDELAYDJNZR3, LOAD;以上与第一部分相同DJNZWAIT, ROLL;循环以延时INCR0INCR0;R0指向下一行,以实现滚动CJNER0, #61H, NEXT;所有字符显示完毕后开始新的一轮;以下与第一部分相同LJMPMAINLATCH:CLRL_OECLRL_STRMOVR4, SELHMOVR5, ROWHMOVR6, #08HLATCH1:CLRL_CLKMOVA, R4RRCAMOVR4, AMOVL_DAT_H, CMOVA, R5RRCAMOVR5, AMOVL_DAT_L, CSETBL_CLKDJNZR6, LATCH1;MOVR4, SELLMOVR5, ROWLMOVR6, #08HLATCH2:CLRL_CLKMOVA, R4RRCAMOVR4, AMOVL_DAT_H, CMOVA, R5RRCAMOVR5, AMOVL_DAT_L, CSETBL_CLKDJNZR6, LATCH2;SETBL_STR;RETDELAY:MOVR6, #02HLOOP1:MOVR7, #0F8HLOOP2:DJNZR7, LOOP2DJNZR6, LOOP1;RETSEL_DATA:;SELECT ROWDB80H, 00HDB40H, 00HDB20H, 00HDB10H, 00HDB08H, 00HDB04H, 00HDB02H, 00HDB01H, 00HDB00H, 80HDB00H, 40HDB00H, 20HDB00H, 10HDB00H, 08HDB00H, 04HDB00H, 02HDB00H, 01HROW_DATA:DB 0FFH, 0FFH, 80H, 03H, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0C0H, 07H;DB 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 00H, 01H, 0FFH, 0FFH;王,0DB 0F7H, 0DFH, 0F7H, 0DFH, 81H, 03H, 0F7H, 0DFH, 0E3H, 8FH, 0D5H, 57H, 37H, 0D9H, 0FBH, 0FFH;DB 0F8H, 0FH, 0F7H, 0EFH, 0EBH, 0DFH, 0DDH, 0BFH, 0FEH, 7FH, 0FDH, 0FFH, 0F3H, 0FFH, 8FH, 0FFH;梦,1DB 0FFH, 0FFH, 0FCH, 01H, 03H, 0DFH, 0EFH, 0BFH, 0EEH, 03H, 0DEH, 0FBH, 0C2H, 0FBH, 9AH, 0DBH;DB 9AH, 0DBH, 5AH, 0DBH, 0DAH, 0DBH, 0DAH, 0BBH, 0C3H, 0AFH, 0DBH, 77H, 0DEH, 0FBH, 0FDH, 0FBH;硕,2DB 0FFH, 0FFH, 80H, 03H, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0C0H, 07H;DB 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 0FEH, 0FFH, 00H, 01H, 0FFH, 0FFH;王,0;为了实现无间隙滚动,最后16行与最前十六行设置相同字模数据END实验效果:字模效果:LED点阵效果: 实验现象与记录:1静态显示:正确地显示了“王”字,但是很明显地:每一行的所有点亮的等亮度相同,并且对每一行而言,亮的灯越多,则每盏灯越暗。如“王”字,每一横的亮度都很低,但三横中夹着的两短竖则很亮。其中的原理见实验分析部分。2滚屏显示:实际中采用了竖滚方式,重复“王梦硕”三个字,“硕”字后面紧跟着“王”字,实际实验中的效果与设计是一致的。同样,也有静态显示中遇到的点阵亮暗不一的问题。实验分析与改进:1点阵的亮暗不一:根据点阵的工作原理(见实验原理部分),若要某一个坐标上LED点亮,则要求其所在列为低电平,而其所在行为高电平。本次试验采用了行扫描模式,当一行有多盏灯被点亮时,每一盏LED并联,都通过同样电流。因为每一行的得到的驱动电流恒定,点亮的LED越多,通过每一盏LED的电流就越小。这就解释了为什么某一行中点亮的LED越多,这些LED的亮度就越小。但是在列扫描中就不存在这种问题,因为同一时刻每一行只有一盏LED被点亮,所有的驱动电流都流经这个LED,故所有点亮的LED都处在亮度最大的状态。但这也带来了问题:每盏LED导通时都流过非常大的电流,LED的寿命因此大大减小。2解决点阵亮暗不一问题的两种方案:方案一:增加点亮LED数较多行的显示时间假设一个字符显示完(16行扫描完成)的时间固定,并且每一行的点亮点数相同,则若一行点亮的时间所占比重越大,则这一行看上去亮度相对较大,因为有更充足的时间让LED施放能量;反之,若一行点亮的时间所占比重越小,则这一行看上去亮度相对较小。增加某一行的显示时间的最简单方法就是增加其循环次数,以我的程序为例,要增加某一行的点亮时间,只需在这一行的字模数据和行选通数据被锁存之后加长DELAY子程序的延迟时间,如循环执行X次原DELAY程序,X为这一行的点亮LED数。获得X的子程序可如下编写:GETX:MOV C, #0MOV R4, #8MOV R5, #0MOV A, ROWHROLL1:RRC AJNC NEXTX1INC R5NEXTX1:DJNZ R4, ROLLMOV R4, #8MOV A, ROWLROLL2:RRC AJNCNEXTX2INC R5NEXTX2:DJNZ R4, ROLL2;RET这样,X就会被保存在R5中,再如下修改DELY子程序:DELAY:MOVR6, R5LOOP1:MOVR7, #0F8HLOOP2:DJNZR7, LOOP2DJNZR6, LOOP1;RET这样,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的点阵上,这种的切换是无法被察觉的,产生的效果就是无缝衔接的滚动。专心-专注-专业
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!