📄 ps2.asm
字号:
;PS2
C8279 EQU 0F239H ;8279命令口
D8279 EQU 0F238H ;8279数据口
DAT EQU P1.1 ;数据串口
CLOCK EQU P1.0 ;时钟脉冲
ORG 0000H
LJMP MAIN
MAIN: MOV SP,#20H ;堆栈设置
LCALL INIT8279 ;8279初始化
LCALL INT0 ;内存初始化
MAIN1: LCALL DIS0 ;等待显示
LCALL READDATA ;读取键码
JNB 01H,MAIN2
LCALL DIS10 ;十位键码显示
SJMP MAIN4
MAIN2: JNB 02H,MAIN3
LCALL DIS5 ;五位键码显示
SJMP MAIN4
MAIN3: LCALL DISP ;显示
MAIN4: LCALL DELAY ;延时
SJMP MAIN1
;8279初始化子程序
INIT8279:
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV DPTR,#C8279
MOV A,#00H ;置8279工作方式
MOVX @DPTR,A
MOV A,#2FH ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#0C1H ;清除 LED 显示
MOVX @DPTR,A
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;内存单元初始化
INT0:
MOV R0,#30H ;存储单元设初值
MOV R7,#30H
MOV A,#00H
IN00: MOV @R0,A
INC R0
DJNZ R7,IN00
MOV 56H,#11H ;初始显示送显示缓冲区
MOV 57H,#11H
MOV 55H,#11H
MOV 54H,#11H
MOV 53H,#11H
MOV 52H,#11H
MOV 51H,#11H
MOV 50H,#11H
RET
;读键码子程序
READDATA:
MOV R7,#00H ;数据信号‘1’计数器
CLR 00H ;清出错标志
CLR 01H ;十位键码显示标志
CLR 02H ;五位键码显示标志
MOV R0,#30H
LCALL READ ;读取第一个键码
JB 00H,DATERR ;判是否出错?
MOV A,30H
CJNE A,#0E0H,PDATA1 ;判第一个键码是否为“E0”?
SJMP DATA50
DATERR: LJMP DATERROR
PDATA1: CJNE A,#0E1H,DATA3 ;判第一个键码是否为“E1”?
MOV R3,#07H ;读取“PAUSE”键的情况
MOV R0,#31H
MOV R7,#00H
SJMP DATA2
DATA50:
MOV R0,#31H
MOV R7,#00H
LCALL READ ;读取第二个键码
JB 00H,DATERROR ;判是否出错?
MOV A,31H
CJNE A,#12H,DATA5 ;判第二个键码是否为“12”?
MOV R3,#08H ;读取“PRNT SCRN”的情况
MOV R0,#32H
MOV R7,#00H
SJMP DATA2
DATA5:
MOV R3,#03H ;读取五个键码的情况
MOV R0,#32H
MOV R7,#00H
SJMP DATA2
DATA3:
MOV R3,#02H ;读取三个键码的情况
MOV R0,#31H
MOV R7,#00H
DATA2:
LCALL READ
JB 00H,DATERROR ;读键码
INC R0
MOV R7,#00H
DJNZ R3,DATA2
MOV A,30H
CJNE A,#0E1H,STATUS0 ;判第一个键码是否为“E1”?
LCALL PAUSEBREAK ;"PAUSE"键显示处理
SJMP RETEND
STATUS0:CJNE A,#0E0H,STATUS1 ;判第一个键码是否为“E0”?
MOV A,31H
CJNE A,#12H,STATUS2 ;判第二个键码是否为“12”?
LCALL PRNTSCRN ;"PRNT SCRN"键显示处理
SJMP RETEND
STATUS1:LCALL DATA3CODE ;三个键码显示处理
SJMP RETEND
STATUS2:LCALL DATA5CODE ;五个键码显示处理
SJMP RETEND
DATERROR: ;出错显示‘ERROR’
MOV 52H,#0EH
MOV 53H,#0AH
MOV 54H,#0AH
MOV 55H,#00H
MOV 56H,#0AH
RETEND: RET
;三个键码显示处理
DATA3CODE:
MOV A,31H
CJNE A,#0F0H,DATERROR;判第二个键码是否为“F0”?
MOV A,30H
XRL A,32H
JNZ DATERROR ;判第一 、第三个键码是否相等
MOV R2,#03H
MOV R0,#30H
MOV R1,#50H
LCALL DEAL ;显示处理
RET
;五个键码显示处理
DATA5CODE:
MOV R2,#05H
MOV R0,#30H
MOV R1,#50H
LCALL DEAL
SETB 02H ;置标志
RET
;“PAUSE”键显示处理
PAUSEBREAK:
MOV 68H,#12H ;末尾显示“NONE”
MOV 69H,#00H
MOV 6AH,#12H
MOV 6BH,#0EH
MOV 6CH,#11H
MOV R2,#08H
MOV R0,#30H
MOV R1,#50H
SETB 01H ;置标志
LCALL DEAL
RET
;“PRNT SCRN”键显示处理
PRNTSCRN:
MOV R2,#0AH
MOV R0,#30H
MOV R1,#50H
SETB 01H ;置标志
LCALL DEAL
RET
;显示处理
;R2键码个数
;R0键码存储单元
;R1显示缓冲区
DEAL: MOV A,@R0 ;显示处理
ANL A,#0F0H
SWAP A
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R1
MOV @R1,#11H
INC R1
INC R0
DJNZ R2,DEAL
RET
;读取一个键码
;R0键码存储单元
;R7数据信号“1”计数器
READ: MOV R2,#08H
LCALL TB10 ;等待负跳变
MOV C,DAT ;读起始位
JC READ
READ0: LCALL TB10 ;读取8位数据位
MOV C,DAT
JNC DATA0
INC R7
DATA0: MOV A,@R0
RRC A
MOV @R0,A
DJNZ R2,READ0
LCALL TB10
MOV C,DAT ;读校验位
MOV A,#00H
RLC A
MOV B,A
MOV A,R7
ANL A,#01H
XRL A,B
JZ ERROR ;奇校验
LCALL TB10 ;读结束位
JNB DAT,ERROR
RET
ERROR: SETB 00H ;置出错标志
RET
;十位键码动态显示处理
;R2迭代次数
;R6动态显示次数
;R0显示缓冲区
DIS10:
MOV R2,#1DH
MOV R6,#16H
MOV R0,#50H
DISPRINT0:
LCALL DISP ;显示
LCALL DELAY ;延时
DISPRINT1: ;显示缓冲区迭代
INC R0
MOV A,@R0
DEC R0
MOV @R0,A
INC R0
DJNZ R2,DISPRINT1
MOV R0,#50H
MOV R2,#1DH
DJNZ R6,DISPRINT0
RET
;五位键码动态显示处理
;R2迭代次数
;R6动态显示次数
;R0显示缓冲区
DIS5: MOV R2,#15H
MOV R6,#07H
MOV R0,#50H
DIS50:
LCALL DISP
LCALL DELAY
DIS51:
INC R0
MOV A,@R0
DEC R0
MOV @R0,A
INC R0
DJNZ R2,DIS51
MOV R0,#50H
MOV R2,#15H
DJNZ R6,DIS50
RET
;刷新显示
DIS0: MOV 57H,#11H
MOV 56H,#11H
MOV 55H,#11H
MOV 54H,#11H
MOV 53H,#11H
MOV 52H,#11H
MOV 50H,#11H
MOV 51H,#11H
LCALL DISP
RET
;显示
DISP: PUSH DPL
PUSH DPH
PUSH PSW
PUSH ACC
MOV R1,#50H
MOV R4,#07H
DIS1:
MOV A,@R1
MOV R5,A
LCALL DISLED
INC R1
DEC R4
CJNE R4,#0FFH,DIS1
POP ACC
POP PSW
POP DPH
POP DPL
RET
;显示字符子程序
DISLED:
PUSH DPH
PUSH DPL
PUSH PSW
PUSH ACC
MOV A,#80H
ADD A,R4 ;R4显示位置
MOV DPTR,#C8279
MOVX @DPTR,A
MOV DPTR,#LEDSEG
MOV A,R5 ;R5显示数值
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
POP ACC
POP PSW
POP DPL
POP DPH
RET
;判负跳变子程序
TB10: JB CLOCK,TB100
SJMP TB10
TB100: JB CLOCK,$
RET
;延时子程序
DELAY:
PUSH 2
PUSH 1
PUSH 0
MOV 2,#05H
DELAY1: MOV 1,#00H
DELAY2: MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2 ;延时100mS
DJNZ 2,DELAY1 ;100ms*R2
POP 0
POP 1
POP 2
RET
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,b,C,d,E,F'
DB 00H,40H,37H ;' ,-,N'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -