📄 dying.asm
字号:
;******************************************************************
; RS232-> PS/2 Code
; V1.0 Dying ----- 2004.11.20
;*******************************************************************
ORG 0000H
baud DATA 0FEH ; 9600baudrate/second
BufferTail DATA 7BH ;UART Buffer form (BurrerHead) to (BufferTail-1)
BufferHead DATA 28H
KeysMakeBit BIT 17H
KeyboardUsed BIT 16H
ReCommandBit BIT 15H
SecKey BIT P1.7
SDA BIT P1.6
SCL BIT P1.5
Num BIT P1.4
Scroll BIT P1.3
Caps BIT P1.2
Flag EQU 22H
Count EQU 23H
ODDBIT EQU 24H
; 25H--27H ; no used
; 28H--7AH ; RS232 Recive Ring Buffer and 83 bytes
; 7BH--7CH ; no used
Tail EQU 7DH
Current EQU 7EH
Head EQU 7FH
;
;*********************************************************************
;
AJMP STAR
;
ORG 0003H
AJMP INT_Int0
;
ORG 000BH
AJMP INT_T0
;
ORG 0013H
AJMP INT_Int1
;
ORG 0023H
AJMP INT_UART
;-----------------------------------------------------
ORG 0030H
STAR:
SETB SecKey ;Close Keyboard
CLR Caps
CLR Scroll
CLR Num
SETB SDA
SETB SCL
CLR A ;clean RAM
MOV R0,#7FH
CLRAM: MOV @R0,A
DJNZ R0,CLRAM
;------------------------------------------------------
Initialization:
MOV SCON,#50H
MOV TH1,#baud
MOV TL1,#baud
MOV TMOD,#21H
MOV TCON,#07H
MOV SP,#09H
MOV TH0,#76 ;WatchDog
MOV TL0,#00H
MOV IP,#02H
MOV IE,#14H ;????T0 INT0
;
SETB TR1
; SETB TR0
CLR TI
CLR RI
SETB EA
;; ACALL InitializationKey
CLR SecKey ;Open Keyboard
MOV Head,#BufferHead
MOV Current,#BufferHead
MOV Tail,#BufferHead
SETB Num
;*************************************************************************
MainLoop:
ajmp ReadyTransmit
JB KeyboardUsed,ReadyTransmit ;如果标准键盘存在则不接收命令
; SETB SCL
JB SCL,ReadyTransmit
DealWithCommand:
cpl Num
ACALL ReceiveByte
CJNE A,#55H,ReceiveGoodData
AJMP ReadyTransmit
ReceiveGoodData:
CJNE A,#0FEH,NotResendCommand
DEC Tail ;Resend Command
MOV A,Tail
CJNE A,#H,ReadyTransmit ??????
MOV Tail,#H
SJMP ReadyTransmit
NotResendCommand:
CJNE A,#0EEH,NotEchoCommand
MOV A,#0EEH ;Echo Command
ACALL TransmitByte
SJMP ReadyTransmit
NotEchoCommand:
CJNE A,#0FFH,NotResetCommand
MOV A,#0FAH
ACALL TransmitByte
SJMP STAR ;Reset Keyboard
NotResetCommand:
CJNE A,#0F9H,NotKeysMake
SETB KeysMakeBit ;Set All keys Make
SJMP NotAll
NotKeysMake:
CJNE A,#0F8H,NotSetMakeBreak
CLR KeysMakeBit
SJMP NotAll
NotSetMakeBreak:
CJNE A,#0F7H,NotSetTypematic
SETB KeysMakeBit
SJMP NotAll
NotSetTypematic:
CJNE A,#0FAH,NotSetTMB
CLR KeysMakeBit
SJMP NotAll
NotSetTMB:
CJNE A,#0F2H,NotAll
MOV A,#0FAH
ACALL TransmitByte
MOV A,#0ABH ;Read Keyborad ID
ACALL TransmitByte ;Keyboard ID =0xAB,0x83
MOV A,#83H
ACALL TransmitByte
SJMP ReadyTransmit
NotALL:
MOV A,#0FAH ;Other Commands answer the 0xFAH
ACALL TransmitByte
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ReadyTransmit:
MOV A,Tail
CJNE A,Current,StartPS2Transmit
SJMP MainLoop
StartPS2Transmit:
; SETB SCL
JNB SCL,MainLoop
SETB SecKey ;close Keyboard 2
MOV R0,A
MOV A,@R0
ACALL PS2Transmit
INC R0
CJNE R0,#BufferTail,NotArriveEnd
MOV R0,#BufferHead
NotArriveEnd:
MOV Tail,R0
CLR SecKey ;Open Keyboard 2
AJMP MainLoop
;***************************************************************************
WatchDog:
RET
;--------------------------------------------------------
; Input A=ACSII OutPut A Use R2
;--------------------------------------------------------
PS2Transmit:
CJNE A,#140,NotLongTab1
MOV DPTR,#LongTab1 ;Pause Break
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
RET
NotLongTab1:
CJNE A,#141,NotLongTab2
MOV DPTR,#LongTab2 ;Print Screen
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
JB KeysMakeBit,DonotPrintBreak ;不发送断码
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
DonotPrintBreak:
RET
NotLongTab2:
CJNE A,#142,NotLongTab3
MOV DPTR,#LongTab3 ;Ctrl+Alt+Del
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
JB KeysMakeBit,DonotResetBreak ;不发送断码
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
ACALL TransmitByte
DonotResetBreak:
RET
NotLongTab3:
MOV R2,A
MOV DPTR,#Table
ADD A,DPL
JNC NoCarry1
INC DPH
CLR C
NoCarry1:
ADD A,R2
JNC NoCarry2
INC DPH
NoCarry2:
MOV DPL,A
CLR A
MOVC A,@A+DPTR
CJNE A,#0E0H,NoTwoBreakCode
ACALL TransmitByte ;Two code Make
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R2,A
ACALL TransmitByte
JB KeysMakeBit,DonotTwocodeBreak ;不发送断码
MOV A,#0E0H
ACALL TransmitByte
MOV A,#0F0H
ACALL TransmitByte
MOV A,R2
ACALL TransmitByte
DonotTwocodeBreak:
RET
NoTwoBreakCode:
CJNE A,#12H,NoShiftCode
ACALL TransmitByte ;Shift组合键
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R2,A
ACALL TransmitByte
JB KeysMakeBit,DonotShiftBreak ;不发送断码
MOV A,#0F0H
ACALL TransmitByte
MOV A,R2
ACALL TransmitByte
MOV A,#0F0H
ACALL TransmitByte
MOV A,#12H
ACALL TransmitByte
DonotShiftBreak:
RET
NoShiftCode:
CJNE A,#14H,NoCtrlCode ;Ctrl组合健
ACALL TransmitByte
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R2,A
ACALL TransmitByte
JB KeysMakeBit,DonotCtrlBreak ;不发送断码
MOV A,#0F0H
ACALL TransmitByte
MOV A,R2
ACALL TransmitByte
MOV A,#0F0H
ACALL TransmitByte
MOV A,#14H
ACALL TransmitByte
DonotCtrlBreak:
RET
NoCtrlCode:
MOV R2,A
ACALL TransmitByte
MOV A,#0F0H
ACALL TransmitByte
MOV A,R2
JB KeysMakeBit,DonotBreak ;不发送断码
ACALL TransmitByte
DonotBreak:
CJNE R2,#58H,NoCapsLock
CPL Caps
RET
NoCapsLock:
CJNE R2,#77H,NoNumLock
CPL Num
RET
NoNumLock:
CJNE R2,#7EH,NoScrollLock
CPL Scroll
RET
NoScrollLock:
RET
;----------------------------------------------------------
; Input A=data , Used R1
;----------------------------------------------------------
TransmitByte:
; SETB SCL
JNB SCL,$
ACALL Delay50uS
JNB SCL,TransmitByte
; SETB SDA
JB SDA,TransmitAllow
; MOV A,#77H
RET
TransmitAllow:
ACALL Delay20uS
CLR SDA ;START
MOV ODDBIT,#01H
ACALL Delay20uS
CLR SCL
ACALL DelayPluse
SETB SCL
ACALL Delay20uS
XRL ODDBIT,A
RRC A
MOV SDA,C ;BIT0
ACALL Delay20uS
CLR SCL
ACALL DelayPluse
SETB SCL
ACALL Delay20uS
XRL ODDBIT,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -