📄 key.lst
字号:
Sunplus u'nSP Assembler - Ver. 1.14.3.1
Listing File Has Been Relocated
//========================================================================================
// Progarm: The head file for key.asm in assembly view
// Arranged by: Andy Hsu
// Modified by Arthur Shieh
// Last modified date:
// 2000/06/23: first version
// 2000/07/20: modified
// 2002/5/31 : Modified by Arthur Shieh to use IOA8~IOA15 for keyscan
// 2005/8/12 : Modified by xinqiang for more user & function
// Functions:
// F_Key_Scan_Initial;
// F_Key_Scan_ServiceLoop;
// F_Key_DebounceCnt_Down;
//
// call F_SP_GetCh;
//========================================================================================
.DEFINE P_IOA_Data 0x7000 // Write Data into data register and read from IOA pad
.DEFINE P_IOA_Buffer 0x7001 // Write Data into buffer register and read from buffer register
.DEFINE P_IOA_Dir 0x7002 // Direction vector for IOA
.DEFINE P_IOA_Attrib 0x7003 // Attribute vector for IOA
.DEFINE P_IOA_Latch 0x7004 // Latch PortA data for key change wake-up
.DEFINE P_IOB_Data 0x7005 // Write Data into the data register and read from IOB pad
.DEFINE P_IOB_Buffer 0x7006 // Write Data into buffer register and read from buffer register
.DEFINE P_IOB_Dir 0x7007 // Direction vector for IOB
.DEFINE P_IOB_Attrib 0x7008 // Attribute vector for IOB
.define P_Watchdog_Clear 0x7012
//.INCLUDE hardware.inc;
.public _F_Key_Scan_Initial
.PUBLIC F_Key_Scan_Initial;
.public _F_Key_Scan_ServiceLoop
.PUBLIC F_Key_Scan_ServiceLoop;
.PUBLIC _SP_GetCh;
.PUBLIC F_SP_GetCh;
.PUBLIC R_KeyStrobe;
.public _F_KeyScan;
.define Port_Key P_IOA_Data //Key input port
.define Port_Key_A P_IOA_Attrib
.define Port_Key_D P_IOA_Dir
.define Port_Key_B P_IOA_Buffer
.define M_MASK 0x00ff //the port of the key input
.define M_ScanBegin 0x0001 //the begin bit of key scan
.define M_KeyNumber 0x0008 //key numbers
//////////////////////////////////////////////////////////////////
// RAM Define Area
//////////////////////////////////////////////////////////////////
00000001 .RAM
00000001 00 00 .VAR R_DebounceReg; //for keyboard scan
.DEFINE C_DebounceCnt 0x00f0;
00000002 00 00 .VAR R_KeyStrobe; //for keyboard scan
00000003 00 00 .var R_KeyCounter //key down counter
00000004 00 00 .var R_Keyflag //save the key flag
00000005 00 00 .var R_Keyoll //save the oll data of key
0000D486 .CODE
//////////////////////////////////////////////////////////////////
// Function: Initialization for F_Key_Scan_ServiceLoop
//////////////////////////////////////////////////////////////////
_F_Key_Scan_Initial:
F_Key_Scan_Initial:
0000D486 11 93 03 70 r1 = [Port_Key_A]
0000D488 09 B3 00 FF r1 = r1&(~M_MASK)
0000D48A 19 D3 03 70 [Port_Key_A] = r1
0000D48C 11 93 02 70 r1 = [Port_Key_D]
0000D48E 09 B3 00 FF r1 = R1&(~M_MASK)
0000D490 19 D3 02 70 [Port_Key_D] = r1
0000D492 11 93 01 70 r1 = [Port_Key_B]
0000D494 09 B3 00 FF r1 = r1&(~M_MASK)
0000D496 19 D3 01 70 [Port_Key_B] = r1
0000D498 40 92 r1 = 0x0000; //
0000D499 19 D3 03 00 [R_KeyCounter] = r1; //
0000D49B 19 D3 04 00 [R_Keyflag] = r1; //
0000D49D 19 D3 05 00 [R_Keyoll] = r1; //
0000D49F 19 D3 02 00 [R_KeyStrobe] = r1;
// r1 = C_DebounceCnt; //
// [R_DebounceCnt] = r1; //reset debounce counter
0000D4A1 90 9A retf;
//////////////////////////////////////////////////////////////////
// Function: Get Key code from key pad(8 x 1 key pad)
// Input: Port IOA b15-b8
// Output: R_KeyStrobe b7-b0
// | | | |
// +Vcc --- x --- x ... x --- x ---
// | | | |
// IOA.15 IOA.8
// Note: 1)link F_DebounceCntDown is necessary
// Destory register: r1, r2
//////////////////////////////////////////////////////////////////
_F_Key_Scan_ServiceLoop:
F_Key_Scan_ServiceLoop:
0000D4A2 11 93 00 70 r1 = [Port_Key]; // get key data from IOA
0000D4A4 0A 95 FF 00 r2 = M_MASK
0000D4A6 02 B3 r1 &= R2
0000D4A7 1D 4E jnz H_KeyHight //非零转
0000D4A8 12 95 05 00 r2 = [R_Keyoll]
0000D4AA 02 4E jnz L_KeyLow //上一次的键值非零,则转
0000D4AB 40 92 r1 = 0
0000D4AC 2C EE jmp L_KS_Exit2 //退出
L_KeyLow:
0000D4AD 12 95 04 00 r2 = [R_Keyflag]
0000D4AF 41 C4 test r2,0x0001
0000D4B0 09 4E jnz L_KeyLow_1 //标志位非零则转
0000D4B1 40 94 r2 = 0
0000D4B2 1A D5 03 00 [R_KeyCounter] = r2
0000D4B4 1A D5 04 00 [R_Keyflag] = r2
0000D4B6 19 D3 05 00 [R_Keyoll] = r1
0000D4B8 40 92 r1 = 0
0000D4B9 1F EE jmp L_KS_Exit2 //退出
L_KeyLow_1:
0000D4BA 40 94 r2 = 0
0000D4BB 1A D5 03 00 [R_KeyCounter] = r2
0000D4BD 1A D5 04 00 [R_Keyflag] = r2
0000D4BF 11 93 05 00 r1 = [R_Keyoll] //取上一次的键值
0000D4C1 40 94 r2 = 0
0000D4C2 1A D5 05 00 [R_Keyoll] = r2
0000D4C4 12 EE jmp L_KeyGet //到判断优先级的程序
H_KeyHight: //当次按键非零处理
0000D4C5 12 95 03 00 r2 = [R_KeyCounter]
0000D4C7 0A 45 F0 00 cmp r2,C_DebounceCnt //比较
0000D4C9 04 9E ja H_KeyHight_1 //大于规定数,转
0000D4CA 41 04 r2+=1 //Counter++
0000D4CB 1A D5 03 00 [R_KeyCounter] = r2
0000D4CD 05 EE jmp H_KeyHight_2
H_KeyHight_1:
0000D4CE 12 95 04 00 r2 = [R_Keyflag] //flag 置位
0000D4D0 41 A4 r2 |= 0x0001
0000D4D1 1A D5 04 00 [R_Keyflag] = r2
H_KeyHight_2:
0000D4D3 19 D3 05 00 [R_Keyoll] = r1
0000D4D5 40 92 r1 = 0
0000D4D6 02 EE jmp L_KS_Exit2 //退出
//L_KeyGet:
// r2 = r1 //键盘优先级而做的 begin....
// r3 = 0x0080 //Edit by xinqiang 2004.12.21
//L_KS_Renews2: //xinqiang@sunnorth.com.cn
// r3 = r3 lsl 1 //tel:010-62981668-2916
// test r3,0x2000 //
// jz L_KS_Renews12 //
// r1 = 0 //
// jmp L_KS_Exit2 //
//L_KS_Renews12: //
// r1 = r1&r3 //
// jnz L_KS_Exit2 //
L_KeyGet:
0000D4D7 01 EE jmp L_KS_Exit2
0000D4D8 02 93 r1 = r2 //
// jmp L_KS_Renews2 //....end
L_KS_Exit2:
0000D4D9 19 D3 02 00 [R_KeyStrobe] = r1; //save stable key code to R_KeyStrobe
0000D4DB 90 9A retf; //
//****************************************************************
// Function: Get Keycode for I/O Port
// Destory register: r1, r2
//****************************************************************
_SP_GetCh:
F_SP_GetCh:
0000D4DC 88 D4 push r2 to [SP];
0000D4DD 11 93 02 00 r1 = [R_KeyStrobe]; // Get Key code
0000D4DF 40 94 r2 = 0x0000; // Clear KeyStrobe for next key
0000D4E0 1A D5 02 00 [R_KeyStrobe] = r2; //
0000D4E2 88 92 pop r2 from [SP];
0000D4E3 90 9A retf;
//=================================================================//
//name:F_KeyScan
//for user: C function unsigned int F_KeyScan(void)
//output:Key Sand data from Key1~5 Key1>>Key2>>Key3>>Key4>>Key5
//note: noll
//=================================================================//
_F_KeyScan:.proc
F_KeyScan:
0000D4E4 A0 DA push r2,r5 to [sp]
0000D4E5 11 93 00 70 r1 = [Port_Key]
0000D4E7 09 83 FF 00 r1 ^= M_MASK
0000D4E9 02 4E jnz F_KeyScan_Get1
0000D4EA 40 92 r1 = 0
0000D4EB 1D EE jmp F_KeyScan_Exit
F_KeyScan_Get1:
0000D4EC 40 F0 0B D5 call F_Delay //call key Scan delay 10~18ms
0000D4EE 11 93 00 70 r1 = [Port_Key]
0000D4F0 09 83 FF 00 r1 ^= M_MASK
0000D4F2 02 4E jnz F_KeyScan_Get2 //check the key again
0000D4F3 40 92 r1 = 0
0000D4F4 14 EE jmp F_KeyScan_Exit
F_KeyScan_Get2:
0000D4F5 01 95 r2 = r1
0000D4F6 01 97 r3 = r1
0000D4F7 40 92 r1 = 0
0000D4F8 41 98 r4 = M_ScanBegin //0x0001
F_KeyScan_loop1:
0000D4F9 41 02 r1+=1
0000D4FA 04 B7 r3 = r3&r4
0000D4FB 05 4E jnz F_KeyScan_Exit1
0000D4FC 48 42 cmp r1,M_KeyNumber //8
0000D4FD 03 5E je F_KeyScan_Exit1
0000D4FE 44 99 r4 = r4 lsl 1
0000D4FF 02 97 r3 = r2
0000D500 48 EE jmp F_KeyScan_loop1
F_KeyScan_Exit1:
// r1 = r3
F_KeyScan_Exit2:
0000D501 41 96 r3 = 0x0001
0000D502 1B D7 12 70 [P_Watchdog_Clear] = r3
0000D504 12 95 00 70 r2 = [Port_Key]
0000D506 0A 85 FF 00 r2 ^= M_MASK
0000D508 48 4E jnz F_KeyScan_Exit2
F_KeyScan_Exit:
0000D509 A0 92 pop r2,r5 from [sp]
0000D50A 90 9A retf
.endp
F_Delay:
0000D50B 98 DA push r3 ,r5 to [sp]
0000D50C 0B 97 6D 6E r3=0x6e6d//0xDCDB
Dely_L:
0000D50E 41 98 r4 = 0x0001
0000D50F 1C D9 12 70 [P_Watchdog_Clear] = r4
0000D511 41 26 r3-=1
0000D512 45 4E jnz Dely_L
0000D513 98 94 pop r3,r5 from [sp]
0000D514 90 9A retf
//========================================================================================
// End of key.asm
//========================================================================================
0 error(s), 0 warning(s).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -