📄 kybd.asm
字号:
;*******************************************
DEBOUNCEMAX equ 3 ;
KYBD1STTIME equ DEBOUNCEMAX + 30 ;
KYBD2NDTIME equ DEBOUNCEMAX + 12 ;
;*******************************************
KYBD_init:
clr KB_key_f ;
clr KB_cont_f ;
KYBD_Reset2Idle:
clr KYBD_keystate ;
clr KYBD_CrtCnt ;
clr KYBD_ContCnt ;
set KYBD_CrtKey ;
ret ;
;************************************
KYBD_GetKey:
set KIN_CTRL ;
nop ;
nop ;
nop ;
snz _KIN ;
jmp NoKeyPressed ;
mov a, 16 ;
mov w0, a ;
kgk_loop:
clr KIN_CTRL ;make it output pin.
nop ;
nop ;
clr _shifter_d ;shift in an 'L'
nop ;
nop ;
set _shifter_c ;
nop ;
nop ;
nop ;
clr _shifter_c ;
set KIN_CTRL ;
nop ;
nop ;
nop ;
snz _KIN ;
jmp KeyPressed ;
sdz w0 ;
jmp kgk_loop ;
NoKeyPressed:
set w0 ;no key pressed, scancode 0ffh
jmp KgkOK ;
KeyPressed:
KgkOK:
clr KIN_CTRL ;make it output pin.
mov a, KYBD_KeyState ;
addm a, pcl ;
jmp KYBD_KeyNot ;
jmp KYBD_KeyCntUp ;
jmp KYBD_KeyValid ;
jmp KYBD_KeyContCnt ;
KYBD_KeyNot:
mov a, 256-17 ;
add a, w0 ;
sz c ;
ret ;
KgkScanOK:
inc KYBD_CrtCnt ;key is pressed for the first time.
mov a, w0 ;
mov KYBD_CrtKey, a ;
inc KYBD_KeyState ;next state(KYBD_KeyCntUp)
ret ;
KYBD_KeyCntUp:
mov a, w0 ;
xor a, KYBD_CrtKey ;
sz z ;
jmp KgkSameKey1 ;
sdz KYBD_CrtCnt ;
ret ;
jmp KYBD_Reset2Idle ;
KgkSameKey1:
inc KYBD_CrtCnt ;
mov a, DEBOUNCEMAX ;
xor a, KYBD_CrtCnt ;
snz z ;
ret ;
inc KYBD_KeyState ;next state(KeyValid)
mov a, w0 ;
mov KB_ScanCode, a ;
set KB_key_f ;
ret ;
KYBD_KeyValid:
mov a, w0 ;
xor a, KYBD_CrtKey ;
sz z ;
jmp KgkSameKey2 ;
sdz KYBD_CrtCnt ;
ret ;
jmp KYBD_Reset2Idle ;
KgkSameKey2:
inc KYBD_ContCnt ;
mov a, KYBD_ContCnt ;
xor a, KYBD1STTIME ;
snz z ;
ret ;
set KB_cont_f ;
inc KYBD_KeyState ;
mov a, DEBOUNCEMAX ;
mov KYBD_CrtCnt, a ;
clr KYBD_ContCnt
ret ;
KYBD_KeyContCnt:
mov a, w0 ;
xor a, KYBD_CrtKey ;
sz z ;
jmp KgkSameKey3 ;
sdz KYBD_CrtCnt ;
ret ;
jmp KYBD_Reset2Idle ;
KgkSameKey3:
inc KYBD_ContCnt ;
mov a, KYBD_ContCnt ;
xor a, KYBD2NDTIME ;
snz z ;
ret ;
set KB_Cont_f ;
mov a, DEBOUNCEMAX ;
mov KYBD_CrtCnt, a ;
clr KYBD_ContCnt ;
ret ;
;********************************************************************
KBkey_convert:
snz KB_key_f ;
ret ;
clr KB_key_f ;
mov a, KB_scancode ;
and a, 00111111b ;
add a, LOW(KBkeyTbl) ;
mov tblp, a ;
tabrdl acc
mov KB_keycode, a ;
clr no_buz_f ;
jmp KeyCvt_com ;
KBcont_convert:
snz KB_cont_f ;
ret ;
clr KB_cont_f ;
snz KB_keycode.7 ;
ret ;
mov a, KB_keycode ;
set no_buz_f ;
KeyCvt_com:
set KJ_key_f ;
ret ;
;*************************************************************
buzonce_check:
snz buz_once_f ;
ret ;
sdz timer_buzonce ;
ret ;
clr buz_once_f ;
clr _buzzer ;
ret ;
;************************************
SetBuzOnce:
sz no_buz_f ;
ret ;when key press not released, only beep once.
set buz_once_f ;
mov a, TIME_BUZONCE ;
mov timer_buzonce, a ;
set _buzzer ;
ret ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -