📄 keyboardhost.asm
字号:
;*************************************************************************
;检测是否有从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 + -