4.3.1程序框图
开始 建立“欢迎使用星研实验仪”字符表 初始化8255,PA、PB、PC口为输出口 初始化8155,PA口为输出口 R2R3->8255的PA、PB 测试16*16 LED是否全亮 取字符表中数据->A 延时 熄灭16*16 LED 取字符表中数据->A 延时 字符数->计数器0 字符表首地址->DPTR A的0..7位调整到A的7..0位 A->8155的PA(右边行) 延时10ms R3R2循环左移一位 A的0..7位调整到A的7..0位 A->8255的PC口(左边行) 开始 8->计数器2(一屏刷新8次) 16->计数器3 OFFFEH->R3R2(允许显示第一行) 16->计数器1(一屏行数) 显示一屏子程序 DPTR=DPTR+2 N 计数器3 -1=0 Y 计数器2 -1=0 N Y 返回 计数器1 – 1 = 0 N Y
N Y 计数器0 – 1 = 0
图4 程序流程图
通过定时中断使程序进入显示程序,显示驱动程序在进入中断后首先要对定时器T0重新赋初值,以保证显示屏刷新率的稳定,定时的大小一显示稳定不闪烁为准。
然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打入输出锁存器并锁存,然后再输出新的行号,重新打开显示。
4.3.2程序总体设计
显示软件模块分为:初始化模块、测试模块、、扫描模块、多字滚动模块、显示模
- - 6 - -
课程设计
块。显示程序的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。软件设计中,显示屏的软件系统分为两层;第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其他控制信号,配合完成LED显示屏的扫描显示工作。显示驱动器程序由定时器T0中断程序实现。系统应用程序完成系统环境设置(初始化)、显示效果处理等工作,由主程序来实现。
显示驱动程序在进入中断后首先要对定时器T0重新赋初值,以保证显示屏刷新率的稳定,1/16扫描显示屏的刷新率(帧频)计算公式如下:
刷频率(帧频)=1/16×T0溢=1/16×f/12(65536-t)
*其中f位晶振频率,t为定时器T0初值(工作在16位定时器模式)。
然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打入输出锁存器并锁存,然后再输出新的行号,重新打开显示。
系统主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口;然后以“卷帘出”效果显示图形,停留约几秒;接着向上滚动显示“欢迎使用星研实验”这几个汉字,然后以“卷帘入”效果隐去文字。由于单片机没有停机指令,所以可以设置系统程序不断的循环执行上述显示效果。
单元显示屏可以接收来自控制器(主控制电路板)或上一级显示单元模块传输下来的数据信息和命令信息,并可将这些数据信息和命令信息不经任何变化地再传送到下一级显示模块单元中,因此显示板可扩展至更多的显示单元,用于显示更多的显示内容。如果想改变些事内容,先用字模产生字代码,将用这段代码覆盖原来的代码,即可显示你想要的内容。
5 调试过程
调试主要分为硬件调试和软件调试。 5.1 硬件调试
首先检查实验仪是否能够正常使用。在实验仪断电情况下,严格按照前面硬件设计中的接线说明进行接线。最后连接下载线和电源线。
5.2 软件调试 在实验仪通电,PC与实验仪连接的情况下,使用星研软件调用已设计好的程序进行硬件测试。
在调试过程中出现倒叙、字体相反、字体显示不完整、闪烁等现象,经检查是由
于排线接线顺序错误。
6 结果分析与心得体会
6.1结果分析
经调试,16X16LED点阵已经能正常循环显示“欢迎使用星研实验仪”,无闪烁现象。每个字停留大约1S。显示的文字较稳定、清晰。文字向上滚动显示。基本达到了设计要求。
本系统具有硬件少,结构简单,容易实现,性能稳定可靠,成本低等特点。可以直接应用与实际生产和生活当中,非常实用。
- - 7 - -
课程设计
6.2心得与体会
一、在这次点阵设计的过程让我进一步熟悉星研软件的使用。
二、本次调试中结果由于不能完全了解个电子器件、造成线路连接错误。 三、通过这次点阵设计,重新复习并进一步学习了51系列单片机,明确了研究目标。 四、本文设计的LED显示屏能够实现在目测条件下LED显示屏各点亮度均匀、充
足,可显示图形和文字,显示图形和文字应稳定、清晰无串扰。图形或文字以移入或移出方式显示。
五、在以后的设计中,既要想到电路器件的联合使用,又要灵活变通,举一反三。
安全规范使用实验仪。加强动手能力和自主学习能力。
7 附录:整体程序
;用8255的PA、PB、PC口和8155的PA口做LED16*16点阵显示实验 A8255_PA XDATA 0FF00H ;8255的A0、A1接总线的A0、A1 A8255_PB XDATA 0FF01H ; A8255_PC XDATA 0FF02H A8255_CTL XDATA 0FF03H A8155_PA XDATA 0E101H ;8155的IO/M接P2.0 A8155_CTL XDATA 0E100H LINE1 XDATA A8255_PA ;列线1 LINE2 XDATA A8255_PB ;列线2 ROW1 XDATA A8255_PC ;行线1 ROW2 XDATA A8155_PA ;行线2 ORG 0000H AJMP START ORG 0100H START: MOV SP,#60H CALL INIT_IO CALL TEST_LED ;调用测试子程序,测试LED是否全亮 CALL CLEAR ;滚动显示多个字符
CHS_SHOW: MOV R7,#9 ;显示(R3)个字符 MOV DPTR,#CHAR_TAB CHS_1: MOV R1,#16 ;移动16次 CHS_2: ACALL DISP_CH ;显示一桢 INC DPTR INC DPTR DJNZ R1,CHS_2 DJNZ R7,CHS_1 SJMP CHS_SHOW
;显示一个16*16点阵字子程序,字型码放在DPTR指出的地址,显示时间为20*R7MS DISP_CH: PUSH 07H
- - 8 - -
课程设计
MOV R7,#08H DISP_CH_1: ACALL DISP1 DJNZ R7,DISP_CH_1 POP 07H RET
;显示一个16*16点阵字子程序,字型码放在显示缓冲区XBUFF DISP1: PUSH DPL PUSH DPH MOV R6,#16 ;计数器,16列依次被扫描 MOV R2,#0FEH ;上8行输出值 MOV R3,#0FFH ;下8行输出值 REPEAT: MOV P2,#HIGH(LINE1) MOV R0,#LOW(LINE1) MOV A,R2 MOVX @R0,A ;上8行输出 MOV R0,#LOW(LINE2) MOV A,R3 MOVX @R0,A ;下8行输出 CLR A MOVC A,@A+DPTR INC DPTR ACALL ADJUST ;调整A,将A中二进制数旋转180度 MOV R0,#LOW(ROW1) MOVX @R0,A ;左边列输出 CLR A MOVC A,@A+DPTR INC DPTR ACALL ADJUST ;调整A,将A中二进制数旋转180度 MOV P2,#HIGH(ROW2) MOV R0,#LOW(ROW2) MOVX @R0,A ;右边列输出 ACALL DL10ms ACALL CLEAR SETB C ;循环移位R2R3,行线扫描输出0 MOV A,R2 RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A DJNZ R6,REPEAT POP DPH POP DPL
- - 9 - -
课程设计
RET
;8155和8255初始化
INIT_IO: MOV DPTR,#A8255_CTL ;8255控制字地址 MOV A,#80H ;设置8255的PA、PB、PC口为输出口 MOVX @DPTR,A ;写控制字 MOV DPTR,#A8155_CTL ;8155控制字地址 MOV A,#00000011B ;设置8155的PA口为输出 MOVX @DPTR,A ;写控制字 RET
CLEAR: MOV A,#0FFH MOV P2,#HIGH(LINE1) MOV R0,#LOW(LINE1) MOVX @R0,A MOV R0,#LOW(LINE2) MOVX @R0,A CLR A MOV R0,#LOW(ROW1) MOVX @R0,A MOV P2,#HIGH(ROW2) MOV R0,#LOW(ROW2) MOVX @R0,A RET
;调整A中取到的字型码的一个字节,将最高位调整位最低位,最低位调整为最高位 ADJUST: MOV R5,#8 ;循环移位8次实现 ADJUST1: RLC A XCH A,B RRC A XCH A,B DJNZ R5,ADJUST1 MOV A,B RET
;测试LED子程序,点亮LED并延时1S TEST_LED: MOV DPTR,#LINE1 CLR A MOVX @DPTR,A MOV DPTR,#LINE2 MOVX @DPTR,A MOV DPTR,#ROW1 MOV A,#0FFH MOVX @DPTR,A
- - 10 - -