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

📄 keyboard.asm

📁 Keil c51 写的
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	;发送8位数据和奇校验位。
	mov	r1	,#9		
	
	skb_Send_Data	:
	setb	KB_CLK
	mov	b	,#3;1
	call	delay10us
	
	;主机抑制检测
	jnb	KB_CLK	,skb_Err

	skb_CLK_OK	:
	rrc	a
	mov	KB_DATA	,c

	mov	b	,#3;1
	call	delay10us
	clr	KB_CLK
	;等待数据被读取
	mov	b	,#2
	call	delay10us
	
	djnz	r1	,skb_Send_Data

	;发送STOP位
	setb	KB_CLK
	mov	b	,#3;1
	call	delay10us

	skb_Waite_Stop_Clk_Raise	:
	jnb	KB_CLK	,skb_Err
	
	skb_CLK_OK_1	:
	setb	KB_DATA
	mov	b	,#3;1
	call	delay10us
	

	clr	KB_CLK	
	mov	b	,#2
	call	delay10us

	setb	KB_CLK
	
	mov	b	,#5
	call	delay10us

	

	;发送完成
	
	mov	sbuf	,a
	;调整指针	
	mov	a	,#KeyBuff
	add	a	,#15
	cjne	a	,KBSHead	,skb_not_full
	mov	r0	,#KeyBuff
	jmp	skb_point_Ok
	
	skb_not_full	:
	inc	r0

	skb_point_Ok	:
	mov	KBSHead	,r0


	mov	b	,#100
	call	delay10us
	djnz	KBSCount	,skb_Ready_To_Send
;	dec	KBSCount
	
	jmp	skb_Over
	skb_Rec_From_Pc	:
	setb	Flag_Host_Request

	skb_Over	:
	skb_Err	:
	setb	KB_CLK
	setb	KB_DATA
	pop	r2_addr
	pop	r1_addr
	pop	r0_addr
	pop	b
	pop	acc
	setb	tr0	;The processing of send can't be break
	ret


;*************************************************************************
;执行BAT
;***************************************************************************
Do_bat	:
	push	acc
	push	r0_addr

	setb	Caps
	setb	Numb

	mov	r0	,#LastState
	mov	b	,#16
	
	bat_loop1	:
	mov	@r0	,#0xff
	inc	r0
	djnz	b	,bat_loop1

	mov	LastKey	,#0
;	mov	TypicalDelayCount	,#255	;equ	0x53	;机打延时计数器
;	mov	TypicalDelay		,#255		;equ	0x54	;机打延时设定值
;	mov	TypicalIntervalCount	,#50	;equ	0x55	;机打速度间隔计数
;	mov	TypicalInterval		,#50	;		;equ	0x56	;机打速度间隔设定值

	mov	TypicalDelayCount	,#125	;equ	0x53	;机打延时计数器
	mov	TypicalDelay		,#125		;equ	0x54	;机打延时设定值
	mov	TypicalIntervalCount	,#25	;equ	0x55	;机打速度间隔计数
	mov	TypicalInterval		,#25	;		;equ	0x56	;机打速度间隔设定值


	mov	DPTR	,#Code_Set2	;设定为第二编码集
	mov	a	,#TmpBy1
	mov	r1	,a
	mov	@r1	,#BAT_OK
	mov	a	,#1
	call	Send_Byte_To_Host_with


	clr	Caps
	clr	Numb

	setb	KB_CLK
	setb	KB_DATA

	pop	r0_addr
	pop	acc
	ret

;*************************************************************************
;检测是否有从PC输入
;***************************************************************************
Check_Data_From_PC	: 
	push	acc
	push	b
	push	r0_addr

	;mov	b	,#50	;for 24M
	;mov	b	,#25	;for 12M
	mov	b	,#12	;for 6M
	cdfc_check_Request	:
	jnb	KB_DATA	,cdfp_0		;Data = 0
	djnz	b	,cdfc_Check_Request
	setb	BusFree			;主机没有数据请求
	jmp	cdfp_Exit	
	
	cdfp_0	:			
;	setb	KB_CLK			;保证CLK设备free
	mov	b	,#3		;
	call	Delay10us		;
	;jnb	KB_CLK	,cdfp_Exit	;延时10u测CLOK=1
	jb	KB_DATA	,cdfp_Exit	;DATA still = 0
	
	mov	r0	,#9
	cdfp_rev	:
	clr	KB_CLK			;CLK=0
	mov	b	,#3		;延时20us
	call	delay10us
	
	setb	KB_CLK			;CLK=1
	mov	b	,#3;1		
	call	Delay10us		;延时10us
	
	;-----------------------
;	mov	b	,#20
	cdfp_Waite_Clk_Raise	:
	jnb	KB_CLK	,cdfp_Exit;cdfp_Clk_OK_0	;检测时钟线是否有被下拉,如没有,读出数据
;	nop
;	djnz	b	,cdfp_Waite_Clk_Raise
;	jmp	cdfp_Exit

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

	
	jnb	KB_CLk	,cdfp_Exit
	jnb	KB_DATA	,cdfp_Exit
	
	cdfp_StopOK	:
	;发送回应位
	clr	KB_DATA			;回应位
	mov	b	,#3;1		;
	call	Delay10us		;

	clr	KB_CLK
	mov 	b	,#3
	call	Delay10us

	setb	KB_CLK
	mov	b	,#3;1
	call	Delay10us
	setb	KB_DATA

	jnb	kb_Clk	,cdfp_Err
	
	;发送正确位

	;解析命令Parse_CMD
	;已经收到命令等待数据

	mov	sbuf	,a

	call	Parse_CMD
	
	jmp	cdfp_Exit
	cdfp_Err	:

	cdfp_1	:

	
	cdfp_Exit	:
	clr	Flag_Host_Request
	Setb	KB_Clk
	Setb	KB_Data
	pop	r0_addr
	pop	b
	pop	acc
	ret


;*************************************************************************
;回应命令 Reset
;软件Reset
;***************************************************************************
Do_CMD_Reset	:;equ	0xFF 	;(Reset)
	push	acc	
	mov	CMD	,#0
	
	mov	b	,#100
	call	delay10us

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_to_Host_with

	mov	b	,#5
	call	delay10us

	jmp	StartP		

	pop	acc
	ret

;*************************************************************************
;回应命令 Reset
;软件Reset
;***************************************************************************
Do_CMD_Resend	:
	push	r1_addr
	mov	CMD	,#0
	
	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_to_Host_with
	
	pop	r1_addr
	ret
;*************************************************************************
;回应命令CMD_Set_AllMkbkTyI
;All	Key	: Make /Break	/typemica
;***************************************************************************
Do_CMD_Set_AllMkbkTy	:	;equ	0xFA	;
	push	r1_addr
	mov	CMD	,#0
	
	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_to_Host_with
	setb	Flag_All_Mk
	setb	Flag_All_Ty	
	setb	Flag_All_Bk	
	
	pop	r1_addr
	ret
;*************************************************************************
; CMD_Set_AllMk
;只有Make  code
;***************************************************************************
Do_CMD_Set_AllMk	:	;equ	0xF9 	;(Set All Keys Make)
	push	r1_addr
	mov	CMD	,#0
	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_to_Host_with

	setb	Flag_All_Mk
	clr	Flag_All_Ty	
	clr	Flag_All_Bk	
	pop	r1_addr
	ret

;*************************************************************************
;Do_CMD_Set_AllMkBk
;
;***************************************************************************
Do_CMD_Set_AllMkBk	:	;equ	0xF8	;0xF8 (Set All Keys Make/Break)
	push	r1_addr

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With

	mov	CMD	,#0
	setb	Flag_All_Mk
	setb	Flag_All_Bk	
	clr	Flag_All_Ty	
	
	pop	r1_addr
	ret

;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Set_AllTy	:	;equ	0xF7 	;(Set All Keys Typematic)
	push	r1_addr

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With

	mov	CMD	,#0
	setb	Flag_All_Mk
	clr	Flag_All_Bk	
	setb	Flag_All_Ty	

	pop	r1_addr
	ret	
;*************************************************************************
;CMD_Set_Default
;
;***************************************************************************
Do_CMD_Set_Default		:	;equ	0xF6 	;(Set Default) 载入缺省的机打速率/延时10.9cps/500ms 按键类型(所有按键都使能机打/通
	push	r1_addr

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With
	mov	CMD	,#0
	
	pop	r1_addr
	ret
;*************************************************************************
;CMD_Dis
;
;***************************************************************************
Do_CMD_Dis	:	;equ	0xF5 	;(Disable)
	push	r1_addr

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With
	mov	cmd	,#0
	setb	Flag_Disable
	pop	r1_addr
	ret
;*************************************************************************
;CMD_Ena
;
;***************************************************************************
Do_CMD_Ena	:	;equ	0xF4 	;(Enable)
	push	r1_addr

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With
	mov	CMD	,#0
	clr	Flag_Disable
	mov	r0	,0xFA	;	码/断码) 以及第二套扫描码集
	pop	r1_addr
	ret

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

	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With
	setb	CMD_Waite_Data
	pop	r1_addr
	ret
;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Read_ID	:	;equ	0xF2 	;(Read ID)0xAB 0x83
	push	r1_addr

	mov	CMD	,#0

	mov	r1	,#TmpBy1
	mov	@r1	,#CMD_Rev_OK

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

	mov	a	,#3
	mov	r1	,#TmpBy1
	call	Send_Byte_To_Host_with

	pop	r1_addr
	ret


;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Set_Code	:	;equ	0xF0 	;(Set Scan Code Set)
	push	r1_addr
	mov	r1	,#TmpBy1
	mov	a	,#CMD_Rev_OK
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With
	mov	CMD	,#0
	pop	r1_addr
	ret

;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_Echo	:	;equ	0xEE 	;(Echo)
	push	r1_addr
	
	mov	CMD	,#0
	mov	r1	,#tmpBy1
	mov	a	,#CMD_Echo
	mov	@r1	,a

	mov	a	,#1
	call	Send_Byte_To_Host_with

	pop	r1_addr
	ret

;*************************************************************************
;回应命令Read I
;向Host 发送0xAB	0x83
;***************************************************************************
Do_CMD_SET_CapsNum	:	;equ	0xED	;Caps	Num	Scroll 
	push	r1_addr
	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_Ok
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With
	setb	CMD_Waite_Data

	pop	r1_addr
	ret


;*************************************************************************
;解析并处理命令
;a	收到的参数
;R0	返回值,如果正确为0xFA ,错误为0xFC
;***************************************************************************
Parse_CMD	:
	push	b
	

	jnb	CMD_Waite_Data	,pc_Cmd_Byte
	;处理数据
	clr	CMD_Waite_Data
	mov	r1	,#tmpBy1
	mov	a	,#CMD_Rev_Ok
	mov	@r1	,a
	mov	a	,#1
	call	Send_Byte_To_Host_With

	mov	b	,a
	
	mov	a	,CMD
	;设定机打延时和速率
	cjne	a	,#CMD_Set_TyRtDe	,pc_Data_CMD_Set_Code
	mov	b	,a
	anl	a	,#0x1f

	mov	TypicalInterval	,#50

	mov	CMD	,#0
	jmp	CMD_Over
	
	;扫描码集
	pc_Data_CMD_Set_Code	:
	cjne	a	,#CMD_Set_Code	,pc_Data_CMD_SET_CapsNum
	mov	CMD	,#0
	jmp	CMD_Over

	pc_Data_CMD_SET_CapsNum	:
	cjne	a	,#CMD_SET_CapsNum	,pc_Err
	rrc	a	
	;scroll screen
	rrc	a	
	mov	Numb	,c
	rrc	a	
	mov	Caps	,c
	mov	CMD	,#0
	jmp	CMD_Over

	;处理命令
	pc_Cmd_Byte	:
	mov	CMD	,a

	cjne	a	,#CMD_Reset	,_Resend_
	call	DO_CMD_Reset
	mov	CMD	,#0
	jmp	CMD_Over
	

	_Resend_:

	cjne	a	,#CMD_Resend	,_Set_AllMkbkTy_
	call	Do_CMD_Resend
	mov	CMD	,#0
	jmp	CMD_Over

	_Set_AllMkbkTy_	:
	cjne	a	,#CMD_Set_AllMkBKTY	,_CMD_Set_AllMk
	Call	do_CMD_Set_AllMkbkTy
;	mov	CMD	,#0
	jmp	CMD_Over
	
	_CMD_Set_AllMk	:
	cjne	a	,#CMD_Set_AllMk	,_CMD_Set_AllMkBk
	call	do_CMD_Set_AllMk
;	mov	CMD	,#0
	jmp	CMD_Over
	
	_CMD_Set_AllMkBk	:
	cjne	a	,#CMD_Set_AllMkBk	,_CMD_Set_AllTy
	call	do_CMD_Set_AllMkBk
;	mov	CMD	,#0
	jmp	CMD_Over

	_CMD_Set_AllTy	:
	cjne	a	,#CMD_Set_AllTy	,_CMD_Set_Default
	call	do_CMD_Set_AllTy
;	mov	CMD	,#0
	jmp	CMD_Over


	_CMD_Set_Default	:
	cjne	a	,#CMD_Set_Default	,_CMD_Dis
	call	do_CMD_Set_Default
;	mov	CMD	,#0
	jmp	CMD_Over
	
	_CMD_Dis	:
	cjne	a	,#CMD_Dis	,_CMD_Ena
	call	do_CMD_Dis
;	mov	CMD	,#0
	jmp	CMD_Over

	_CMD_Ena	:
	cjne	a	,#CMD_Ena	,_CMD_Set_TyRtDe
	call	do_CMD_Ena
;	mov	CMD	,#0
	jmp	CMD_Over

	_CMD_Set_TyRtDe	:
	cjne	a	,#CMD_Set_TyRtDe	,_CMD_Read_ID
	call	do_CMD_Set_TyRtDe
;	mov	CMD	,#0
	jmp	CMD_Over

	_CMD_Read_ID	:
	cjne	a	,#CMD_Read_ID	,_CMD_Set_Code
	call	do_CMD_Read_ID
;	mov	CMD	,#0
	jmp	CMD_Over

	_CMD_Set_Code	:
	cjne	a	,#CMD_Set_Code	,_CMD_Echo
	call	do_CMD_Set_Code
;	mov	CMD	,#0
	jmp	CMD_Over

	_CMD_Echo	:
	cjne	a	,#CMD_Echo	,_CMD_SET_CapsNum
	;mov	sbuf	,a
	call	do_CMD_Echo
;	mov	CMD	,#0
	jmp	PC_Over

⌨️ 快捷键说明

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