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

📄 keyboardhost.asm

📁 Keil c51 写的
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*************************************************************************
;检测是否有从PC输入
;***************************************************************************
Check_Data_From_PC	: 
	push	acc
	push	b
	push	r0_addr
	

	jnb	KB_DATA	,cdfp_0		;Data = 0
	setb	BusFree			;主机没有数据请求
	jmp	cdfp_1	
	
	cdfp_0	:			
	setb	KB_CLK			;保证CLK设备free
	mov	b	,#1		;
	call	Delay10us		;
	jnb	KB_CLK	,cdfp_Err	;延时10u测CLOK=1
	jb	KB_DATA	,cdfp_err	;DATA still = 0
	
	
	mov	r0	,#9

	cdfp_rev	:
	clr	KB_CLK			;CLK=0
	mov	b	,#2		;延时20us
	call	delay10us
	
	setb	KB_CLK			;CLK=1
	mov	b	,#1		
	call	Delay10us		;延时10us
	
	;-----------------------
	mov	b	,#20
	cdfp_Waite_Clk_Raise	:
	jb	KB_CLK	,cdfp_Clk_OK_0	;检测时钟线是否有被下拉,如没有,读出数据
	nop
;	mov	b	,#1		;如有:等待10us
;	jnb	KB_CLK	,cdfp_Err	;仍为低,出错
	djnz	b	,cdfp_Waite_Clk_Raise
	jmp	cdfp_Err

	cdfp_Clk_OK_0	:		;
	mov	c	,KB_DATA	;Get Data
	rrc	a		
	
	mov	b	,#1		;延时10us
	call	Delay10us
	
	djnz	r0	,cdfp_rev	;接收8位数据和一位奇偶校验位
;	;接收STOP位
	;
	clr	KB_CLK			;CLK=0
	mov	b	,#2		;延时20us
	call	delay10us
	
	setb	KB_CLK			;CLK=1
	mov	b	,#1		
	call	Delay10us		;延时10us
;	jb	KB_DATA	,cdfp_StopOK	;stop =1
;	mov 	b	,#2
	
	jnb	KB_DATA	,cdfp_Err
	
	cdfp_StopOK	:
	;发送回应位
	clr	KB_DATA			;回应位
	mov	b	,#1		;
	call	Delay10us		;

	clr	KB_CLK
	mov 	b	,#2
	call	Delay10us

	setb	KB_CLK
	mov	sbuf	,a
	mov	b	,#1
	call	Delay10us
	setb	KB_DATA
	
	;发送正确位
	mov	r0	,#0xFA
	mov	b	,#1
;	mov	r1	,#r0_addr
;	call	Send_Byte_To_Host_with	;送送接正OK BYTE
	jmp	cdfp_1


	cdfp_Err	:
	mov	r0	,#0xFE

	cdfp_1	:

	mov	b	,#1
	mov	r1	,#r0_addr
	call	Send_Byte_To_Host_with	;送送接正OK BYTE

	pop	r0_addr
	pop	b
	pop	acc
	ret


;*************************************************************************
;回应命令 Reset
;软件Reset
;***************************************************************************
Do_CMD_Reset	:;equ	0xFF 	;(Reset)
	push	acc	

	jmp	StartP		

	pop	acc
	ret


;CMD_Set_MkBk	equ	0xFC	;不发机打
;CMD_Set_MkTy	equ	0xFB 	;(Set Key Type Typematic)

;*************************************************************************
;回应命令CMD_Set_AllMkbkTyI
;All	Key	: Make /Break	/typemica
;***************************************************************************
Do_CMD_Set_AllMkbkTy	:	;equ	0xFA	;
	setb	Flag_All_Mk
	setb	Flag_All_Ty	
	setb	Flag_All_Bk	

	ret
;*************************************************************************
; CMD_Set_AllMk
;只有Make  code
;***************************************************************************
Do_CMD_Set_AllMk	:	;equ	0xF9 	;(Set All Keys Make)
	setb	Flag_All_Mk
	clr	Flag_All_Ty	
	clr	Flag_All_Bk	
	ret

;*************************************************************************
;Do_CMD_Set_AllMkBk
;
;***************************************************************************
Do_CMD_Set_AllMkBk	:	;equ	0xF8	;0xF8 (Set All Keys Make/Break)
	setb	Flag_All_Mk
	setb	Flag_All_Bk	
	clr	Flag_All_Ty	

	ret

;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Set_AllTy	:	;equ	0xF7 	;(Set All Keys Typematic)
	setb	Flag_All_Mk
	clr	Flag_All_Bk	
	setb	Flag_All_Ty	

	ret	
;*************************************************************************
;CMD_Set_Default
;
;***************************************************************************
Do_CMD_Set_Default		:	;equ	0xF6 	;(Set Default) 载入缺省的机打速率/延时10.9cps/500ms 按键类型(所有按键都使能机打/通
				;	码/断码) 以及第二套扫描码集
	ret
;*************************************************************************
;CMD_Dis
;
;***************************************************************************
Do_CMD_Dis	:	;equ	0xF5 	;(Disable)
	setb	Flag_Disable
	ret
;*************************************************************************
;CMD_Ena
;
;***************************************************************************
Do_CMD_Ena	:	;equ	0xF4 	;(Enable)
	clr	Flag_Disable
	ret

;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Set_TyRtDe	:	;equ	0xF3 	;(Set Typematic Rate/Delay)

;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Read_ID	:	;equ	0xF2 	;(Read ID)0xAB 0x83
	push	r0_addr

	mov	r1	,#tmpBy1
	mov	a	,#0xAB
	mov	@r1	,a
	inc	r1
	mov	a	,#0x83
	mov	@r1	,a

	mov	a	,#2
	mov	r1	,#tmpBy1
	call	Send_Byte_To_Host_with

	pop	r0_addr
	ret


;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Set_Code	:	;equ	0xF0 	;(Set Scan Code Set)


;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Echo	:	;equ	0xEE 	;(Echo)
	push	r0_addr

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Echo
	mov	@r1	,a

	mov	a	,#1
	call	Send_Byte_To_Host_with

	pop	r0_addr
	ret

;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_SET_CapsNum	:	;equ	0xED	;Caps	Num	Scroll 


	
	ret



;----------------------------------------------------------------------------------------------------------
;模拟PC端的处理程式
;----------------------------------------------------------------------------------------------------------
;*************************************************************************
;检测设备是否有输入请求
;R7	: 当前输入的数据
;***************************************************************************
Rev_from_Device	: 
	push	acc
	push	b
	push	r0_addr

	setb	KB_CLK
	rfd_start	:
	setb	p1.1
	mov	b	,#200
	rfd_wait_Start	:
	;jb	KB_CLK	,rfd_wait_Start	;检测时钟是否为低
	jnb	KB_CLK	,rfd_Start_OK	;检测时钟是否为低
	nop
	djnz	b	,rfd_wait_Start
	nop

	rfd_Start_OK	:
	mov	b	,#50
	jb	KB_DATA	,rfd_Err	;检测是否为启始位DATA=0
	nop

	
	;接收8位数据和一位奇偶
	mov	r0	,#9
	rfd_Rev_Data	:	
	
	mov	b	,#50;*2 = 100us
	rfd_Waite_Raise	: 
	jb	KB_CLK	,rfd_Raise_OK		;等待上升沿	;1us
	djnz	b	,rfd_Waite_Raise		;1us
	nop
	jmp	rfd_Err
	nop

	rfd_Raise_OK	:
	
	mov	b	,#50	;
	rfd_Waite_Follow	:
	jnb	KB_CLK	,rfd_Follow_OK		;等待下降沿
	djnz	b	,rfd_Waite_Follow
	nop
	jmp	rfd_Err
	nop

	rfd_Follow_OK	:
	rrc	a	
	mov	c	,KB_DATA

	nop
	djnz	r0	,rfd_Rev_data
	
	;等待停止位
	mov	b	,#50
	rfd_Stop_Raise	:
	jb	KB_CLK	,rfd_Stop_Raise_OK		;等待上升沿
	djnz	b	,rfd_Stop_Raise
	nop
	jmp	rfd_Err
	nop

	rfd_Stop_Raise_OK	:

	mov	b	,#50
	rfd_Stop_Follow	:
	jnb	KB_CLK	,rfd_Stop_Follow_OK		;等待下降沿
	djnz	b	,rfd_Stop_Follow
	nop	
	jmp	rfd_Err
	nop

	rfd_Stop_Follow_OK	:
	jnb	KB_DATA	,rfd_Err
	
;	mov	b	,#50
;	rfd_Waite_Last_Raise	:
;	jb	KB_CLK	,rfd_Last_Raise_OK
;	djnz	b	,rfd_Waite_Last_Raise
;	nop
;	jmp	rfd_Err
;	nop

	rfd_Last_Raise_OK	:
	clr	KB_CLK
	clr	p0.0
	clr	p1.1
	mov	R7	,a
	mov	sbuf	,a;#0x55

	clr	NeedResp	

	mov	b	,#5
	call	delay10us

	
	rfd_Err	:
	rfd_OK	:

	setb	KB_CLK
	setb	KB_DATA
;	mov	b	,#1
;	call	delay10us

	setb	p0.0
	;jmp	rfd_start

	pop	r0_addr
	pop	b
	pop	acc

	setb	KB_CLK
	setb	KB_DATA

	ret

;*************************************************************************
;发送数据到设备
;a	:要发送的个数
;R0	:要发送数据的地址
;***************************************************************************
SendDataToDevice	: 
	push	b	
	push	r1_addr
	push	r2_addr

	mov	r2	,a
	jz	sdtd_To_Over
	nop
	jmp	sdtd_Not_over
	nop
	sdtd_To_Over	:
	jmp	sdtd_Over

	sdtd_Not_over	:
	mov	a	,#90
	sdtd_Start_Send	:	
	clr	KB_CLK
	mov	b	,#11		;抑制总线100us
	call	Delay10us

	;数据线是否有被释放
	sdtd_Check_Data_Free	:
	jb	KB_Data	,sdtd_Data_free
	djnz	acc	,sdtd_Check_Data_Free	;sdtd_Start_Send
	jmp	sdtd_Err
	
	sdtd_Data_free	:
	clr	KB_DATA			;拉低DATA
	mov	b	,#1
	call	delay10us
	setb	KB_CLK
	;waite for clk = 0
	
;	mov	sbuf	,#0xa1
	mov	r1	,#255	;计时15ms15000
	sdtd_Waite_Start_Follow	:
	jnb	KB_CLK	,sdtd_Start_Follow_OK
	nop
	mov	b	,#5
	call	delay10us
	jnb	KB_CLK	,sdtd_Start_Follow_OK
	nop
	djnz	r1	,sdtd_Waite_Start_Follow
	
	jmp	sdtd_Err

	sdtd_Start_Follow_OK	:

	;发送数据位和奇校验位
	mov	a	,@r0
	mov	c	,p	
	cpl	c
	
	mov	r1	,#9

	sdtd_next_bit:
	rrc	a
	mov	KB_DATA	,c
	;waite for Raise
	mov	b	,#70
	sdtd_Waite_Raise	:
	jb	KB_CLK	,sdtd_Raise_OK
	nop
	djnz	b	,sdtd_Waite_Raise
;	nop
	jmp	sdtd_Err
;	nop

	sdtd_Raise_OK	:
	mov	b,#70
	sdtd_Waite_Follow	:
	jnb	KB_CLK	,sdtd_Follow_OK
	nop	
	djnz	b	,sdtd_Waite_Follow
;	nop	
	jmp	sdtd_err
;	nop
	
	sdtd_Follow_OK	:
	mov	b	,#1
	call	delay10us

	djnz	r1	,sdtd_next_bit

	;发送停止位
	setb	KB_DATA
	;waite for Raise
;	mov	r2	,#70
;	sdtd_Waite_Stop_Raise	:
;	jb	KB_CLK	,sdtd_Stop_Raise_OK
;	nop
;	djnz	r2	,sdtd_Waite_Stop_Raise
;	nop
;	jmp	sdtd_Err
;	nop

;	sdtd_Stop_Raise_OK	:
;	mov	r2,#70
;	sdtd_Waite_Stop_Follow	:
;	jnb	KB_CLK	,sdtd_Stop_Follow_OK
;	nop	
;	djnz	r2	,sdtd_Waite_Stop_Follow
;	nop	
;	jmp	sdtd_err
;	nop
	
;	sdtd_Stop_Follow_OK	:
;	mov	r2	,#1
;	call	delay10us

	;接收回应位
	mov	b	,#200
	sdtd_Waite_Ack	:
	jnb	KB_DATA	,sdtd_Ack_OK
	nop
	jnb	KB_DATA	,sdtd_Ack_OK	
	nop
	djnz	b	,sdtd_Waite_Ack
	nop
	jmp	sdtd_err

	
	sdtd_Ack_OK	:
	
;	mov	sbuf	,#0xa4
	mov	b	,#200
	sdtd_Waite_CLK_Raise	:
	jb	KB_CLK	,sdtd_Clk_Raise_OK
;	nop
	djnz	b	,sdtd_Waite_CLK_Raise
;	nop
	jmp	sdtd_Err

	sdtd_Clk_Raise_Ok	:
;	mov	sbuf	,#0xa5
	mov	b	,#200
	sdtd_Waite_Data_Raise	:
	jb	KB_DATA	,sdtd_Data_Raise_OK
;	nop
	djnz	b	,sdtd_Waite_Data_Raise;
;	nop
	jmp	sdtd_Err

	sdtd_Data_Raise_OK	:

	mov	a	,@r0
;	mov	sbuf	,a

	;接收FA
	setb	NeedResp
	mov	b	,#200
	
	sdtd_Wait_Ack_Byte	:
	call	Rev_from_Device
	
	jnb	NeedResp	,sdtd_Wait_Ack_Byte_Ok	
	djnz	b	,sdtd_Wait_Ack_Byte
	
	jmp	sdtd_Err

	sdtd_Wait_Ack_Byte_Ok	:

	inc	r0
	djnz	r2	,sdtd_To_Start_Send
	nop	
	jmp	sdtd_Over	
	nop
	
	sdtd_To_Start_Send	:
	jmp	sdtd_Start_Send
	nop
	
	
	sdtd_Err	:

	sdtd_Over	:
	setb	KB_CLK
	setb	KB_Data

	pop	r2_addr
	pop	r1_addr
;	pop	r0_addr
	pop	b
	ret




;____________________________________________________________________________________________
;扫描码表
;____________________________________________________________________________________________
Code_Set1	:
	DB	0x00
Code_Set2	:
	DB	0x00
Code_Set3	:
	DB	0x00



end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -