?? ps2.asm
字號:
;安裝1602液晶, 燒寫程序后,把電腦的鍵盤
;插入鍵盤接口。按鍵液晶則有顯示.
PS2_CLK BIT P3.3
PS2_DATA BIT P3.4
LCD_RS BIT P2.0 ;LCD控制端口
LCD_RW BIT P2.1
LCD_EN BIT P2.2
LCD_X EQU 27H ;LCD 地址變量
KEY_DATA EQU 30H
EXT1_NUM EQU 31H
BEEP BIT P3.3
RESET BIT 20H.0
H_SCAN BIT 20H.1 ;行掃描標志
SHIFT BIT 20H.3 ;SHIFT標志
BREAK_C BIT 20H.4 ;斷碼標志
;---------------------------------------------------
ORG 0000H
JMP MAIN
ORG 0013H
JMP EXT1
ORG 0030H
;---------------------------------------------------
MAIN:
MOV SP,#60H
MOV P0,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
ACALL INIT_LCD
ACALL SET_LCD1
ACALL SET_LCD2
MOV R5,#100 ;延時5S
ACALL DELAY
MOV A,#01H
ACALL WCOM ;清屏
MOV 20H,#00H
MOV LCD_X,#00H
MOV R1,#00H
MOV R2,#00H
MOV KEY_DATA,#00H
CLR IT1 ;外部中斷1為低電平觸發(fā)
SETB EA ;開總中斷
SETB EX1 ;開外部中斷1
DISP:
JB RESET,MAIN ;程序熱復位
JMP DISP
;----------------------------------------------------------
;根據(jù)PS2的鍵值來查找其代碼,并取得順序碼。
;然后再根據(jù)順序碼來查找ASCII碼。
;入口:
;A PS2的鍵值
;出口:
;A 鍵值的ASCII碼
;R3存放順序碼
;----------------------------------------------------------
PS2KEY_D:
MOV B,A
MOV DPTR,#TABLE_D
MOV R3,#0FFH
KEY_IN1:
INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY_IN2
MOV A,R3 ;找到,取順序碼
MOV DPTR,#TABLE_D_ASC ;根據(jù)順序碼來查找ASCII碼
MOVC A,@A+DPTR
RET
KEY_IN2: CJNE A,#0FFH,KEY_IN1 ;末完,繼續(xù)查
RET ;0FFH為結(jié)束碼
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PS2KEY_U:
MOV B,A
MOV DPTR,#TABLE_D
MOV R3,#0FFH
KEY_IN3:
INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY_IN4
MOV A,R3 ;找到,取順序碼
MOV DPTR,#TABLE_U_ASC ;根據(jù)順序碼來查找ASCII碼
MOVC A,@A+DPTR
RET
KEY_IN4: CJNE A,#0FFH,KEY_IN3 ;末完,繼續(xù)查
RET ;0FFH為結(jié)束碼
;------------------------------------------------------
;外部中斷子程序
;R1 中斷次數(shù)計數(shù)
;------------------------------------------------------
EXT1:
CJNE R1,#00H,IN_LOOP ;跳過第一位啟動位
JMP IN_LOOP3
IN_LOOP:
CJNE R1,#09H,IN_LOOP1 ;2-9位為數(shù)據(jù)
IN_LOOP1:
JNC IN_LOOP3 ;大于或等于9,轉(zhuǎn)。
RR A ;
JB PS2_DATA,IN_LOOP2 ;判數(shù)據(jù)是“1”,還是“0”
ANL A,#7FH ;是“0”最高置位為0
JMP IN_LOOP3
IN_LOOP2:
ORL A,#80H ;是“1”最高置位為1
IN_LOOP3:
INC R1 ;中斷計數(shù)
JNB PS2_CLK,$ ;等待PS2_CLK變高
IN_LOOP4:
CJNE R1,#0BH,IN_LOOP5 ;一楨數(shù)據(jù)是否讀完?
IN_LOOP5: JNC IN_LOOP6 ;大于或等于11,轉(zhuǎn)。
JMP EXT1_END
IN_LOOP6:
CJNE A,#0F0H,IN_LOOP6E ;斷碼是否開始
SETB BREAK_C ;置斷碼標志
MOV R1,#00H
JMP EXT1_END
IN_LOOP6E:
CJNE A,#66H,IN_LOOP6A ;Back Space鍵功能
JB BREAK_C,IN_LOOP6F
MOV R1,#00H
MOV R4,LCD_X
CJNE R4,#00H,IN_LOOP6G ;判是否到顯示起始位
JMP EXT1_END
IN_LOOP6G:
DEC LCD_X ;刪除前一位數(shù)
MOV A,#20H
ACALL CONV1 ;有INC LCD_X指令
DEC LCD_X ;所以要再減一次
MOV A,#10H ;光標左移一格
ACALL WCOM
JMP EXT1_END
IN_LOOP6F:
CLR BREAK_C
MOV R1,#00H
JMP EXT1_END
IN_LOOP6A:
CJNE A,#12H,IN_LOOP6C ;左SHIFT
JB BREAK_C,IN_LOOP6B
MOV R1,#00H
SETB SHIFT ;置SHIFT標志
JMP EXT1_END
IN_LOOP6B:
CLR SHIFT
CLR BREAK_C
MOV R1,#00H
JMP EXT1_END
IN_LOOP6C:
CJNE A,#59H,IN_LOOP7 ;右SHIFT
JB BREAK_C,IN_LOOP6D
MOV R1,#00H
SETB SHIFT
JMP EXT1_END
IN_LOOP6D:
CLR SHIFT
CLR BREAK_C
MOV R1,#00H
JMP EXT1_END
IN_LOOP7:
CJNE A,#71H,IN_LOOP8 ;DEL鍵功能,清屏。
JB BREAK_C,IN_LOOP7A
MOV R1,#00H
MOV A,#01H
ACALL WCOM
MOV 20H,#00H ;清所有的標志
MOV LCD_X,#00H ;
JMP EXT1_END
IN_LOOP7A:
CLR BREAK_C
MOV R1,#00H
JMP EXT1_END
IN_LOOP8:
CJNE A,#5AH,IN_LOOP9 ;ENTER鍵功能,換行。
JB BREAK_C,IN_LOOP8C
MOV R1,#00H
CPL H_SCAN ;換行取反
JNB H_SCAN,IN_LOOP8A
MOV A,#0C0H ;設(shè)置 LCD 的第二行地址
ACALL WCOM
ACALL CLR_LINE ;清第二行的內(nèi)容
MOV A,#0C0H ;設(shè)置 LCD 的第二行地址
ACALL WCOM
MOV LCD_X,#00H
JMP IN_LOOP8B
IN_LOOP8A:
MOV A,#80H ;設(shè)置 LCD 的第一行地址
ACALL WCOM
ACALL CLR_LINE ;清第一行的內(nèi)容
MOV A,#80H ;設(shè)置 LCD 的第一行地址
ACALL WCOM
MOV LCD_X,#00H
IN_LOOP8B:
JMP EXT1_END
IN_LOOP8C:
CLR BREAK_C
MOV R1,#00H
JMP EXT1_END
IN_LOOP9:
CJNE A,#05H,IN_LOOPA ;F1 幫助鍵功能
JB BREAK_C,IN_LOOP9A
MOV R1,#00H
ACALL SET_LCD3
ACALL SET_LCD4
JMP EXT1_END
IN_LOOP9A:
CLR BREAK_C
MOV R1,#00H
JMP EXT1_END
IN_LOOPA:
CJNE A,#76H,IN_LOOPB ;ESC鍵功能
SETB RESET ;置復位標志
JMP EXT1_END
IN_LOOPB:
CLR EX1 ;關(guān)中斷,準備顯示
MOV R1,#00H
JB SHIFT,IN_LOOPBA
ACALL PS2KEY_D
CJNE A,#0FFH,IN_LOOPC ;沒有定義的鍵不顯示
JMP IN_LOOPD
IN_LOOPBA:
ACALL PS2KEY_U
CJNE A,#0FFH,IN_LOOPC ;沒有定義的鍵不顯示
JMP IN_LOOPD
IN_LOOPC:
ACALL CONV1
ACALL BEEP_BL
IN_LOOPD:
SETB EX1 ;顯示完畢,開中斷
EXT1_END:
RETI
;----------------------------------------------------------
;PS2鍵值表(下行鍵)
;----------------------------------------------------------
TABLE_D:
DB 1CH,32H,21H,23H,24H,2BH,34H,33H,43H,3BH,42H
DB 4BH,3AH,31H,44H,4DH,15H,2DH,1BH,2CH,3CH,2AH
DB 1DH,22H,35H,1AH ;A-Z
DB 45H,16H,1EH,26H,25H,2EH
DB 36H,3DH,3EH,46H ;0-9
DB 0EH,4EH,55H,5DH,29H,54H
DB 5BH,4CH,52H,41H,49H,4AH ;,71H
DB 70H,69H,72H,7AH,6BH ;右邊數(shù)字鍵
DB 73H,74H,6CH,75H,7DH ;0-9
DB 0FFH
;----------------------------------------------------------
;鍵值的ASCII碼 (下行鍵)
;----------------------------------------------------------
TABLE_D_ASC:
DB 61H,62H,63H,64H,65H,66H,67H,68H,69H,6AH,6BH
DB 6CH,6DH,6EH,6FH,70H,71H,72H,73H,74H,75H,76H
DB 77H,78H,79H,7AH ;A-Z
DB 30H,31H,32H,33H,34H,35H
DB 36H,37H,38H,39H ;0-9
DB 60H,2DH,3DH,0A4H,20H,5BH
DB 5DH,3BH,27H,2CH,2EH,2FH ;,2EH
DB 30H,31H,32H,33H,34H,35H ;右邊數(shù)字鍵
DB 36H,37H,38H,39H ;0-9
DB 0FFH
;**********************************************************
;上行鍵ASCII碼表
;**********************************************************
TABLE_U_ASC:
DB 41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -