📄 key.lst
字号:
0000A418 19 D3 47 06 [KeyBuf] = r1 //清键盘缓冲区
0000A41A 09 93 FF 00 r1=0xff; //if no key ,KeyCode=0xff
0000A41C 90 9A retf
Have_Key_Pressed: //有键按下处理
0000A41D 19 D3 47 06 [KeyBuf]=r1 //是否连续两次按键扫描值相同
0000A41F 40 F0 68 A4 call Delay10ms
0000A421 4F 92 r1 = 0x000f
0000A422 11 B3 00 70 r1 &= [P_IOA_Data]
0000A424 11 43 47 06 cmp r1,[KeyBuf]
0000A426 50 4E jne NoKey_Press
0000A427 40 F0 34 A4 call F_Key_Scaning //行扫描确定键
0000A429 40 F0 5C A4 call Key_Order //确定键码
0000A42B 1A D5 4D 06 [KeyValue]=r2
WaitDebon:
0000A42D 4F 92 r1 = 0x000f
0000A42E 11 B3 00 70 r1 &= [P_IOA_Data]
0000A430 44 4E jnz WaitDebon
0000A431 11 93 4D 06 r1=[KeyValue]
0000A433 90 9A retf //清键盘缓冲区
.endp
//////////////////////////////////////////
//行扫描函数
//函数名称:unsigned F_Key_Scaning()
//出口参数:扫描键值
//**************************************//
F_Key_Scaning:
F_Key_Scan_B7:
0000A434 0A 95 80 00 r2=0x0080 //扫描第一行
0000A436 1A D5 00 70 [P_IOA_Data] = r2
0000A438 4F 92 r1 = 0x000f
0000A439 11 B3 00 70 r1& =[P_IOA_Data]
0000A43B 40 42 cmp r1,0x0000 //是否该行有键按下
0000A43C 1D 4E jnz F_Key_Pressed
F_Key_Scan_B6:
0000A43D 0A 95 40 00 r2=0x0040 //扫描第二行
0000A43F 1A D5 00 70 [P_IOA_Data] = r2
0000A441 4F 92 r1 = 0x000f
0000A442 11 B3 00 70 r1& =[P_IOA_Data]
0000A444 40 42 cmp r1,0x0000 //是否该行有键按下
0000A445 14 4E jnz F_Key_Pressed
F_Key_Scan_B5:
0000A446 60 94 r2=0x0020 //扫描第三行
0000A447 1A D5 00 70 [P_IOA_Data] = r2
0000A449 4F 92 r1 = 0x000f
0000A44A 11 B3 00 70 r1& =[P_IOA_Data]
0000A44C 40 42 cmp r1,0x0000 //是否该行有键按下
0000A44D 0C 4E jnz F_Key_Pressed
F_Key_Scan_B4:
0000A44E 50 94 r2=0x0010 //扫描第四行
0000A44F 1A D5 00 70 [P_IOA_Data] = r2
0000A451 4F 92 r1 = 0x000f
0000A452 11 B3 00 70 r1& =[P_IOA_Data]
0000A454 40 42 cmp r1,0x0000 //是否该行有键按下
0000A455 04 4E jnz F_Key_Pressed
0000A456 40 92 r1=0
0000A457 40 94 r2=0
0000A458 19 D3 47 06 [KeyBuf] = r1
F_Key_Pressed:
0000A45A 01 A5 r2|=r1 //r2--B11~B8:output r1--B0~B7,input
0000A45B 90 9A retf
//***********************************//
//确定键值函数
//函数名称:Key_Order()
//***********************************//
Key_Order:
0000A45C 41 96 r3=1
Key_value_Loop:
0000A45D 0B 0B FD A5 bp = r3 + Key_Table
0000A45F C5 92 r1 = [bp]
0000A460 02 43 cmp r1,r2
0000A461 04 5E je KeyOrder_Ret
0000A462 41 06 r3 += 1
0000A463 4F 46 cmp r3,15 //modified by gywei ( cmp r3,11 )
0000A464 48 8E jbe Key_value_Loop
0000A465 40 96 r3=0
KeyOrder_Ret:
0000A466 03 95 r2=r3
0000A467 90 9A retf
//****************************************//
//延时函数
//函数名称:Delay10ms()
//****************************************//
Delay10ms:
0000A468 0C 99 FF 2F r4=0x2FFF
Delay10LOOP:
0000A46A 41 28 R4-=1
0000A46B 42 4E JNZ Delay10LOOP
0000A46C 90 9A RETF
0000A5FD .data
Key_Table:
// .dw 0x0000
0000A5FD 11 00 12 00 .dw 0x0011,0x0012,0x0014,0x0018
14 00 18 00
0000A601 21 00 22 00 .dw 0x0021,0x0022,0x0024,0x0028
24 00 28 00
0000A605 41 00 42 00 .dw 0x0041,0x0042,0x0044,0x0048
44 00 48 00
0000A609 81 00 82 00 .dw 0x0081,0x0082,0x0084,0x0088
84 00 88 00
//////////////////////////////////////////////////////////////////
// Function: Get Key code from key pad(8 x 1 key pad)
// Input: Port IOA b7-b0
// Output: R_KeyStrobe b7-b0
// | | | |
// +Vcc --- x --- x ... x --- x ---
// | | | |
// IOA.7 IOA.0
// Note: 1)link F_DebounceCntDown is necessary
// Destory register: r1, r2
//////////////////////////////////////////////////////////////////
F_Key_Scan_ServiceLoop:
0000A60D 11 93 00 70 r1 = [P_IOA_Data]; // get key data from IOA
0000A60F 09 B3 FF 00 r1 = r1 and 0xff; //
0000A611 12 95 49 06 r2 = [R_DebounceReg]; //
0000A613 19 D3 49 06 [R_DebounceReg] = r1; //
0000A615 12 45 49 06 cmp r2,[R_DebounceReg]; //
0000A617 04 5E je L_KS_StableTwoSample; //
0000A618 48 92 r1 = C_DebounceCnt; //debounce time setting
0000A619 19 D3 4A 06 [R_DebounceCnt] = r1; //
0000A61B 90 9A retf; //
L_KS_StableTwoSample:
0000A61C 11 93 4A 06 r1 = [R_DebounceCnt]; //
0000A61E 01 5E jz L_KS_StableOverDebounce; //
0000A61F 90 9A retf;
L_KS_StableOverDebounce:
0000A620 19 D3 4A 06 [R_DebounceCnt] = r1; //
0000A622 12 95 49 06 r2 = [R_DebounceReg]; //
0000A624 11 93 4B 06 r1 = [R_KeyBuf]; //
0000A626 1A D5 4B 06 [R_KeyBuf] = r2; //
0000A628 09 83 FF 00 r1 = r1 xor 0x00ff; //
0000A62A 11 B3 4B 06 r1 = r1 and [R_KeyBuf]; //
0000A62C 09 B3 FF 00 r1 = r1 and 0x00ff; //
0000A62E 11 A3 4C 06 r1 = r1 or [R_KeyStrobe]; //
0000A630 19 D3 4C 06 [R_KeyStrobe] = r1; //save stable key code to R_KeyStrobe
0000A632 90 9A retf;
//////////////////////////////////////////////////////////////////
// Function: debounce counter down count
//////////////////////////////////////////////////////////////////
F_Key_DebounceCnt_Down:
0000A633 11 93 4A 06 r1 = [R_DebounceCnt]; // Debounce subroutine for F_IO_Key_Scan:
0000A635 03 5E jz L_DebounceCntZero; // stop count if zero
0000A636 41 22 r1 -= 0x0001; //
0000A637 19 D3 4A 06 [R_DebounceCnt] = r1; //
L_DebounceCntZero: //
0000A639 90 9A retf; //
0 error(s), 0 warning(s).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -