⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.lst

📁 SPLC501液晶显示模组驱动中文菜单显示Demo 代码
💻 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 + -