⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key447.asm

📁 EMC78P447捕捉PC键盘按键程序
💻 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 + -