ORG 0000H
AJMP MAIN
ORG 0003H
AJMP EX0INT
ORG 000BH
AJMP T0INT
ORG 0030H
MAIN: MOV TMOD,#01H
SETB EA
SETB EX0 ;外中断EX0接按键
SETB IT0 ;下降沿触发
SETB ET0 ;定时器和T0,10MS中断,作为按键防抖延时
SETB TR0
MOV TH0,#0D8H ;10MS定时常数
MOV TL0,#0F0H
MAIN1: MOV DPTR,#TAB ;字码表初址赋值
MOV R0,#2
MOV R1,#0FEH ;列控制码
MOV R3,#8 ;列数
MOV R4,#128 ;移动" "及 MY QQ等19个字符,,中间3 个空格及"I"算1屏。以128屏计
CM: JNB F0,$ ;判断按键标志位,0暂停,1流动
MOV R5,#4 ;每屏反复显示4次
MOV R3,#8 ;列数
C1: MOV R2,#0 ;取字指针(反向,指针从最后一个字节开始,即#150)
C8: MOV P2,#0FFH ;关显示
MOV A,R2 ;
MOVC A,@A+DPTR ;取当前列的显示字码的一个字节
MOV P0,A ;送1~8行控制口
INC R2 ;(反向,指针-1)
MOV A,R1
MOV P2,A ;送列控制码
ACALL D5MS ;显示5MS
RL A ;列控制码左移,显示下一列(RR A,则从左向右流动)
MOV R1,A
DJNZ R3,C8 ;未显示8 列,继续
MOV R3,#8
DJNZ R5,C1 ;未显示4次,继续
INC DPTR ;一屏反复显示5次完,字码表初值加1(DPTR要-1)
DJNZ R4,CM ;128屏未移动完,继续
AJMP MAIN1 ;128屏显示完,返回,重新从" "开始显示
EX0INT: JNB 7FH,RTI ;10MS未到,跳出中断
CPL F0 ;10MS到,按键标志位求反。0 暂停。1 流动
RTI: RETI
T0INT: MOV TH0,#0D8H ;重置定时常数
MOV TL0,#0F0H
SETB 7FH ;位寻址的2FH的最高位7FH,作10MS到标志位,置1
RETI
D5MS: MOV R6,#10
MOV R7,#248
DJNZ R7,$
DJNZ R6,$-4
RET
TAB: ;(0) M(1) Y(2) (3) Q(4) Q(5) (6) I(7)
; S(8) (9) 5(10) 7(11) 8(12) 7(13) 4(14) 3(15)
; 9(16) 3(17) 3(18)
DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H;" ",0
DB 0FFH, 00EH, 070H, 0C0H, 078H, 006H, 0FFH, 000H;"M",1
DB 001H, 003H, 00CH, 0F8H, 00CH, 003H, 001H, 000H;"Y",2
DB 000H;" ",3
DB 000H, 03EH, 0C3H, 081H, 0A1H, 0C3H, 07EH, 000H;"Q",4
DB 000H, 03EH, 0C3H, 081H, 0A1H, 0C3H, 07EH, 000H;"Q",5
DB 000H;" ",6
DB 000H, 0FFH,000H, 000H;"I",7
DB 066H, 0C9H, 089H, 089H, 091H, 091H, 062H, 000H;"S",8
DB 000H;" ",9
DB 000H, 04FH, 085H, 085H, 085H, 085H, 079H, 000H;"5",10
DB 000H, 001H, 001H, 081H, 071H, 01DH, 003H, 000H;"7",11
DB 000H, 036H, 0C9H, 089H, 089H, 089H, 0D9H, 026H;"8",12
DB 000H, 001H, 001H, 081H, 071H, 01DH, 003H, 000H;"7",13
DB 000H, 030H, 038H, 02CH, 026H, 021H, 0FFH, 020H;"4",14
DB 000H, 062H, 081H, 081H, 089H, 089H, 076H, 000H;"3",15
DB 000H, 04EH, 091H, 091H, 091H, 053H, 03EH, 000H;"9",16
DB 000H, 062H, 081H, 081H, 089H, 089H, 076H, 000H;"3",17
|