key.lst

来自「悬挂绘图系统(2005年全国电子设计大赛题目)基于凌阳单片机」· LST 代码 · 共 397 行 · 第 1/2 页

LST
397
字号
                     <      	.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
                     <      	//========================================================================================
000003DF                    	.IRAM
000003DF 00 00              	.VAR     I_KeyBuf = 0                 //保存键值
000003E0 00 00              	.VAR	I_Key_Delay = 0               //扫描有键按下的次数
                            	.EXTERNAL _KeyFlag                    //有键按下标识符
0000B665                    	.CODE
                            	//============================================================================================
                            	//函数: F_Key_Scan()
                            	//语法:void F_Key_Scan()
                            	//描述:键盘扫描函数
                            	//参数:无
                            	//返回:无
                            	//=============================================================================================
                            	.PUBLIC _F_Key_Scan;
                            	_F_Key_Scan: .PROC      
0000B665 09 93 F0 00        	    R1 = 0x00F0		                  //扫描键盘
0000B667 19 D3 00 70        		[P_IOA_Data] = R1
0000B669 4F 92              	    R1 = 0x000f           
0000B66A 11 B3 00 70        	    R1 &= [P_IOA_Data]
0000B66C 08 4E              	    JNZ L_Have_Key_Pressed
                            	L_NoKey_Press:                        //无键按下
0000B66D 40 92              	    R1 = 0 
0000B66E 19 D3 DF 03        	    [I_KeyBuf] = R1                   //清键盘缓冲区
0000B670 19 D3 99 03        	    [_KeyFlag] = R1
0000B672 19 D3 E0 03        	    [I_Key_Delay]=R1;
0000B674 90 9A              	    RETF
                            	L_Have_Key_Pressed:                  //有键按下处理         
0000B675 40 F0 7A B6        	    CALL   F_Key_Scaning             //行扫描确定键
0000B677 40 F0 9F B6        	    CALL   Enter_Key;                //确认有键按下
0000B679 90 9A              	    RETF       
                            	    .ENDP
                            	//============================================================================================
                            	//函数: unsigned F_Key_Scaning()
                            	//语法:void unsigned F_Key_Scaning()
                            	//描述:行扫描函数
                            	//参数:无
                            	//返回:扫描键值
                            	//=============================================================================================
                            	.PUBLIC	 F_Key_Scaning;	   
                            	F_Key_Scaning:
                            	F_Key_Scan_B7:   	    
0000B67A 0A 95 80 00        	    R2=0x0080                        //扫描第一行//changed by abin 扫描第四列
0000B67C 1A D5 00 70        		[P_IOA_Data] = R2  
0000B67E 4F 92              		R1 = 0x000f	    	   
0000B67F 11 B3 00 70        	    R1& =[P_IOA_Data]
0000B681 40 42              		CMP R1,0x0000                    //是否该行有键按下
0000B682 1A 4E              	    JNZ  F_Key_Pressed   	        
                            	F_Key_Scan_B6:
0000B683 0A 95 40 00        	    R2=0x0040                        //扫描第二行
0000B685 1A D5 00 70        		[P_IOA_Data] = R2
0000B687 4F 92              		R1 = 0x000f	    	   
0000B688 11 B3 00 70        	    R1& =[P_IOA_Data]
0000B68A 40 42              		CMP R1,0x0000                   //是否该行有键按下
0000B68B 11 4E              	    JNZ  F_Key_Pressed   
                            	F_Key_Scan_B5:           
0000B68C 60 94              	    R2=0x0020                       //扫描第三行
0000B68D 1A D5 00 70        		[P_IOA_Data] = R2
0000B68F 4F 92              		R1 = 0x000f	    	   
0000B690 11 B3 00 70        	    R1& =[P_IOA_Data] 
0000B692 40 42              		CMP R1,0x0000                   //是否该行有键按下
0000B693 09 4E              	    JNZ  F_Key_Pressed   
                            	F_Key_Scan_B4:
0000B694 50 94              		R2=0x0010                       //扫描第四行
0000B695 1A D5 00 70        		[P_IOA_Data] = R2
0000B697 4F 92              		R1 = 0x000f	    	   
0000B698 11 B3 00 70        	    R1& =[P_IOA_Data]
0000B69A 40 42              		CMP R1,0x0000                  //是否该行有键按下
0000B69B 01 4E              	    JNZ  F_Key_Pressed   
0000B69C 90 9A              		RETF		
                            	F_Key_Pressed:	
0000B69D 01 A5              	    R2|=R1                         //R2--B11~B8:输出   R1--B0~B7,输入
0000B69E 90 9A              	    RETF
                            	
                            	//============================================================================================
                            	//函数: Enter_Key()
                            	//语法:Enter_Key()
                            	//描述:确定有键按下函数
                            	//参数:无
                            	//返回:无
                            	//============================================================================================
                            	Enter_Key:
                            	Scan_first:
0000B69F 13 97 E0 03        	    R3 = [I_Key_Delay]
0000B6A1 40 46              	    CMP R3,0x0000
0000B6A2 06 4E              	    JNZ L_Scan_many;
0000B6A3 1A D5 DF 03        	    [I_KeyBuf] = R2;
0000B6A5 41 06              	    R3 += 1;
0000B6A6 1B D7 E0 03        	    [I_Key_Delay] = R3;
0000B6A8 90 9A              	    RETF;
                            	L_Scan_many:                         //去抖
0000B6A9 11 93 DF 03        	    R1 = [I_KeyBuf]        
0000B6AB 02 43              	    CMP R1,R2
0000B6AC 0F 4E              	    JNE L_Error_Key_pro;
0000B6AD 13 97 E0 03        	    R3 = [I_Key_Delay]
0000B6AF 41 06              	    R3 += 1;
0000B6B0 1B D7 E0 03        	    [I_Key_Delay] = R3;		
0000B6B2 50 46              		CMP		R3, 0x0010;         
0000B6B3 01 5E              		JE		L_Enter_Have_KeyDown;
0000B6B4 90 9A              		RETF;
                            	L_Enter_Have_KeyDown:
0000B6B5 41 92              		R1 = 1;
0000B6B6 19 D3 99 03        	    [_KeyFlag] = R1	
0000B6B8 40 96              	    R3 = 0;
0000B6B9 1B D7 E0 03        	    [I_Key_Delay]=R3	
0000B6BB 90 9A              	    RETF
                            	L_Error_Key_pro:
0000B6BC 40 96              	    R3 = 0;
0000B6BD 1B D7 E0 03        	    [I_Key_Delay]=R3
0000B6BF 1B D7 DF 03        		[I_KeyBuf] = R3
0000B6C1 90 9A              		RETF;
                            		    
                            	//============================================================================================
                            	//函数: unsigned F_Get_Key()
                            	//语法:unsigned F_Get_Key()
                            	//描述:取键值函数
                            	//参数:无
                            	//返回:键值
                            	//============================================================================================
                            	.PUBLIC		_F_Get_Key;       
                            	_F_Get_Key:    .PROC
0000B6C2 41 96              	    R3 = 1
0000B6C3 12 95 DF 03        	    R2 = [I_KeyBuf]
                            	L_Key_value_Loop:
0000B6C5 0B 0B D3 B6        	    BP = R3 + Key_Table
0000B6C7 C5 92              	    R1 = [bp]
0000B6C8 02 43              	    CMP R1,R2
0000B6C9 04 5E              	    JE L_KeyCode_Return
0000B6CA 41 06              	    R3 += 1
0000B6CB 52 46              	   CMP R3,18
                            	   // CMP R3,11
0000B6CC 48 8E              	    JBE L_Key_value_Loop
0000B6CD 40 96              	    R3=0
                            	L_KeyCode_Return:
0000B6CE 40 92              	    R1 = 0;
0000B6CF 19 D3 DF 03        	    [I_KeyBuf] = R1; 
0000B6D1 03 93              	    R1=R3     
0000B6D2 90 9A              	    RETF                             //清键盘缓冲区
                            	    .endp    
                            	 
                            	            
                            	 Key_Table:                          //改变 Key_Table可改变取键值对应的顺序
0000B6D3 88 00 84 00        	 .DW  0x0088,0x0084,0x0082,0x0081
         82 00 81 00
0000B6D7 48 00 44 00        	 .DW  0x0048,0x0044,0x0042,0x0041
         42 00 41 00
0000B6DB 28 00 24 00        	 .DW  0x0028,0x0024,0x0022,0x0021
         22 00 21 00
0000B6DF 18 00 14 00        	 .DW  0x0018,0x0014,0x0012,0x0011
         12 00 11 00
                            	 
                            	 //.DW  0x0011,0x0021,0x0041,0x0081
                            	 //.DW  0x0012,0x0022,0x0042,0x0082
                            	 //.DW  0x0014,0x0024,0x0044,0x0084
                            	 //.DW  0x0018,0x0028,0x0048,0x0088
                            	 
                            	  //  .DW 0x0000,0x0014,0x0024,0x0044
                            	  //  .DW 0x0012,0x0022,0x0042,0x0011
                            	  //  .DW 0x0021,0x0041,0x0028,0x0018
                            	  //  .DW 0x0081,0x0082,0x0084,0x0048      
                            	
                            	  
                            	  
0 error(s), 0 warning(s).

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?