|
这个是论坛里面的一个16*32的程序,行选通用的154,列用的595 。我不太明白是如何查表送数并显示到点阵屏上的,希望谁能帮我看下。我是初学者,只道道595是串行输入,通过脉冲信号和对用的码表传数据,希望谁能帮我下。。。最好以“欢迎”为例子对应说下,谢谢了,如何取消左移显示两个汉字。
16*32点阵左移显示程序(汇编),如外接64KROM可以显示2000多个汉字 由于限制上传字数后面的码表没有传
行154,列595
;============================================
; 16*32点阵屏左滚动显示n个汉字程序
;============================================
D_F EQU 40H ;第一个显示数据缓冲器
D_MB EQU 30H ;数据位移动次数寄存器
D_AM EQU 31H ;显示半角字个数寄存器
DAMT EQU 32H ;显示半角字个数倍数寄存器
OFFSET EQU 33H ;数据指针偏移量
SPEED EQU 34H ;移动速度寄存器
S_I BIT P1.4 ;数据总线
RCK BIT P1.5 ;锁存信号线
SCK BIT P1.6 ;移位时钟信号线
EN BIT P1.7 ;消隐信号线
;--------程序入口地址----------------
ORG 0000H
JMP START
ORG 0030H
;====================================
; 初始化
;====================================
START:
MOV SP, #0AH ;修改堆栈指针
CLR A ;清累加器
MOV R7, #5
MOV R0, #D_F
ST1: MOV @R0, A
INC R0
DJNZ R7, ST1
MOV R7, #20H
MOV R0, #D_MB
ST2: MOV @R0, A
INC R0
DJNZ R7, ST2 ;寄存器清0
MOV P1, #00H
MOV DPTR, #DTAB ;数据表首地址放入DPTR
MOV DAMT, #1 ;显示的半角字的个数的倍数
MOV SPEED, #1
;====================================
; 主程序
;====================================
MAIN:
MOV R5, #16 ;扫描16行
MOV OFFSET, #00H ;数据指针偏移量清0
MA1: CALL QUSHU ;调用取数子程序
SETB EN ;关显示
DEC P1 ;修改行值
CLR RCK
SETB RCK ;锁存显示数据
CLR EN ;开显示
DJNZ R5, MA1 ;16行未完继续
DJNZ SPEED, MAIN
MOV SPEED, #4 ;移动速度
INC D_MB
MOV A, D_MB
CJNE A, #8, M_OUT
MOV D_MB, #0 ;1个半角字符要移动8次
MOV A, #16
ADD A, DPL
MOV DPL, A
CLR A
ADDC A, DPH
MOV DPH, A ;地址指针修改
INC D_AM
MOV A, D_AM
CJNE A, #151, M_OUT ;显示的半角字符的个数
MOV D_AM, #00H
DJNZ DAMT, M_OUT
MOV DAMT, #1 ;显示的半角字的个数的倍数
MOV DPTR, #DTAB ;循环滚动显示
MOV P1, #00H
M_OUT: JMP MAIN
;===================================
; 取出并发送一行数据子程序
;===================================
QUSHU:
MOV R7, #9 ;取出半角字数据的个数
MOV R0, #D_F ;数据缓冲区首地址存入R0
PUSH DPH
PUSH DPL ;数据保护
MOV A, OFFSET ;查表偏移量放入A
QUSH1: ADD A, DPL
MOV DPL, A
MOV A, DPH
ADDC A, #00H
MOV DPH, A
CLR A
MOVC A, @A+DPTR ;查表取数
MOV @R0, A ;存储数据
INC R0 ;修改地址指针
MOV A, #16 ;修改查表偏移量
DJNZ R7, QUSH1 ;数据未取完继续
POP DPL
POP DPH
INC OFFSET ;查表偏移量+1
;-----------------------------------
; 数据发送子程序
;-----------------------------------
DSEND:
MOV R0, #D_F ;第一个显示数据缓冲区地址放人R0
MOV R6, #8 ;发送n字节(1行)
DSE1: MOV R7, #8 ;每次发送8位
MOV A, @R0 ;显示数据放入A
DSE2: RLC A ;将A的内容按位移入C
MOV S_I, C ;将C的内容送数据总线
CLR SCK
SETB SCK ;输出移位脉冲
DJNZ R7, DSE2 ;8位未发送完继续
INC R0 ;修改地址指针
DJNZ R6, DSE1 ;字节数未发送完继续
;--------屏幕左移一位---------------
MOV A, D_MB ;移动位次数放入A
JZ TAMEND ;为0转移
MOV R7, D_MB ;移动位次数放入R7
MOV A, @R0 ;移入的数据存入A
DSE3: RLC A ;将A的内容按位移入C
MOV S_I, C ;将C的内容送数据总线
CLR SCK
SETB SCK ;输出移位脉冲
DJNZ R7, DSE3 ;移位次数未完继续
;--------移位时间修正---------------
TAMEND: CLR C ;清C
MOV A, #7
SUBB A, D_MB ;需要再延时的次数
JZ D_OUT
MOV R7, A
TA1: NOP
NOP
NOP
NOP
NOP
DJNZ R7, TA1 ;空操作(延时)
D_OUT: RET
;====================================
; 文字编码表
;====================================
DTAB:
DB 07FH,07FH,07FH,001H,0FBH,0B7H,0BFH,0BFH,0BFH,09FH,05FH,06FH,0E7H,0F1H,0FBH,0FFH;"欢",0
DB 0BFH,0DEH,0C9H,0DBH,0FBH,0FBH,01BH,0DBH,0DAH,0D9H,0DBH,0DFH,0DFH,0AFH,070H,0FFH;
DB 0FFH,07FH,083H,0BBH,0BBH,0BBH,0BBH,0BBH,0BBH,0ABH,0B7H,0BFH,0BFH,0FFH,001H,0FFH;"迎",0
DB 0FEH,0DEH,0E6H,0F2H,0F6H,0FEH,080H,0FBH,0FBH,0FBH,0FBH,0F7H,0F7H,0EFH,0DFH,0BFH;
END
|
|