作者:未知 来源:89s52.cn
; *************************
; * 可在系统修改程序 *
; * 电子屏字符显示器 *
; * "电子设计" *
; *************************
; 四个显示字符数据表以在50H-6FH单元内,字符用8*8点阵,R4(30H)用于
; 控制显示静止字的时间,R5(31H)静止字显示跳转地址步距,B内放显示首址
;
T2CON EQU 0C8H ; T2 控制寄存器
T2MOD EQU 0C9H ;
TL2 EQU 0CCH ; T2 计数寄存器低字节
TH2 EQU 0CDH ; T2 计数寄存器高字节
TR2 EQU 0CAH ; T2 启动位
RCAP2L EQU 0CAH ; T2 计数重栽寄存器低字节
RCAP2H EQU 0CBH ; T2 计数重栽寄存器高字节
CHPCON EQU 0BFH ; 在系统编程控制寄存器
CHPENR EQU 0F6H ; 编程状态下 MTP ROM 的控制字节寄存器
SFRAL EQU 0C4H ; 编程状态下的目标低地址
SFRAH EQU 0C5H ; 编程状态下的目标高地址
SFRFD EQU 0C6H ; 编程状态下 MTP ROM 的编程数据
SFRCN EQU 0C7H ;
TXOKFLAG EQU 003H
;
;
ORG 0000H
LJMP START
;
;************;
;中断入口程序;
;************;
;
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
LJMP INTS
ORG 002BH
RETI
;
;初始化
CLEARMEN: MOV PSW, #00H ; 设第一组寄存器
MOV SP, #0F1H ; 设置堆栈指针
MOV SCON, #01010000B ; 串口工作方式1(8 BIT UART) 允许接收
MOV T2CON, #00110000B ; T2CON
MOV A,#0ECH
MOV TL2, A ;设置波特率 ( 19200)
MOV RCAP2L, A ;
MOV A,#0FFH
MOV TH2, A ;
MOV RCAP2H, A ;
SETB ES ; 允许串口中断
MOV IP, #00H ; 低优先级
SETB TR2 ; 启动定时计数器 2
SETB REN ; 启动串口接收中断
CLR TI ; 清串口发送中断标志位
CLR RI ; 清串口接收中断标志位
SETB EA ; 开放所有中断
RET
CLEARMEN1: MOV A,#0FFH
MOV P1,A
MOV P2,A
MOV P3,A
MOV P0,A
MOV DPTR,#TAB2
CLR A
MOV 20H,A
MOV 21H,A
MOV 22H,A
MOV 23H,A
MOV R3,A
MOV R1,#50H
MOV R2,#20H
CLLOOP: MOVC A,@A+DPTR
MOV @R1,A
MOV A,R3
INC A
MOV R3,A
INC R1
DJNZ R2,CLLOOP
MOV 30H,#0A0H
MOV 31H,#08H
RET
;
START: LCALL CLEARMEN ;初始化
LCALL CLEARMEN1
START1: LCALL DISP1
AJMP START1
PUTPASS: MOV DPTR,#PASSTBL ;
LCALL DISPINFO ;显示"Pass Error"
AJMP LOOP3 ;
APROM: LJMP APROMOUT ;
;
;
DISP1: MOV B,#50H
MOV R4,30H
MOV R5,31H
LOOP: JBC 04H,APROM ;进入4K-LDROM模式处理程序
JBC 05H,PUTPASS ;口令提示处理程序
LOOP3: LCALL DISPLAY
DJNZ R4,LOOP
MOV R4,30H
MOV A,B
CJNE A,#68H,CONT
RET
CONT: ADD A,R5
MOV B,A
AJMP LOOP
;
;
DISPLAY: MOV A,#0FFH
MOV P0,A
MOV P2,A
MOV R6,#0FEH
MOV R0,B
MOV R7,#08H
DISLOOP: MOV A,@R0
MOV P0,A
MOV P2,R6
LCALL DL1MS
INC R0
MOV A,R6
RL A
MOV R6,A
DJNZ R7,DISLOOP
RET
;
;
DL1MS: MOV R3,#0FFH ;256*4
LOOPK: NOP
NOP
DJNZ R3,LOOPK
RET
;
;
TAB1: DB 0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H ; 电
DB 0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH ; 子
DB 0B1H,0B5H,04H,0BFH,0B1H,0B5H,9BH,0A4H ; 设
DB 0BBH,0BBH,1BH,0A0H,0BBH,0BBH,9BH,0BBH ; 计
DB 00H,00H,00H,00H
;
TAB2: DB 0F7H,0EFH,0C1H,0D5H,000H,0D5H,0D9H,0BDH ;舟
DB 0FFH,0F7H,0F7H,0F7H,0D5H,0D5H,0C1H,0FFH ;山
DB 0F7H,0EFH,0C1H,0D5H,000H,0D5H,0D9H,0BDH ;舟
DB 0FFH,0F7H,0F7H,0F7H,0D5H,0D5H,0C1H,0FFH ;山
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 进入4K-LDROM的程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTS: PUSH PSW ;堆栈保护
PUSH ACC ;
PUSH B ;
MOV PSW,#08H ;启用第1组寄存器
JBC RI,RXINTS ;RI为1,接收中断,RI清0
JNB TI,INTSOUT ;TI为0,中断退出
CLR TI ;TI为1,先清0
SETB TXOKFLAG ;设发送OK标志
LJMP INTSOUT ;中断退出
;
RXINTS: MOV A,SBUF ;接收中断处理。
XRL A,#0DH ;是否回车符
JNZ PASSFLAG ;不是回车,口令出错处理
SETB 04H ;进入4K-LDROM标志置1
INTSOUT: POP B ;出栈
POP ACC ;
POP PSW ;
RETI ;中断退出
PASSFLAG: SETB 05H ;口令出错标志置1
LJMP INTSOUT ;中断退出
;
;口令出错提示表
PASSTBL: DB " pass ERROR ! ",0DH,0AH,0FFH,0FFH,0FFH,0FFH,0FFH
RET
; DPTR 内容是表的首址
; 显示表格内容
DISPINFO: CLR A ;
MOV R2, A ;
READDISPCODE: MOV A, R2 ;
MOVC A, @A+DPTR ; 查表
MOV R1, A ;
INC R2 ; 计数器加一
MOV A, R2 ;
JNZ READOVER ; 计数器溢出处理
INC DPH ;
READOVER: MOV A, R1 ;
INC A ;
JZ DISPINFOOUT ; 读到结束符结束
CLR TXOKFLAG ;
DEC A ;
LCALL PUTCHAR ; 发送字符
LJMP READDISPCODE ;
DISPINFOOUT: RET
; A 内容待发字符
PUTCHAR: CLR TXOKFLAG ;
MOV SBUF, A ;
JNB TXOKFLAG, $ ;
RET
APROMOUT: MOV CHPENR,#87H ;进入LDROM方式
MOV CHPENR,#59H
MOV CHPCON,#03H
MOV TCON,#00H ;关T0、T1
MOV T2CON,#00H ;关T2
MOV IP,#00H ;同优先级
MOV IE,#82H ;允许T0中断,总中断开放
MOV TL0,#0FBH ;装初值,定时为5微秒
MOV TH0,#0FFH
MOV TMOD,#01H ;T0为16位定时器
MOV TCON,#10H ;开启T0
MOV PCON,#01H ;进入在线编程模式,等待唤醒后进入4K-LDROM程序
END ;程序结束