?? kb.asm
字號:
;***************************; >-< G Soft Creations >-<;---------------------------; AT Keyboard Routines;***************************;----------------; RAM Usage:;----------------; Keyboard vars.equ KB_OK, 0x45.equ KB_DATA, 0x46.equ KB_STATS, 0x47.equ KB_SCAN, 0x48.equ KB_TEMP, 0x49 ; For the da*n pause key;------------------; Defines;------------------;XXXXXXXXXXXXXXXXXXXXXXXX KeyBoard XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.flag KEYB_DATA, P1.5 ; AT Keyboard data (change this for your hardware).flag KEYB_CLOCK, P3.2 ; AT Keyboard Clock (change this for your hardware); This 2 pins should be connected to the keyboard crresponded pins with an 4K7 Pullup.; The keyboard also needs GND and +5V. .equ KB_LSHIFT, 0x12.equ KB_RSHIFT, 0x59.equ KB_CTRL, 0x14.equ KB_ALT, 0x11.equ KB_CAPS, 0x58.equ KB_SCROLL, 0x7E.equ KB_NUML, 0x77.equ KB_TAB, 0x0D.equ KB_REL, 0xF0.equ KB_EXT, 0xE0.equ KB_PAUSE, 0xE1; For the stauts flags (KB_STATS).equ CAPS, 0x01.equ NUML, 0x02.equ SCROLL, 0x04.equ SHIFT, 0x08.equ ACK, 0x10.equ CTRL, 0x20.equ ALT, 0x40.equ RELEASE, 0x80; For the stauts flags 2 (KB_OK).equ PAUSED, 0x40.equ EXTENDED, 0x80;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;---------------------; Keyboard Routines:;---------------------;*************************************; WaitKB: Wait for keypress;*************************************WaitKB: acall Check_Keyb jnc WaitKB ret;*************************************; InitKeyb: c=1 if ACK OK;*************************************CheckACK: mov a, KB_STATS mov c, acc.4 clr acc.4 mov KB_STATS, a ret;*************************************; InitKeyb:;*************************************InitKeyb: mov KB_TEMP, #0 mov KB_OK, #0 mov r1, #0xFF acall Write_Keyb acall Check_Keyb acall CheckACK jnc InitKeyb mov r1, #0xF4 ; Enable acall Write_Keyb acall Check_Keyb acall CheckACK jnc KeybErr mov r1, #0xF3 ; Set Typematic acall Write_Keyb acall Check_Keyb acall CheckACK jnc KeybErr mov r1, #0x00 ; Typematic = 250 ms / 30 cps acall Write_Keyb acall Check_Keyb acall CheckACK jnc KeybErr mov KB_OK, #1 mov KB_STATS, #2 ; Num Lock ON;*************************************; Keyb_Leds: Set KB_STATS as leds;*************************************Keyb_Leds: mov r1, #0xED ; Set Leds acall Write_Keyb acall Check_Keyb acall CheckACK jnc KeybErr mov r1, KB_STATS acall Write_Keyb acall Check_Keyb acall CheckACKKeybErr: ret;*************************************; Zero2One: Wait for 0 to 1 on kb; clock line, read the kb data line; and shift right the bit to acc.7;*************************************Zero2One: jnb KEYB_CLOCK, * jb KEYB_CLOCK, * mov c, KEYB_DATA rrc a ret;*************************************; Check_Keyb: Check to see if any key; are pressed or release, returns; ASCII codes on KB_DATA, or 1 for; special keys, 2 for same special; with shift. Return also the scan; code on KB_SCAN.; Special Keys are basicaly all non; printable keys. See the table below; all 1 and 2 returned are special keys;*************************************Check_Keyb: setb KEYB_DATA setb KEYB_CLOCK ; CLOCK & DATA high = Idle Pos mov r0, #50 CheckAgain: jnb KEYB_CLOCK, KeyHit djnz r0, CheckAgain ; check r0 times sjmp KeyEndKeyHit: jnb KEYB_DATA, KeyHit2 ; Start bit must be 0KeyEnd: clr KEYB_CLOCK ; disable keyb clr c ; c=0 = no keypress retKeyHit2: mov r0, #8 ; 8 bits clr aKeyHit3: acall Zero2One djnz r0, KeyHit3 mov r1, a clr a acall Zero2One ; Parity bit acall Zero2One ; Stop bit ; acc.7 = stop, acc.6 = parity clr KEYB_CLOCK mov a, KB_TEMP jz NoIgnore dec KB_TEMP ; Igonre pause scans sjmp ChkKbEndNCNoIgnore: mov KB_SCAN, r1 cjne r1, #0xFA, NoKbACK orl KB_STATS, #ACK sjmp ChkKbEndNCNoKbACK: cjne r1, #KB_PAUSE, NoKbPause mov KB_TEMP, #7 ; Ignore next 7 scans mov a, KB_OK cpl acc.6 mov KB_OK, a sjmp ChkKbEndNCNoKbPause: cjne r1, #KB_EXT, NoKbExt orl KB_OK, #EXTENDED sjmp ChkKbEndNCNoKbExt: cjne r1, #KB_REL, NoRelease orl KB_STATS, #RELEASE sjmp ChkKbEndNCNoRelease:; Test Num lock, if pressed toggle led cjne r1, #KB_NUML, NoNumLock mov a, KB_STATS jnb acc.7, ChkKbEndNC cpl acc.1 clr acc.7 mov KB_STATS, a acall Keyb_Leds sjmp ChkKbEndNCNoNumLock:; Test Caps lock, if pressed toggle led cjne r1, #KB_CAPS, NoCapsLock mov a, KB_STATS jnb acc.7, ChkKbEndNC cpl acc.2 clr acc.7 mov KB_STATS, a acall Keyb_Leds sjmp ChkKbEndNCNoCapsLock:; Test Scroll lock, if pressed toggle led cjne r1, #KB_SCROLL, NoScrollLock mov a, KB_STATS jnb acc.7, ChkKbEndNC cpl acc.0 clr acc.7 mov KB_STATS, a acall Keyb_LedsChkKbEndNC: clr c retNoScrollLock:; Test L & R shifts, set bit if pressed, clear on release cjne r1, #KB_LSHIFT, NoShift1ShiftOK: mov a, KB_STATS jbc acc.7, ShiftRel setb acc.3 ; not releasing, so Set SHIFT bit sjmp ShiftEndShiftRel: clr acc.3 ; releasing, so Clear SHIFT bitShiftEnd: mov KB_STATS, a sjmp ChkKbEndNC NoShift1: cjne r1, #KB_RSHIFT, NoShift sjmp ShiftOKNoShift: cjne r1, #KB_CTRL, NoCtrl mov a, KB_STATS jbc acc.7, CtrlRel setb acc.5 ; not releasing, so Set CTRL bit sjmp CtrlEndCtrlRel: clr acc.5 ; releasing, so Clear SHIFT bitCtrlEnd: mov KB_STATS, a sjmp ChkKbEndNC NoCtrl: cjne r1, #KB_ALT, NoAlt mov a, KB_STATS jbc acc.7, AltRel setb acc.6 ; not releasing, so Set ALT bit sjmp AltEndAltRel: clr acc.6 ; releasing, so Clear ALT bitAltEnd: mov KB_STATS, a sjmp ChkKbEndNC NoAlt: mov a, KB_STATS ; Releasing key test jnb acc.7, NoRel2 clr acc.7 ; if releasing > clear mov KB_STATS, a ; rel bit on KB_STATS clr c ; and do nothing retNoRel2: mov a, KB_OK ; Extended key test jnb acc.7, KbChars clr acc.7 ; if Extended > clear mov KB_OK, a ; EXT bit on KB_OK clr c ; and do nothing retKbChars: mov dptr, #KbScanCodes mov a, KB_STATS jnb acc.2, TestShift jb acc.3, KbChkOK mov a, r1 movc a, @a+dptr mov r0, a subb a, #97 jc KbChkOK mov a, r0 subb a, #123 jnc KbChkOK mov dptr, #KbScanCodes2 ; if (a to z) & Caps > table 2 sjmp KbChkOKTestShift: jnb acc.3, KbChkOK mov dptr, #KbScanCodes2 ; with shift table 2KbChkOK: mov a, r1 movc a, @a+dptr mov KB_DATA, a setb c ret;*************************************; Zero2One2: Wait for high to low in; kb clock line;*************************************Zero2One2: jnb KEYB_CLOCK, * jb KEYB_CLOCK, * ret;*************************************; Write_Keyb: Send r1 to the kb;*************************************Write_Keyb: mov r0, #8 ; 8 bits to receive clr KEYB_CLOCK ; break the Keyboard mov r7, #0x00 ; some delay (safety reasons)_WKwait:djnz r7, _WKwait clr KEYB_DATA ; request to send setb KEYB_CLOCK ; enable the Keyboard acall Zero2One2 ; Start Bit mov a, r1 ; Data BitsTxData: rrc a mov KEYB_DATA, c acall Zero2One2 djnz r0, TxData mov a, r1 ; calculate parity bit mov c, psw.0 ; this is Even parity cpl c ; and Keyboard needs Odd parity mov KEYB_DATA, c ; send parity bit acall Zero2One2 setb KEYB_DATA ; send stop bit acall Zero2One2 acall Zero2One2 mov c, KEYB_DATA ; get ACK bit clr KEYB_CLOCK ; stop the keyboard ret;*************************************************************************; Main Routine: Example of kb usage;*************************************************************************Start: acall InitKeyb mov a, KB_OK jz KBNotOKLoop: acall Check_Keyb jnc Loop mov a, KB_SCAN cjne a, #0x71, NoCtrlAltDel ; Check for extended Del mov a, KB_STATS jnb acc.5, NoCtrlAltDel ; Check for Ctrl jnb acc.6, NoCtrlAltDel ; Check for Alt ljmp Start ; If Ctrl+Alt+Del ResetNoCtrlAltDel: mov a, KB_DATA cjne a, #1, ChkEsp2 ; Here handle Especial Keys mov a, KB_SCAN cjne a, #5, NoF1Key ; Do something here for F1NoF1Key: cjne a, #6, NoF2Key ; Do something here for F2NoF2Key: cjne a, #4, NoF3Key ; Do something here for F1NoF3Key: sjmp LoopChkEsp2: cjne a, #2, NoEsp ; Here handle Shift + Especial Keys mov a, KB_SCAN cjne a, #5, NoShfF1Key ; Do something here for Shift + F1NoShfF1Key: sjmp LoopNoEsp: ; Rest of prgram sjmp Loop; last 262 addr of code mem with scan codes tables.org 0x1EF8KbScanCodes:; Keyboard Scancodes; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~.db 0, 1 , 0, 1 , 1 , 1 , 1 , 1 , 0, 1 , 1 , 1 , 1 , 1 , '~'; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @.db 0, 0, 0 , 0 , 0, 0 , 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2'; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R.db 0, 0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r'; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &.db '5', 0, 0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7'; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P.db '8', 0, 0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p'; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, | .db '-', 0, 0, 0, ''', 0, '[', '=', 0, 0, 0 , 0 , 1 , ']', 0, 92; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0.db 0, 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl.db '.', '2', '5', '6', '8', 1 , 0 , 1 , '+', '3', '-', '*', '9', 0; ?, ?, ?, ?, F7.db 0, 0, 0, 0, 1KbScanCodes2:; Keyboard Scancodes with shift; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~.db 0, 2 , 0, 2 , 2 , 2 , 2 , 2 , 0, 2 , 2 , 2 , 2 , 2 , '`'; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @.db 0, 0, 0 , 0 , 0, 0 , 'Q', '!', 0, 0, 0, 'Z', 'S', 'A', 'W', '@'; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R.db 0, 0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R'; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &.db '%', 0, 0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&'; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P.db '*', 0, 0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P'; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, | .db '_', 0, 0, 0, '"', 0, '{', '+', 0, 0, 0 , 0 , 2 , '}', 0, '|'; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0.db 0, 0, 0, 0, 0, 0, 0, 0, 2 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl.db '.', '2', '5', '6', '8', 2 , 0 , 2 , '+', '3', '-', '*', '9', 0; ?, ?, ?, ?, F7.db 0, 0, 0, 0, 2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -