📄 keyboard.asm
字号:
;发送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 + -