MOV DPTR, #POINT_TAB ;置表首地址
MOV R3, #35 ;比要显示的总字节数少7。
P_WORD_MOVE:
MOV R2, #20 ;每个字符循环扫描的次数,决定显示移动速度。
P_SCAN_DEGREE:
ACALL P_WORD_SCAN ;调帧扫描程序
DJNZ R2, P_SCAN_DEGREE ;反复扫描同一帧
INC DPTR ;帧数据地址前移一行
DJNZ R3, P_WORD_MOVE ;扫描一场的全部字符
AJMP START
; Scan function
P_WORD_SCAN: MOV R1, #00H ;置表地址偏移指针初值
MOV R5, #10111111B ;置行扫描字
MOV R4, #07 ;置行扫描次数
P_NEXT_BIT:
MOV A, R1
MOVC A, @A+DPTR ;取一个列数据
ACALL P_COL_SEND ;发送列数据
MOV A,R5 ;取行扫描字
ACALL P_ROW_SEND ;显示一行
ACALL DELAY ;维持点亮一行
MOV A, R5
RR A ;扫描字指向下一行
MOV R5, A
INC R1 ;指向下一行的列数据
DJNZ R4, P_NEXT_BIT ;一帧7行数据扫描完否?未完再扫
RET
; Send data for col display.
P_COL_SEND:
MOV R0,#05H ;置列计数值
P_COL_NEXTBIT:
CLR P_COL_CLK ;列时钟线置低
RRC A ;带进位循环移出数据最低位至进位位
MOV P_COL_DATA,C ;送一位数据至列发送端口
SETB P_COL_CLK ;列时钟线置高,串行发送一位列数据
DJNZ R0,P_COL_NEXTBIT ;一列数据发完否?未完再发
RET
; Send data for Row select
P_ROW_SEND:
CLR P_ROW_CS ;关闭74HC595输出寄存器
MOV R0,#08H ;置行计数值
P_ROW_NEXTBIT:
CLR P_ROW_CLK ;行时钟线置低
RRC A ;带进位循环移出控制字最低位至进位位
MOV P_ROW_DATA,C ;送一位数据至行发送端口
SETB P_ROW_CLK ;行时钟线置高,串行发送一位行数据
DJNZ R0,P_ROW_NEXTBIT ;一行数据发完否?未完再发
SETB P_ROW_CS ;开启74HC595输出寄存器
RET
DELAY:
MOV R7,#30
DELAY_LOOP:
MOV R6,#30
DJNZ R6,$
DJNZ R7,DELAY_LOOP
RET
; Word model table
POINT_TAB:
DB 00H,00H,00H,00H,00H,00H,00H
DB 00H,0AH,0AH,0EH,0AH,0AH,00H ;H
DB 00H,0EH,08H,0EH,08H,0EH,00H ;E
DB 00H,08H,08H,08H,08H,0EH,00H ;L
DB 00H,08H,08H,08H,08H,0EH,00H ;L
DB 00H,0AH,15H,11H,0AH,04H,00H ;O
DB 00H,00H,00H,00H,00H,00H,00H
END