📄 key447.asm
字号:
;------- 6M Crystal -------
ORG 0x00
;------Control Reg-------
Indirect == 0x0
Rtcc == 0x1
PC == 0x2
Status == 0x3
Fsr == 0x4
PortA == 0x7
PortB == 0x6
PortC == 0x5
IOCD == 0x0B ;P6 Wake up
IOCE == 0x0E ;WDT
IOCF == 0x0F ;Interrpt
ISR == 0x3F
;---- flags ----------
Carry == 0x0
DCFlag == 0x1
ZFlag == 0x2
PowerDownFlag == 0x3
TimeOutFlag == 0x4
PA0Flag == 0x5
PA1Flag == 0x6
IRP == 0x7
;------ Memory ------
Key_Command == 0x08
Key_Command_Temp == 0x09
Key_Command_Status == 0x0A
Key_Data == 0x0B
Key_Data_Temp == 0x0C
Key_Data_Status == 0x0D
Mouse_Command == 0x0E
Mouse_Command_Temp == 0x0F
Mouse_Command_Status == 0x11
Mouse_Data == 0x12
Mouse_Data_Temp == 0x13
Mouse_Data_Status == 0x14
Parity_Bit == 0x15
Timeout == 0x16
Loop_Count == 0x17
Data_Count == 0x18
Delay_Count == 0x19
; PortA.0 PS/2键盘DATA线
; PortA.1 PS/2键盘CLK线
; PortB 按键数据输出
; Key_Data 按键数据寄存器
Main:
JMP Start
JMP Read_INT
Start:
DISI
WDTC
CALL Init_Port
CALL Init_Key
ENI
Receive_Data:
CALL Receive_Key_Data
MOV A, Key_Data_Status
AND A, @0x01
JBS Status, 2
JMP Receive_Error
Receive_Succeed:
BC PortB, 7
MOV A, @0x02
MOV Data_Count, A
Receive_Error:
CALL Long_Delay
JMP Receive_Data
Read_INT:
MOV A, Key_Data
MOV PortB, A
RETI
Init_Port:
MOV A,@0x08 ; INT
IOW IOCF
MOV A, @0xFF
MOV PortA, A
IOW PortA
MOV A, @0x00
MOV PortB, A
MOV A, @0x00
IOW PortB
MOV A, @0xFF
MOV PortC, A
IOW PortC
RET
Init_Key:
MOV A, @0x00
MOV Key_Command, A
MOV Key_Command_Temp, A
MOV Key_Command_Status, A
MOV Key_Data, A
MOV Key_Data_Temp, A
MOV Key_Data_Status, A
MOV Parity_Bit, A
Led_On_Command:
MOV A, @0xED
MOV Key_Command, A
CALL Send_Key_Command
CALL Long_Delay
CALL Receive_Key_Data
CALL Long_Delay
CALL Long_Delay
MOV A, Key_Data
XOR A, @0xFA
JBS Status, 2
JMP Led_On_Command
Led_On_Number:
MOV A, @0x07
MOV Key_Command, A
CALL Send_Key_Command
CALL Long_Delay
CALL Receive_Key_Data
CALL Long_Delay
CALL Long_Delay
MOV A, Key_Data
XOR A, @0xFA
JBS Status, 2
JMP Led_On_Number
Set_Code_Command:
MOV A, @0xF0
MOV Key_Command, A
CALL Send_Key_Command
CALL Long_Delay
CALL Receive_Key_Data
CALL Long_Delay
CALL Long_Delay
MOV A, Key_Data
XOR A, @0xFA
JBS Status, 2
JMP Set_Code_Command
Set_Code_Number:
MOV A, @0x03
MOV Key_Command, A
CALL Send_Key_Command
CALL Long_Delay
CALL Receive_Key_Data
CALL Long_Delay
CALL Long_Delay
MOV A, Key_Data
XOR A, @0xFA
JBS Status, 2
JMP Set_Code_Number
Led_Off_Command:
MOV A, @0xED
MOV Key_Command, A
CALL Send_Key_Command
CALL Long_Delay
CALL Receive_Key_Data
CALL Long_Delay
CALL Long_Delay
MOV A, Key_Data
XOR A, @0xFA
JBS Status, 2
JMP Led_Off_Command
Led_Off_Number:
MOV A, @0x00
MOV Key_Command, A
CALL Send_Key_Command
CALL Long_Delay
CALL Receive_Key_Data
CALL Long_Delay
CALL Long_Delay
MOV A, Key_Data
XOR A, @0xFA
JBS Status, 2
JMP Led_Off_Number
RET
;--------------------
; Send Key Command
;--------------------
Send_Key_Command:
MOV A, @0x08
MOV Loop_Count, A
MOV A, @0x01
MOV Parity_Bit, A
MOV A, Key_Command
MOV Key_Command_Temp, A
MOV A, @0x00
MOV Key_Command_Status, A
MOV A, @0xFC
IOW PortA
MOV A, @0xFD ; Key CLK Low
MOV PortA, A
CALL Long_Delay ; 240uS
MOV A, @0xFE ; Key CLK High & Key Data Low
MOV PortA, A
IOW PortA
Key_Data_Out:
Key_Data_Out_Check_Low:
JBC PortA, 1
JMP Key_Data_Out_Check_Low
; CLK = 0
CALL Short_Delay
JBC Key_Command_Temp, 0
JMP Key_Bit_High_Out
Key_Bit_Low_Out:
BC PortA, 0
JMP Key_Next_Bit_Out
Key_Bit_High_Out:
BS PortA, 0
Key_Next_Bit_Out:
MOV A, Key_Command_Temp
XOR Parity_Bit, A
Key_Data_Out_Check_High:
JBS PortA, 1
JMP Key_Data_Out_Check_High
; CLK = 1
RRC Key_Command_Temp
DJZ Loop_Count
JMP Key_Data_Out
Key_Parity_Out:
Key_Parity_Out_Check_Low:
JBC PortA, 1
JMP Key_Parity_Out_Check_Low
; CLK = 0
CALL Short_Delay
JBC Parity_Bit, 0
JMP Key_Parity_High_Out
Key_Parity_Low_Out:
BC PortA, 0
JMP Key_Next_Bit_Out
Key_Parity_High_Out:
BS PortA, 0
Key_Parity_Out_Check_High:
JBS PortA, 1
JMP Key_Parity_Out_Check_High
; CLK = 1
Key_Stop_Out:
Key_Stop_Out_Check_Low:
JBC PortA, 1
JMP Key_Stop_Out_Check_Low
; CLK = 0
CALL Short_Delay
BS PortA, 0
Key_Stop_Out_Check_High:
JBS PortA, 1
JMP Key_Stop_Out_Check_High
; CLK = 1
Key_Ack_In:
MOV A, @0xFF
IOW PortA
Key_Ack_In_Check_Low:
JBC PortA, 1
JMP Key_Ack_In_Check_Low
; CLK = 0
JBC PortA, 0
JMP Key_Nak
Key_Ack:
MOV A, @0x02
MOV Key_Command_Status, A
RET
Key_Nak:
MOV A, @0x01
MOV Key_Command_Status, A
RET
;----------------------
; Key Receive Data
;----------------------
Receive_Key_Data:
MOV A, @0x08
MOV Loop_Count, A
MOV A, @0x80
MOV Parity_Bit, A
MOV A, @0x00
MOV Key_Data_Temp, A
MOV Key_Data_Status, A
MOV A, @0xFF
IOW PortA
MOV A, @0xFF
MOV Timeout, A
Key_Start_In_Wait:
DJZ Timeout
JMP Key_Start_In_Check_Low
JMP Key_Data_In_Error ; Wait 1ms
Key_Start_In_Check_Low:
JBC PortA, 1
JMP Key_Start_In_Wait
; CLK = 0
JBC PortA, 0
JMP Key_Data_In_Error
CALL Key_Check_CLK_High
MOV A, @0xFF
AND A, Timeout ; Timeout = 0 is Error
JBC Status, 2
JMP Key_Data_In_Error
; CLK = 1
Key_Data_In:
CALL Key_Check_CLK_Low
MOV A, @0xFF
AND A, Timeout ; Timeout = 0 is Error
JBC Status, 2
JMP Key_Data_In_Error
; CLK = 0
JBC PortA, 0
JMP Key_Bit_In_High
Key_Bit_In_Low:
BC Key_Data_Temp, 7
JMP Key_Next_Bit_In
Key_Bit_In_High:
BS Key_Data_Temp, 7
Key_Next_Bit_In:
XOR Parity_Bit, A
RRC Key_Data_Temp
CALL Key_Check_CLK_High
MOV A, @0xFF
AND A, Timeout ; Timeout = 0 is Error
JBC Status, 2
JMP Key_Data_In_Error
; CLK = 1
DJZ Loop_Count
JMP Key_Data_In
MOV A, Key_Data_Temp
MOV Key_Data, A
Key_Parity_In:
CALL Key_Check_CLK_Low
MOV A, @0xFF
AND A, Timeout ; Timeout = 0 is Error
JBC Status, 2
JMP Key_Data_In_Error
; CLK = 0
JBC PortA, 0
JMP Key_Parity_High
Key_Parity_Low:
JBC Parity_Bit, 7
JMP Key_Data_In_Error
JMP Key_Stop_In
Key_Parity_High:
JBS Parity_Bit, 7
JMP Key_Data_In_Error
Key_Parity_In_Done:
CALL Key_Check_CLK_High
MOV A, @0xFF
AND A, Timeout ; Timeout = 0 is Error
JBC Status, 2
JMP Key_Data_In_Error
; CLK = 1
Key_Stop_In:
CALL Key_Check_CLK_Low
MOV A, @0xFF
AND A, Timeout ; Timeout = 0 is Error
JBC Status, 2
JMP Key_Data_In_Error
JBS PortA, 0
JMP Key_Data_In_Error
MOV A, 02h;Key_Data_Receive_Succeed
MOV Key_Data_Status, A
RET
Key_Data_In_Error:
MOV A, 01h;Key_Data_Receive_Error
MOV Key_Data_Status, A
RET
Key_Check_CLK_Low:
MOV A, @0x40
MOV Timeout, A
Key_Check_CLK_Low_Loop:
DJZ Timeout
JMP Check_CLK_Low
JMP Key_High_Time_Out ; Wait 85us
Check_CLK_Low:
JBC PortA, 1
JMP Key_Check_CLK_Low_Loop
Key_High_Time_Out:
RET
Key_Check_CLK_High:
MOV A, @0x40
MOV Timeout, A
Key_Check_CLK_High_Loop:
DJZ Timeout
JMP Check_CLK_High ; Wait 80us
JMP Key_Low_Time_Out
Check_CLK_High:
JBS PortA, 1
JMP Key_Check_CLK_High_Loop
Key_Low_Time_Out:
RET
Long_Delay: ; Delay 240us
MOV A, @0x90
MOV Delay_Count, A
JMP Delay_Loop
Short_Delay: ; Delay 5us
MOV A, @0x03
MOV Delay_Count, A
Delay_Loop:
NOP
NOP
NOP
DJZ Delay_Count
JMP Delay_Loop
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -