📄 key.lst
字号:
<
<
< .EXTERNAL F_SP_Get_ADC
<
< .EXTERNAL F_SP_Set_P_TimerA_Ctrl
< .EXTERNAL F_SP_Set_P_TimerA_Data
< .EXTERNAL F_SP_Set_P_TimerB_Ctrl
< .EXTERNAL F_SP_Set_P_TimerB_Data
< .EXTERNAL F_SP_Set_P_INT_Ctrl
< .EXTERNAL F_SP_Set_P_INT_Clear
< .EXTERNAL F_SP_Set_P_SystemClock
< .EXTERNAL F_SP_Set_P_DAC_Ctrl
< .EXTERNAL F_SP_Set_P_ADC_Ctrl
<
<
<
< //--------------------------------------------
< SACM_MACRO1: .MACRO
<
< .ENDM
<
< SACM_MACRO2: .MACRO
<
< .ENDM
<
<
<
<
< //.define PC_Play_Enable_A2000 1 // Enable the PC-Play function for SACM-A2000 module
< //.define PC_Play_Enable_S480 1 // Enable the PC-Play function for SACM-S480 module
< //.define PC_Play_Enable_S240 1 // Enable the PC-Play function for SACM-S240 module
< //.define PC_Play_Enable_MS01 1 // Enable the PC-Play function for SACM-MS01 module
<
<
<
< //========================================================================================
< // End of hardware.inc
< //========================================================================================
000006C0 .IRAM
000006C0 00 00 .VAR I_KeyBuf = 0 //保存键值
000006C1 00 00 .VAR I_Key_Delay = 0 //扫描有键按下的次数
.EXTERNAL _KeyFlag //有键按下标识符
0000CCF3 .CODE
//============================================================================================
//函数: F_Key_Scan()
//语法:void F_Key_Scan()
//描述:键盘扫描函数
//参数:无
//返回:无
//=============================================================================================
.PUBLIC F_Key_Scan;
F_Key_Scan: .PROC
0000CCF3 09 93 F0 00 r1 = 0x00F0 //扫描键盘
0000CCF5 19 D3 00 70 [P_IOA_Data] = r1
0000CCF7 4F 92 r1 = 0x000f
0000CCF8 11 B3 00 70 r1 &= [P_IOA_Data]
0000CCFA 08 4E JNZ L_Have_Key_Pressed
L_NoKey_Press: //无键按下
0000CCFB 40 92 r1 = 0
0000CCFC 19 D3 C0 06 [I_KeyBuf] = r1 //清键盘缓冲区
0000CCFE 19 D3 0A 06 [_KeyFlag] = r1
0000CD00 19 D3 C1 06 [I_Key_Delay]=r1;
0000CD02 90 9A RETF
L_Have_Key_Pressed: //有键按下处理
0000CD03 40 F0 08 CD CALL F_Key_Scaning //行扫描确定键
0000CD05 40 F0 2D CD CALL Enter_Key; //确认有键按下
0000CD07 90 9A RETF
.ENDP
//============================================================================================
//函数: unsigned F_Key_Scaning()
//语法:void unsigned F_Key_Scaning()
//描述:行扫描函数
//参数:无
//返回:扫描键值
//=============================================================================================
.PUBLIC F_Key_Scaning;
F_Key_Scaning:
F_Key_Scan_B7:
0000CD08 0A 95 80 00 r2=0x0080 //扫描第一行//changed by abin 扫描第四列
0000CD0A 1A D5 00 70 [P_IOA_Data] = r2
0000CD0C 4F 92 r1 = 0x000f
0000CD0D 11 B3 00 70 r1& =[P_IOA_Data]
0000CD0F 40 42 CMP r1,0x0000 //是否该行有键按下
0000CD10 1A 4E JNZ F_Key_Pressed
F_Key_Scan_B6:
0000CD11 0A 95 40 00 r2=0x0040 //扫描第二行
0000CD13 1A D5 00 70 [P_IOA_Data] = r2
0000CD15 4F 92 r1 = 0x000f
0000CD16 11 B3 00 70 r1& =[P_IOA_Data]
0000CD18 40 42 CMP r1,0x0000 //是否该行有键按下
0000CD19 11 4E JNZ F_Key_Pressed
F_Key_Scan_B5:
0000CD1A 60 94 r2=0x0020 //扫描第三行
0000CD1B 1A D5 00 70 [P_IOA_Data] = r2
0000CD1D 4F 92 r1 = 0x000f
0000CD1E 11 B3 00 70 r1& =[P_IOA_Data]
0000CD20 40 42 CMP r1,0x0000 //是否该行有键按下
0000CD21 09 4E JNZ F_Key_Pressed
F_Key_Scan_B4:
0000CD22 50 94 r2=0x0010 //扫描第四行
0000CD23 1A D5 00 70 [P_IOA_Data] = r2
0000CD25 4F 92 r1 = 0x000f
0000CD26 11 B3 00 70 r1& =[P_IOA_Data]
0000CD28 40 42 CMP r1,0x0000 //是否该行有键按下
0000CD29 01 4E JNZ F_Key_Pressed
0000CD2A 90 9A RETF
F_Key_Pressed:
0000CD2B 01 A5 r2|=r1 //r2--B11~B8:输出 r1--B0~B7,输入
0000CD2C 90 9A RETF
//============================================================================================
//函数: Enter_Key()
//语法:Enter_Key()
//描述:确定有键按下函数
//参数:无
//返回:无
//============================================================================================
Enter_Key:
Scan_first:
0000CD2D 13 97 C1 06 r3 = [I_Key_Delay]
0000CD2F 40 46 CMP r3,0x0000
0000CD30 06 4E JNZ L_Scan_many;
0000CD31 1A D5 C0 06 [I_KeyBuf] = r2;
0000CD33 41 06 r3 += 1;
0000CD34 1B D7 C1 06 [I_Key_Delay] = r3;
0000CD36 90 9A RETF;
L_Scan_many: //去抖
0000CD37 11 93 C0 06 r1 = [I_KeyBuf]
0000CD39 02 43 CMP r1,r2
0000CD3A 0F 4E JNE L_Error_Key_pro;
0000CD3B 13 97 C1 06 r3 = [I_Key_Delay]
0000CD3D 41 06 r3 += 1;
0000CD3E 1B D7 C1 06 [I_Key_Delay] = r3;
0000CD40 50 46 CMP r3, 0x0010;
0000CD41 01 5E JE L_Enter_Have_KeyDown;
0000CD42 90 9A RETF;
L_Enter_Have_KeyDown:
0000CD43 41 92 r1 = 1;
0000CD44 19 D3 0A 06 [_KeyFlag] = r1
0000CD46 40 96 r3 = 0;
0000CD47 1B D7 C1 06 [I_Key_Delay]=r3
0000CD49 90 9A RETF
L_Error_Key_pro:
0000CD4A 40 96 r3 = 0;
0000CD4B 1B D7 C1 06 [I_Key_Delay]=r3
0000CD4D 1B D7 C0 06 [I_KeyBuf] = r3
0000CD4F 90 9A RETF;
//============================================================================================
//函数: unsigned F_Get_Key()
//语法:unsigned F_Get_Key()
//描述:取键值函数
//参数:无
//返回:键值
//============================================================================================
.PUBLIC _F_Get_Key;
_F_Get_Key: .PROC
0000CD50 40 96 r3 = 0
0000CD51 12 95 C0 06 r2 = [I_KeyBuf]
L_Key_value_Loop:
0000CD53 0B 09 62 CD r4 = r3 + Key_Table
0000CD55 C4 92 r1 = [r4]
0000CD56 02 43 CMP r1,r2
0000CD57 04 5E JE L_KeyCode_Return
0000CD58 41 06 r3 += 1
0000CD59 50 46 CMP r3,16
0000CD5A 48 8E JBE L_Key_value_Loop
0000CD5B 40 96 r3=0
L_KeyCode_Return:
0000CD5C 40 92 r1 = 0;
0000CD5D 19 D3 C0 06 [I_KeyBuf] = r1;
0000CD5F 0B 03 01 00 r1=r3+1
0000CD61 90 9A RETF //清键盘缓冲区
.ENDP
Key_Table:
0000CD62 14 00 24 00 .DW 0x0014,0x0024,0x0044,0x0012
44 00 12 00
0000CD66 22 00 42 00 .DW 0x0022,0x0042,0x0011,0x0021
11 00 21 00
0000CD6A 41 00 28 00 .DW 0x0041,0x0028,0x0018,0x0048
18 00 48 00
0000CD6E 81 00 82 00 .DW 0x0081,0x0082,0x0084,0x0088
84 00 88 00
0 error(s), 0 warning(s).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -