|
;显示字用查表法,不占内存,用四个16*16共阳LED点阵显示,
;效果:向上滚动显示字,每次四个,重复循环。
;R2:行扫描地址(从00-0FH)。
;R3:滚动显示时控制移动速度,也可控制静止显示的时间。
;************;
;中断入口程序;
;************;
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
;
;************;
; 初始化程序 ;
;************;
;
;
;************;
; 主程序 ;
;************;
;
START: MOV 20H,#00H ;清标志,00H为1帧扫描结束标志
MOV A,#0FFH ;端口初始化
MOV P1,A
MOV P2,A
MOV P3,A
MOV P0,A
CLR P1.6 ;串行寄存器打入输出端控制位
MOV TMOD,#01H ;使用T0作16位定时器,行扫描用。
MOV TH0,#0FCH ;1ms初值(12MHZ)
MOV TL0,#18H
MOV SCON,#00H ;串口0方式传送显示字节
MOV IE,#82H ;T0中断允许,总中断允许
MOV SP,#70H
LCALL DIS1 ;显示准备,黑屏,1.5秒
MAIN: MOV DPTR,#TAB
LCALL MOVDISP ;逐排显示,每次四字)
MOV DPTR,#TAB
LCALL MOVDISP1 ;滚动显示,每排四字)
AJMP MAIN
;
;
;********************;
; 四字逐排显示子程序 ;
;********************;
;每次四字移入移出显示方式,入口时定义好DPTR值
;
MOVDISP: MOV R1,#6 ;显示6排字,每排四字(R1=排数)
DISLOOP: MOV R3,#100 ;每排显示时间1.6*100=1.6S
DISMOV: MOV R2,#00H ;第0行开始
SETB TR0 ;开扫描(每次一帧)
WAITMOV: JBC 00H,DISMOV1 ;标志为1扫描一帧结束(16毫秒为1帧,每行1毫秒)
AJMP WAITMOV
DISMOV1: DJNZ R3,DISMOV ;1帧重复显示(控制显示时间)
MOV A,#128 ;显示字指针移一排(每排4字*32=128)
ADD A,DPL ;
MOV DPL,A
MOV A,#0
ADDC A,DPH
MOV DPH,A
DEC R1 ;R1为0,显示完
MOV A,R1
JZ MOVOUT ;
AJMP DISLOOP ;
MOVOUT: RET ;移动显示结束
;
;********************;
; 四字滚动显示子程序 ;
;********************;
;每排四字向上移出显示方式,入口时定义好DPTR值
;
MOVDISP1: MOV R1,#255 ;向上移动显示6排字,每排四字(R1=排数*16)
DISLOOP1: MOV R3,#10 ;移动速度1.6*10=0.16S
DISMOV2: MOV R2,#00H ;第0行开始
SETB TR0 ;开扫描(每次一帧)
WAITMOV1: JBC 00H,DISMOV3 ;标志为1扫描一帧结束(16毫秒为1帧,每行1毫秒)
AJMP WAITMOV1
DISMOV3: DJNZ R3,DISMOV2 ;1帧重复显示(控制移动速度)
INC DPTR ;显示字指针移一行(二字节位置)
INC DPTR
DEC R1 ;R1为0,显示完
MOV A,R1
JZ MOVOUT1 ;
AJMP DISLOOP1 ;
MOVOUT1: RET ;移动显示结束
;
;
;*****************;
; 四个字显示子程序 ;
;*****************;
;静止显示表中某四个字
DIS1: MOV R3,#5AH ;静止显示时间控制(16MS*#=1.6秒)
DIS11: MOV R2,#00H ;一帧扫描初始值(行地址从00-0FH)
MOV DPTR,#TAB ;取表首址
SETB TR0 ;开扫描(每次一帧)
WAIT11: JBC 00H,DIS111 ;为1,扫描一帧结束
AJMP WAIT11
DIS111: DJNZ R3,DIS11
RET
;
;
;************;
; 扫描程序 ;
;************;
;1MS传送一行,每行显示1毫秒,一次传送四个字的某行共8个字节.
;
INTT0: PUSH ACC
MOV TH0,#0FCH ;1ms初值重装
MOV TL0,#18H
MOV A,#97 ;指向第四个字行右字节
ADD A,DPL
MOV DPL,A
MOV A,#0
ADDC A,DPH
MOV DPH,A
MOV A,#0
MOVC A,@A+DPTR ;查表
MOV SBUF,A ;串口0方式发送
WAIT: JBC TI,GO ;等待发送完毕
AJMP WAIT ;
GO: MOV A,DPL ;指向第四个字行左字节
SUBB A,#1
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
MOV A,#0
MOVC A,@A+DPTR
MOV SBUF,A
WAIT1: JBC TI,GO1
AJMP WAIT1
;
GO1: MOV R0,#03H
MLOOP: MOV A,DPL ;指向前三个字行右字节
SUBB A,#31
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
MOV A,#0
MOVC A,@A+DPTR ;查表
MOV SBUF,A ;串口0方式发送
WAIT2: JBC TI,GO2 ;等待发送完毕
AJMP WAIT2 ;
GO2: MOV A,DPL ;指向前三个字行左字节
SUBB A,#1
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
MOV A,#0
MOVC A,@A+DPTR
MOV SBUF,A
WAIT3: JBC TI,GO3
AJMP WAIT3
GO3: DJNZ R0,MLOOP ;执行三次
;
;
SETB P1.7 ;关行显示,准备涮新
NOP ;串口寄存器数据稳定
SETB P1.6 ;产生上升沿,行数据打入输出端
NOP ;
NOP ;
CLR P1.6 ;恢复低电平
MOV A,R2 ;修改显示行地址
ORL A,#0F0H ;修改显示行地址
MOV R2,A ;修改显示行地址
MOV A,P1 ;修改显示行地址
ORL A,#0FH ;修改显示行地址
ANL A,R2 ;修改显示行地址
MOV P1,A ;修改完成
CLR P1.7 ;开行显示
INC R2 ;下一行扫描地址值
INC DPTR ;
INC DPTR ;下一行数据地址
MOV A,R2
ANL A,#0FH
JNZ GO4
SETB 00H ;R2为10H,现为末行扫描,置1帧结束标志
MOV A,DPL ;指针修正为原帧初值
SUBB A,#32
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
CLR TR0 ;一帧扫描完,关扫描
GO4: POP ACC
RETI ;退出
;
;
;***************;
; 扫描文字表 ;
;***************;
; 共五排字,每排四个字,前后为黑屏
TAB: DB ;黑屏
;黑屏
;黑屏
;单
;片
;机
;是
;工
;业
;中
;最
;基
;本
;的
;应
;用
;方
;式
;我
;爱
;单
;片
;机 |
|