📄 ps2.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PS2键盘接口程序 ;;;;;;;;;;;;;;;;;;;;;;;
;; 言军工作室 ;;;;;;;;;;;;;;;;;;;;;;;
;; 2005.7.10 ;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLOCK EQU P3.2 ;时钟线
KDATA EQU P3.1 ;数据线
CAPSLOCK EQU 00H ;大小写切换
SHIFT EQU 01H ;双切换
BFLAG0 EQU 30H ;位计数
BFLAG1 EQU 31H ;位计数
BDATA0 EQU 32H ;数据暂存
BDATA1 EQU 33H
ORG 0000H
LJMP START
ORG 0003H
LJMP INTEX0 ;外部中断0
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
START:CLR CAPSLOCK
CLR SHIFT
MOV BDATA0,#0
MOV BDATA1,#0
MOV BFLAG0,#9
MOV BFLAG1,#11
SETB EA
SETB EX0
LCALL INIT_LCD
AJMP $
DECODE:JNB CAPSLOCK,CODE0 ;译码
MOV DPTR,#TABLE0
AJMP CODE1
CODE0:MOV DPTR,#TABLE
CODE1:JNB SHIFT,CODE2
MOV DPTR,#TABLE1
CODE2:MOV A,BDATA0
MOVC A,@A+DPTR
MOV BDATA0,A
;CLR SHIFT
RET
TABLE:DB ' ',' ',' ',' ',' ',' ',' ',' '
DB ' ',' ',' ',' ',' ',' ','`',' '
DB ' ',' ',' ',' ',' ','q','1',' '
DB ' ',' ','z','s','a','w','2',' '
DB ' ','c','x','d','e','4','3',' '
DB ' ',' ','v','f','t','r','5',' '
DB ' ','n','b','h','g','y','6',' '
DB ' ',' ','m','j','u','7','8',' '
DB ' ',',','k','i','o','0','9',' '
DB ' ','.','/','l',';','p','-',' '
DB ' ',' ','"',' ','[','=',' ',' '
DB 58H,' ',' ',']',' ',' ',' ',' '
DB ' ',' ',' ',' ',' ',' ',' ',' '
DB ' ','1',' ','4','7',' ',' ',' '
DB '0','.','2','5','6','8',' ',' '
DB ' ','+','3','-','*','9',' ',' '
TABLE0:DB ' ',' ',' ',' ',' ',' ',' ',' '
DB ' ',' ',' ',' ',' ',' ','~',' '
DB ' ',' ',' ',' ',' ','Q','1',' '
DB ' ',' ','Z','S','A','W','2',' '
DB ' ','C','X','D','E','4','3',' '
DB ' ',' ','V','F','T','R','5',' '
DB ' ','N','B','H','G','Y','6',' '
DB ' ',' ','M','J','U','7','8',' '
DB ' ',',','K','I','O','0','9',' '
DB ' ','.','/','l',';','P','-',' '
DB ' ',' ','"',' ','[','=',' ',' '
DB 58H,' ',' ',']',' ',' ',' ',' '
DB ' ',' ',' ',' ',' ',' ',' ',' '
DB ' ','1',' ','4','7',' ',' ',' '
DB '0','.','2','5','6','8',' ',' '
DB ' ','+','3','-','*','9',' ',' '
TABLE1:DB ' ',' ',' ',' ',' ',' ',' ',' '
DB ' ',' ',' ',' ',' ',' ','~',' '
DB ' ',' ',' ',' ',' ','Q','!',' '
DB ' ',' ','Z','S','A','W','@',' '
DB ' ','C','X','D','E','$','#',' '
DB ' ',' ','V','F','T','R','%',' '
DB ' ','N','B','H','G','Y','^',' '
DB ' ',' ','M','J','U','&','*',' '
DB ' ','<','K','I','O',')','(',' '
DB ' ','>','?','l',':','P','_',' '
DB ' ',' ','"',' ','{','+',' ',' '
DB 58H,' ',' ','}',' ',' ',' ',' '
DB ' ',' ',' ',' ',' ',' ',' ',' '
DB ' ','1',' ','4','7',' ',' ',' '
DB '0','.','2','5','6','8',' ',' '
DB ' ','+','3','-','*','9',' ',' '
LCDDISP:;LCALL FIRST
MOV A,BDATA0
LCALL WRDATA
RET
INIT_LCD: ;液晶初始化
ACALL DL10MS
MOV A,#30H ;功能设定
ACALL WRCOM
ACALL DL500 ;延时500us
MOV A,#0CH
ACALL WRCOM
ACALL DL500
MOV A,#01H ;清屏
ACALL WRCOM
ACALL DL500
MOV A,#6H ;AC递增
ACALL WRCOM
ACALL DL500
RET
FIRST:;MOV A,#80H
ACALL WRCOM
RET
SECOND:MOV A,#0C0H
ACALL WRCOM
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;写指令
WRCOM:ACALL BUSY
CLR P1.0
CLR P1.1
MOV P0,A
NOP
SETB P1.2
NOP
CLR P1.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;写数据
WRDATA:ACALL BUSY
SETB P1.0
CLR P1.1
MOV P0,A
NOP
SETB P1.2
NOP
CLR P1.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;读忙
BUSY:PUSH ACC
WAIT:CLR P1.0
SETB P1.1
NOP
SETB P1.2
MOV A,P0
JB ACC.7,WAIT
CLR P1.2
POP ACC
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;延时程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DL500:MOV R6,#0FAH
LOOP1:DJNZ R6,LOOP1
RET
DL1MS:MOV R7,#2H
LOOP2:LCALL DL500
DJNZ R7,LOOP2
RET
DL10MS:MOV R5,#0AH
LOOP3:LCALL DL1MS
DJNZ R5,LOOP3
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;外部中断0程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTEX0:CLR EX0 ;中断禁能
MOV A,BFLAG0 ;判断第九位是否接收
JZ EX00
MOV C,KDATA ;右移一位
MOV A,BDATA0
RRC A
MOV BDATA0,A
DEC BFLAG0 ;位计数减一
DEC BFLAG1
LJMP EX0OUT
EX00:MOV A,BFLAG1 ;判断11位是否接收
JZ EX01
DEC BFLAG1
AJMP EX0OUT
EX01:MOV A,BDATA0
CJNE A,#58H,EX02 ;是否是CAPSLOC键按下
CPL CAPSLOCK
AJMP EX06
EX02:CJNE A,#12H,EX03 ;是否是左SHIFT键按下
CPL SHIFT
AJMP EX06
EX03:CJNE A,#59H,EX04 ;是否是右SHIFT键按下
CPL SHIFT
AJMP EX06
EX04:CJNE A,#0F0H,EX05 ;键断码
AJMP EX06
EX05:LCALL DECODE ;调译码程序
LCALL LCDDISP ;调显示程序
EX06:LCALL DL10MS ;延时10MS
MOV BDATA0,#0
MOV BFLAG0,#9 ;位计数重置数
MOV BFLAG1,#11
EX0OUT:SETB EX0 ;中断使能
JNB CLOCK,$ ;低电平等待
RETI ;返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -