📄 ps2.asm
字号:
sbit _data = P3.4
sbit _clock = P3.3
sbit _parity = 0x00
ORG 0x0000
AJMP Main
Main:
MOV SP, #0x60
Loop:
MOV A, #0xe0
MOV C, P
CPL C
MOV _parity,C ;Init reg for parity calc
ACALL CodeOut
MOV A, #0x37
MOV C, P
CPL C
MOV _parity,C ;Init reg for parity calc
ACALL CodeOut
MOV R6, #0
De1:
MOV R5, #0
DJNZ R5, $
DJNZ R6, De1
MOV A, #0xe0
MOV C, P
CPL C
MOV _parity,C ;Init reg for parity calc
ACALL CodeOut
MOV A, #0xf0
MOV C, P
CPL C
MOV _parity,C ;Init reg for parity calc
ACALL CodeOut
MOV A, #0x37
MOV C, P
CPL C
MOV _parity,C ;Init reg for parity calc
ACALL CodeOut
MOV R7, #8
Del:
MOV R6, #0
De:
MOV R5, #0
DJNZ R5, $
DJNZ R6, De
DJNZ R7, Del
AJMP Loop
CodeOut:
MOV R7, #0x08
InhibitLoop:
JNB _clock, InhibitLoop ;Check for inhibit
ACALL Delay50us ;Delay 50 microseconds
JNB _clock, InhibitLoop ;Check again for inhibit
JB _data, EnSend ;Check for request-to-send
CLR C
RET
EnSend:
;Output Start bit (0)
CLR C
ACALL BitOut
;Output Keycode
ByteOutLoop:
RRC A
ACALL BitOut
DJNZ R7, ByteOutLoop
;Output Parity bit (odd parity)
MOV C, _parity
ACALL BitOut
;Output Stop bit (1)
SETB C
MOV _data, C
ACALL Delay20us
CLR _clock
ACALL Delay370us
SETB _data ;data=1
SETB _clock ;clock=1
RET
BitOut:
MOV _data, C
ACALL Delay20us
CLR _clock
ACALL Delay40us
SETB _clock
ACALL Delay20us
RET
Delay370us:
ACALL Delay50us
ACALL Delay50us
ACALL Delay50us
ACALL Delay50us
ACALL Delay50us
ACALL Delay50us
ACALL Delay50us
ACALL Delay20us
RET
Delay50us:
ACALL Delay10us
Delay40us:
ACALL Delay20us
ACALL Delay20us
RET
Delay20us:
ACALL Delay10us
ACALL Delay10us
RET
Delay10us:
NOP
NOP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -