📄 henhao.asm
字号:
bitACK BIT P3.0
bitDAT BIT P3.1
bitOVERFLOW BIT P3.3
bitDECODE BIT P3.4
bitD74 BIT P3.5
bitCLK74 BIT P3.7
bitStrollLockKey BIT 00H
bitParityBak BIT 08H
blnNumLockKey BIT 01H
blnCapsLockKey BIT 02H
blnShiftKeyDown BIT 03H
blnHaveKey BIT 04H
blnDataValid BIT 05H
blnTimer0Overflow BIT 06H
blnChoose BIT 09H
blnFifoFull BIT 0AH
blnFifoNull BIT 0BH
blnOddByte BIT 0CH
gBitCounter DATA 30H
gByteCounter DATA 31H
CodeReg_1 DATA 32H
CodeReg_2 DATA 33H
FifoBufferBegin EQU 34H
FifoBufferEnd EQU 35H
TmpOddByte DATA 36H
FifoBuffer EQU 60H
FifoBufferLength EQU 20H
ReceiveBuffer EQU 40H
RestoreBuffer EQU 50H
Init_TL0 EQU 48H
Init_TH0 EQU 0F4H
ORG 0
LJMP START
ORG 03H
LJMP INT0_SERVE
ORG 0BH
T0_SERVE:
CLR TR0 ;Counter stop
SETB bitDECODE ;Illume the yellow light
SETB blnTimer0Overflow ;Setting the timer overflow symbol
JNB blnHaveKey,T0_SERVE1 ;Have key?
SETB blnDataValid ;Seting the data valid symbol
CLR blnHaveKey ;Clean the have key symbol
T0_SERVE1:
MOV TL0,#Init_TL0 ;Setting the timer
MOV TH0,#Init_TH0
SETB TR0 ;Startup the timer
RETI
;*********************************************
INT0_SERVE:
CLR TR0 ;Stop count
JB blnDataValid,EXIT1 ;data valid?
PUSH ACC ;Protect the spot
PUSH PSW
PUSH 07H
CLR bitDECODE ;Put out the yellow light
JNB blnTimer0Overflow,NOT_NEWRECEIVE ;New receive?
SETB blnHaveKey
MOV gBitCounter,#0
NOT_NEWRECEIVE: ;new receive
INC gBitCounter
MOV C,bitDAT
LCALL RLC_STORE ;Store a bit
CLR blnTimer0Overflow ;Clean the timer overflow symbol
MOV TL0,#Init_TL0 ;Setting the timer
MOV TH0,#Init_TH0
POP 07H ;Resume the spot
POP PSW
POP ACC
SETB TR0 ;Startup the timer
RETI
EXIT1:
MOV TL0,#Init_TL0 ;Setting the timer
MOV TH0,#Init_TH0
SETB TR0 ;Startup the timer
RETI
;Main progress begin
START:
MOV A,#0FFH ;Keyboard replacement
LCALL COMMAND
MOV R5,#0FFH
DELAY:
MOV R6,#0FFH
DJNZ R6,$
DJNZ R5,DELAY
MOV gBitCounter,#0 ;Clean the bit count symbol
MOV TMOD,#01H ;Setting the counter
MOV TL0,#Init_TL0
MOV TH0,#Init_TH0
MOV R1,#ReceiveBuffer
LCALL CLR_BUFFER ;Clean the receive buffer
CLR blnFifoFull ;Clean the FIFO full symbol
SETB blnFifoNull ;CLean the FIFO empty symbol
CLR blnDataValid ;Clean the data valid symbol
CLR blnShiftKeyDown ;Place the special key symbol
CLR blnCapsLockKey
CLR bitStrollLockKey
CLR blnOddByte
SETB blnNumLockKey
SETB blnChoose ;Choose the kind of key code
CLR bitD74 ;put out the green light
CLR bitCLK74
SETB bitCLK74
MOV FifoBufferBegin,#FifoBuffer ;initialize FIFO
MOV FifoBufferEnd,#FifoBuffer
SETB TR0 ;Startup the counter
SETB IT0 ;Place to symbol bit
SETB EX0
SETB ET0
SETB EA
LCALL LEDCTRL ;lighten the NumLock key light
;***************************************
MAINLOOP:
JNB blnDataValid,ASKFORSEND ;Is the data valid?
LCALL RESUME ;Yes,restore the data
CLR blnDataValid ;Clean the datavalid symbol
XRL A,#0FFH ;Is the data 0FFH?
JZ MAINLOOP ;Yes,return
JB blnChoose,CODE_1 ;The kind of key code
LCALL FINDVIKEYCODE ;Find the virtual key code
MOV CodeReg_2,A ;store the virtual key code
XRL A,#0FFH ;Is the code 0FFH?
JZ MAINLOOP ;Yes,return
LJMP FIFO ;No,send the code to FIFO
CODE_1:
LCALL FINDSCAN ;Find the scan code
MOV B,A
XRL A,#0FFH ;Is the data 0FFH in ACC?
JZ MAINLOOP ;Yes,return
MOV A,B
XRL A,#0FEH ;Is the data 0FEH in ACC?
JZ FIFO ;Yes,send the code to FIFO
LCALL ChangeASCII ;Find the ASCII code
FIFO:
LCALL FIFO_STORE ;Store the code in FIFO
LCALL LEDCTRL ;Setting the pilot lamp on keyboard
ASKFORSEND:
JNB bitACK,RETURN ;Get ready incept ?
LCALL READFIFO ;Break out the code from FIFO and send
RETURN:
LJMP MAINLOOP ;Return
;**********************************************************
FINDSCAN:
MOV A,gByteCounter
CJNE A,#01H,JUDGE_1 ;One byte?
LCALL PROCESS_ONEBYTE ;Yes,FInd the scan code
LJMP JUDGE_7
JUDGE_1:
MOV A,gByteCounter
XRL A,#02H ;Two byte?
JNZ JUDGE_2
LCALL PROCESS_TWOBYTE ;Yes,return
LJMP JUDGE_7
JUDGE_2:
MOV A,gByteCounter
XRL A,#03H ;Three byte?
JZ JUDGE_6 ;Yes,return
JUDGE_3:
MOV A,gByteCounter
XRL A,#04H ;Four byte?
JNZ JUDGE_4
LCALL PROCESS_FOURBYTE ;Yes,find the scan code
LJMP JUDGE_7
JUDGE_4:
MOV A,gByteCounter
XRL A,#06H ;Six byte?
JZ JUDGE_6 ;Yes,return
JUDGE_5:
MOV A,gByteCounter
XRL A,#08H ;Eight byte?
JNZ JUDGE_6 ;No,return
LCALL PROCESS_EIGHTBYTE ;Yes,find the scan code
LJMP JUDGE_7
JUDGE_6:
MOV A,#0FFH
JUDGE_7:
RET
;*****************************************
PROCESS_ONEBYTE:
MOV A,RestoreBuffer
XRL A,#77H ;Is the key NumLock key?
JNZ LED_1
CPL blnNumLockKey ;Yes,setting the symbol of NumLock key
LED_1:
MOV A,RestoreBuffer
XRL A,#58H ;Is the key CapsLock Key
JNZ LED_2
CPL blnCapsLockKey ;Yes,setting the symbol of CapLock key
LED_2:
MOV A,RestoreBuffer
XRL A,#7EH ;Is the key ScrollLock Key
JNZ SHIFT_1
CPL bitStrollLockKey ;Yes,setting the symbol of ScrollLock key
SHIFT_1:
MOV A,RestoreBuffer
XRL A,#12H ;Is the key left Shift key
JZ SHIFT_2
MOV A,RestoreBuffer
XRL A,#59H ;Is the key right Shift key
JNZ ONEBYTE_1
SHIFT_2:
SETB blnShiftKeyDown ;Setting the symbol of Shift key
ONEBYTE_1:
MOV R7,RestoreBuffer
MOV A,R7 ;Break out the data to A
CLR C ;Clean the C
SUBB A,#90H ; Is the data
JNC ONEBYTE_2
LCALL FINDSCANCODE
MOV CodeReg_1,A
RET
ONEBYTE_2:
MOV A,#0FFH
RET
;**********************************
PROCESS_TWOBYTE:
MOV A,RestoreBuffer
XRL A,#0F0H ;Is the first byte 0F0H?
JZ FIRSTBYTEISF0
MOV A,RestoreBuffer
XRL A,#0E0H ;Is the first byte 0E0H?
JZ TWOBYTE_1
MOV A,#0FFH
RET
;-------------------------------------
;The progress to find the scan code for multibyte
TWOBYTE_1:
MOV R1,#RestoreBuffer+1
LCALL MOREBYTESCAN
RET
;-------------------------------
;The first byte is 0F0H
FIRSTBYTEISF0:
MOV A,RestoreBuffer+1
XRL A,#12H
JZ SHIFT_3
MOV A,RestoreBuffer+1
XRL A,#59H
JNZ F0_1
SHIFT_3:
CLR blnShiftKeyDown
F0_1:
MOV A,#0FFH
RET
;*****************************************
PROCESS_FOURBYTE:
MOV R1,#RestoreBuffer+3
LCALL MOREBYTESCAN
RET
;******************************************
PROCESS_EIGHTBYTE:
MOV CodeReg_1,#69
MOV CodeReg_2,#0
MOV A,#0FEH
RET
;--------------------------------------------------
MOREBYTESCAN:
MOV A,@R1
MOV DPTR,#TwoByteKeyTable
MOV R6,#0
MOV R7,A
STMP3:
MOV A,R6
MOVC A,@A+DPTR
JZ STMP2
XRL A,R7
JZ STMP1
INC R6
SJMP STMP3
STMP1:
MOV A,R6
LCALL FindTwoByteKeyScanCode
CJNE @R1,#69H,STMP4
STMP4:
JNC STMP5
MOV CodeReg_1,A
RET
STMP5:
MOV CodeReg_1,A
MOV CodeReg_2,#0
MOV A,#0FEH
RET
STMP2:
MOV A,#0FFH
RET
TwoByteKeyTable:
DB 11H,14H,1FH,27H,2FH,4AH,5AH,69H,6BH,6CH,70H,71H,72H,74H,75H,7AH,7CH,7DH,0H
FindTwoByteKeyScanCode:
INC A
MOVC A,@A+PC
RET
DB 38H,1DH,5BH,5CH,5DH,35H,1CH,4FH,4BH,47H,52H,53H,50H,4DH,48H,51H,37H,49H,0FFH
;*********************************************
;The Progress of resume
RESUME:
MOV R1,#RestoreBuffer
LCALL CLR_BUFFER ;Clean the restore buffer
MOV A,gBitCounter
MOV B,#11
DIV AB
MOV R2,A
ADD A,#RestoreBuffer
MOV R6,A
MOV gByteCounter,R2
RESUME_LOOP1:
LCALL RRC_READ
JNC ERROR
LCALL RRC_READ
MOV bitParityBak,C
MOV R5,#8
RESUME_LOOP2:
LCALL RRC_READ
MOV R1,#RestoreBuffer
MOV R4,gByteCounter
RLC_RESTORE_LOOP: ;restore a bit
MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ R4,RLC_RESTORE_LOOP
DJNZ R5,RESUME_LOOP2
;check the receive parity error
;if (paritybit==P) go error
MOV A,RestoreBuffer
MOV C,PSW.0
ANL C,BitParityBak
JC ERROR
MOV C,PSW.0
ORL C,BitParityBak
JNC ERROR
LCALL RRC_READ
JC ERROR
DJNZ R2,RESUME_LOOP1
RET
ERROR:
MOV A,#0FFH
RET
;------------------------------------------------
;The progress to break out a bit
RRC_READ:
MOV R1,#ReceiveBuffer+11
MOV R4,#12
RRC_READ_LOOP:
MOV A,@R1
RRC A
MOV @R1,A
DEC R1
DJNZ R4,RRC_READ_LOOP
RET
;---------------------------------------------------
;The progress to restore a bit
RLC_STORE:
MOV R7,#12
MOV R0,#ReceiveBuffer
RLC_STORE_LOOP:
MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R7,RLC_STORE_LOOP
RET
;---------------------------------------------------
;The progress to clean buffer
CLR_BUFFER:
MOV R7,#12
CLR A
CLR_BUFFER_LOOP:
MOV @R1,A
INC R1
DJNZ R7,CLR_BUFFER_LOOP
RET
;*******************************************
;The progress to find the scan code
FINDSCANCODE:
MOV A,R7
INC A
MOVC A,@A+PC
RET
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
DB 0FFH,043H,0FFH,03FH,03DH,03BH,03CH,0FFH,0FFH,044H,042H,040H,03EH,00FH,029H,0FFH;0
DB 0FFH,038H,02AH,0FFH,01DH,010H,002H,0FFH,0FFH,0FFH,02CH,01FH,01EH,011H,003H,0FFH;1
DB 0FFH,02EH,02DH,020H,012H,005H,004H,0FFH,0FFH,039H,02FH,021H,014H,013H,006H,0FFH;2
DB 0FFH,031H,030H,023H,022H,015H,007H,0FFH,0FFH,0FFH,032H,024H,016H,008H,009H,0FFH;3
DB 0FFH,033H,025H,017H,018H,00BH,00AH,0FFH,0FFH,034H,035H,026H,027H,019H,00CH,0FFH;4
DB 0FFH,0FFH,028H,0FFH,01AH,00DH,0FFH,0FFH,03AH,036H,01CH,01BH,0FFH,02BH,0FFH,0FFH;5
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,00EH,0FFH,0FFH,04FH,0FFH,04BH,047H,0FFH,0FFH,0FFH;6
DB 052H,053H,050H,04CH,04DH,048H,001H,045H,0FFH,04EH,051H,04AH,0FFH,049H,046H,0FFH;7
DB 0FFH,0FFH,0FFH,041H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;8
;**********************************************
;Change the scan code to ASCII code
CHANGEASCII:
MOV A,CodeReg_1
XRL A,#91
JNZ CH1
MOV CodeReg_2,#0
RET
CH1:
MOV A,CodeReg_1
XRL A,#92
JNZ CH2
MOV CodeReg_2,#0
RET
CH2:
MOV A,CodeReg_1
XRL A,#93
JNZ CH3
MOV CodeReg_2,#0
RET
CH3:
MOV A,CodeReg_1
CJNE A,#71,CH4
CH4:
JNC CH6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -