实验三 点阵显示屏的控制.docx
《实验三 点阵显示屏的控制.docx》由会员分享,可在线阅读,更多相关《实验三 点阵显示屏的控制.docx(10页珍藏版)》请在冰豆网上搜索。
实验三点阵显示屏的控制
实验三点阵显示屏的控制
一、实验目的
1、熟悉KeiluVision2软件的使用;
2、掌握单片机并行I/O口应用及点阵模块的控制;
3、掌握查表指令、循环程序结构;
4、掌握程序与流程图的对应关系。
二、实验设备及仪器
KeilμVision2软件;单片机开发板;PC机一台
三、实验原理及内容
1、点阵模块电路原理图,如图3.1所示。
图3.1点阵模块原理图
U4、U9的74HC573芯片是8位三态输出锁存器,分别作为点阵的行、列输入端。
根据1088BS点阵模块的内部结构(如图3.2),对应的行为高电平控制,对应的列为低电平控制。
P1.1点阵列、数码管位控制端(74HC573锁存器U9)
P1.3点阵行控制端(74HC573锁存器U4)
图3.21088BS点阵模块内部结构
2、实验内容
点阵显示有多种形式,例如固定显示、闪烁显示、滚动显示、交替显示等,先从最简单的固定显示一个字符做起。
训练内容一:
“大”字的静态显示。
(1)设计思路:
先选中点阵的某一行,然后通过查表指令得到这一行对应的字型码(列锁存器的输出,控制这一行要点亮的状态),延时1ms后,选中下一行,再传送对应列的字型码,重复上述过程,直至完成8行的扫描。
然后,再从第一行开始循环。
利用视觉驻留效应,人眼看到的是一个静态的显示效果。
上述逐行扫描显示过程示意图,如下:
程序流程图,如图3.3所示。
图3.3静态显示“大”字的程序流程图
(2)列字型码的编排:
“大”字显示字型码示意图,如图3.4。
图3.4“大”字型码示意图
根据“大”字显示字型码示意图和查表指令中表格数据的构建原则,将字型码依次存放在表格TAB1所指定的ROM单元中。
TAB1:
DB11110111B,11110111B,10000000B,11110111B,11101011B
DB11011101B,10111110B,11111111B
或写成TAB1:
DB0F7H,0F7H,80H,0F7H,0EBH,0DDH,0BEH,0FFH
(3)静态显示“大”字的参考程序如下:
ORG00H
AJMPMAIN
MAIN:
SETBP1.0;数码管段控制(锁存器U8输入端有效)
SETBP1.2;LED流水灯模块控制(锁存器U7输入端有效)
MOVP0,#0FFH;关闭LED灯
CLRP1.2;关闭LED流水灯模块(锁存器U7输入端高阻态)
MOVP0,#0;关闭数码管段
CLRP1.0;关闭数码管段模块(锁存器U8输入端高阻态)
LOOP:
MOVDPTR,#TAB1;列字型码的表首地址
MOVR0,#01H;行号
MOVR1,#00H;列号
MOVR3,#08H;一个周期内扫描8行
NEXT:
SETBP1.3;点阵行锁存器U4的输入端有效
MOVA,R0
MOVP0,A;选中某一行
RLA
MOVR0,A;更新行号
CLRP1.3;点阵行锁存器U4的输入端处于高阻态
SETBP1.1;点阵列锁存器U9的输入端有效
MOVA,R1
MOVCA,@A+DPTR
MOVP0,A
INCR1;修改列号
LCALLDELAY;延时1ms
CLRP1.1;点阵列锁存器U9的输入端处于高阻态
DJNZR3,NEXT;判断是否完成8行扫描
SJMPLOOP;循环显示
DELAY:
MOVR4,#250;实现延时1ms子程序
D1:
NOP
NOP
DJNZR4,D1
RET
TAB1:
DB0F7H,0F7H,80H,0F7H,0EBH,0DDH,0BFH,0FFH;列字型码
END
问1:
若将程序中的SJMPLOOP改为SJMP$,将会出现什么现象?
问2:
若要显示“小”字,如何修改程序?
训练内容二:
“大”字的滚动显示(从一个方向出现,滚动到另一个方向消失,并不断重复该过程)。
(1)滚动显示原理
根据滚动显示的特点,滚动显示实际上是多屏循环显示。
需要分两步实现:
①确定出每一屏的字型码;
为了实现“大”字从右到左滚动显示效果,第1屏显示的应该只是“大”字最左边一列,如图3.5(a)所示。
第2、3屏显示,如图3.5(b)、(c)所示。
(a)第1屏显示
(b)第2屏显示
(c)第3屏显示
图3.5第1~3屏显示及列字型码
从“大”字从右边出现,到“大”字从左边消失,总共需要15屏。
8个字型码一屏,15屏需要定义15×8个字型码,图3.5中的1~3屏字型码的定义如下:
TAB1:
DB0FFH,0FFH,7FH,0FFH,0FFH,0FFH,7FH,0FFH;第1屏
DB0FFH,0FFH,3FH,0FFH,0FFH,7FH,0BFH,0FFH;第2屏
DB0FFH,0FFH,1FH,0FFH,7FH,0BFH,0DFH,0FFH;第3屏
利用查表指令读取每一屏的数据:
读取第1屏的数据时,MOVDPTR,#TAB
读取第2屏的数据时,DPTR+8DPTR
读取第3屏的数据时,在第2屏的基础上DPTR+8DPTR
依次类推。
由于MCS-51系列单片机是8位单片机,没有16位的加法指令,且加法指令的第一操作数必须是累加器A,因此DPTR+8DPTR只能分步实现:
DPLA
A+8A
ADPL
DPHA
A+CYA
ADPH
②确定每一屏显示需保持时间(滚动时间的快慢)。
每一屏变换时间必须要大于人眼视觉驻留时间,否则眼睛无法识别。
根据静态显示实验,每屏显示一次需要时间大概8ms,若每屏要显示50次,即每屏的显示时间约为50×8ms=0.4s,显然改变每屏显示的次数就可以改变每屏显示的时间。
(2)滚动显示“大”字流程图
图3.6滚动显示“大”字的流程图
(3)滚动显示“大”字的参考程序如下:
ORG00H
AJMPMAIN
MAIN:
SETBP1.0;数码管段控制(锁存器U8输入端有效)
SETBP1.2;LED流水灯模块控制(锁存器U7输入端有效)
MOVP0,#0FFH;关闭LED灯
CLRP1.2;关闭LED流水灯模块(锁存器U7输入端高阻态)
MOVP0,#0;关闭数码管段
CLRP1.0;关闭数码管段模块(锁存器U8输入端高阻态)
LOOP1:
MOVDPTR,#TAB1;列字型码的表首地址
MOVR5,#15;15屏滚动显示
LOOP2:
MOVR6,#50;每屏显示次数
LOOP3:
MOVR0,#01H;行号
MOVR1,#00H;列号
MOVR3,#08H;一个周期内扫描8行
NEXT:
SETBP1.3;点阵行锁存器U4的输入端有效
MOVA,R0
MOVP0,A;选中某一行
RLA
MOVR0,A;更新行号
CLRP1.3;点阵行锁存器U4的输入端处于高阻态
SETBP1.1;点阵列锁存器U9的输入端有效
MOVA,R1
MOVCA,@A+DPTR
MOVP0,A
INCR1;修改列号
LCALLDELAY;延时1ms
CLRP1.1;点阵列锁存器U9的输入端处于高阻态
DJNZR3,NEXT;判断是否完成8行扫描
DJNZR6,LOOP3;判断每屏的显示次数50次是否到了?
MOVA,DPL;修改表首地址,准备读取下一屏数据
ADDA,#8
MOVDPL,A
MOVA,DPH
ADDCA,#0
MOVDPH,A
DJNZR5,LOOP2;判断15屏都显示完了?
SJMPLOOP1;循环显示
DELAY:
MOVR4,#250;实现延时1ms子程序
D1:
NOP
NOP
DJNZR4,D1
RET
TAB1:
DB0FFH,0FFH,7FH,0FFH,0FFH,0FFH,7FH,0FFH;第1屏
DB0FFH,0FFH,3FH,0FFH,0FFH,7FH,0BFH,0FFH;第2屏
DB0FFH,0FFH,1FH,0FFH,7FH,0BFH,0DFH,0FFH;第3屏
DB7FH,7FH,0FH,7FH,0BFH,0DFH,0EFH,0FFH;第4屏
DB0BFH,0BFH,07H,0BFH,5FH,0EFH,0F7H,0FFH;第5屏
DB0DFH,0DFH,03H,0DFH,0AFH,77H,0FBH,0FFH;第6屏
DB0EFH,0EFH,01H,0EFH,0D7H,0BBH,7DH,0FFH;第7屏
DB0F7H,0F7H,80H,0F7H,0EBH,0DDH,0BEH,0FFH;第8屏
DB0FBH,0FBH,0C0H,0FBH,0F5H,0EEH,0DFH,0FFH;第9屏
DB0FDH,0FDH,0E0H,0FDH,0FAH,0F7H,0EFH,0FFH;第10屏
DB0FEH,0FEH,0F0H,0FEH,0FDH,0FBH,0F7H,0FFH;第11屏
DB0FFH,0FFH,0F8H,0FFH,0FEH,0FDH,0FBH,0FFH;第12屏
DB0FFH,0FFH,0FCH,0FFH,0FFH,0FFH,0FEH,0FFH;第13屏
DB0FFH,0FFH,0FEH,0FFH,0FFH,0FFH,0FEH,0FFH;第14屏
DB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;第15屏
END
问3:
编制程序,使得点阵上依次显示0~9。
问4:
滚动显示“大”、“小”2个字符。