?? 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 + -