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

📄 中断初始化键扫描.lst

📁 该程序是用C编写的
💻 LST
📖 第 1 页 / 共 2 页
字号:
                     <      	.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
                     <      	//========================================================================================
                            	.EXTERNAL _Hour;
                            	.EXTERNAL _Min;
                            	.EXTERNAL _Sec;
                            	.EXTERNAL _Day;
                            	.EXTERNAL _Mon;
                            	.EXTERNAL _Year;
                            	.EXTERNAL _Funcflag;
                            	.EXTERNAL _Worked;           //键值处理标志
                            	.EXTERNAL _Keydown;            //按键标志
                            	.EXTERNAL _Funcflag;         //进位判断标志
                            	.EXTERNAL _Keycode;         //键值保存标量
                            	.EXTERNAL _stopflag;          //半秒标志位,1表示已经有一次半秒响应
                            	.EXTERNAL _Flag;
                            	.EXTERNAL _Function;
                            	
                            	.PUBLIC _SystemInit
000087EE                    	.code
                            	_SystemInit:
000087EE 09 93 FF 07        	     r1=0x07ff;           //IOB初始化
000087F0 19 D3 07 70        	     [P_IOB_Dir]=r1;
000087F2 19 D3 08 70        	     [P_IOB_Attrib]=r1;
000087F4 19 D3 05 70        	     [P_IOB_Data]=r1;
                            	     
000087F6 4F 92              	     R1 = 0x000f;         //IOA初始化
000087F7 19 D3 03 70        	     [P_IOA_Attrib] = R1;    
000087F9 19 D3 02 70        	     [P_IOA_Dir] = R1;
000087FB 09 93 F0 00        	     r1=0x00f0;
000087FD 19 D3 00 70        	     [P_IOA_Data] = R1;
                            	     
000087FF 40 F1              	     int off 
00008800 09 93 88 00        	     r1=0x0088;          //开IRQ5的2HZ.IRQ3的中断
00008802 19 D3 10 70        	     [P_INT_Ctrl]=r1;
00008804 49 F1              	     IRQ ON;
00008805 98 9A              	     RETI;
0000808B                    	.text     
                            	.public _IRQ3
                            	
                            	_IRQ3:
0000808B A0 D8              	      push r1,r4 to [sp]
                            	      
0000808C 09 93 00 01        	      r1 = 0x0100
0000808E 11 C3 10 70        	      TEST r1,[P_INT_Ctrl];
00008090 0E 4E              	      jnz _IRQ3_EXT1
                            	      
00008091 0A 95 00 02        	      r2 = 0x0200
00008093 11 C3 10 70        	      TEST r1,[P_INT_Ctrl];
00008095 0D 4E              	      jnz _IRQ3_EXT2
                            	
00008096 09 93 80 00        	      r1=0x0080;     
00008098 19 D3 11 70        	      [P_INT_Clear]=r1;
0000809A 41 92              	      r1=1
0000809B 19 D3 35 00        	      [_Keydown]=r1;
0000809D A0 90              	      POP R1,R4 FROM [SP];
0000809E 98 9A              	      RETI;
                            	
                            	_IRQ3_EXT1: 
0000809F 19 D3 11 70        	 	  [P_INT_Clear]=r1;
000080A1 A8 90              	     POP R1,R5 FROM [SP];
000080A2 98 9A              	     reti;
                            	
                            	_IRQ3_EXT2:
000080A3 19 D3 11 70        		[P_INT_Clear]=r1;
000080A5 A8 90              	     POP R1,R5 FROM [SP];
000080A6 98 9A              	     reti;
                            	
                            	.PUBLIC _IRQ5
                            	_IRQ5:
000080A7 A8 DA              	     PUSH R1,R5 TO [SP]     //现场保护
                            	     
000080A8 41 92              	     R1=0x0001;              //清看门狗
000080A9 19 D3 12 70        	     [P_Watchdog_Clear]=R1;
                            	     
000080AB 44 92              	     R1=0x0004;              //屏蔽4HZ中断
000080AC 11 C3 10 70        	     TEST r1,[P_INT_Ctrl];
000080AE 13 4E              	     JNZ L_IRQ5_2HZ;
                            	     
                            	L_IRQ5_4HZ:    
000080AF 48 92              	     R1=0x0008;               //清中断
000080B0 19 D3 11 70        	     [P_INT_Clear]=R1;
000080B2 11 93 33 00        	     R1=[_Flag];
000080B4 43 42              	     CMP R1,3
000080B5 10 4E              	     JNE Half_Sec;
000080B6 40 94              	     R2=0;
                            	     
000080B7 1A D5 33 00        	     [_Flag]=R2;
000080B9 11 93 29 00        	     R1=[_Sec];
000080BB 41 02              	     R1+=1; 
000080BC 19 D3 29 00        	     [_Sec]=r1
000080BE 40 F0 25 81        	     call _Function
000080C0 A8 90              	     POP R1,R5 FROM [SP];
000080C1 98 9A              	     RETI; 
                            	     
                            	L_IRQ5_2HZ:
000080C2 19 D3 11 70        	     [P_INT_Clear]=r1;
000080C4 A8 90              	     POP R1,R5 FROM [SP];
000080C5 98 9A              	     RETI;
                            	       
                            	Half_Sec:              //不满1秒
000080C6 41 02              	     r1+=1; 
000080C7 19 D3 33 00        	     [_Flag]=R1;
000080C9 40 94              	     r2=0
000080CA 1A D5 30 00        	     [_Funcflag]=r2
000080CC A8 90              	     POP R1,R5 FROM [SP];
000080CD 98 9A              	     RETI; 
                            	
                            	.PUBLIC _Key_scan
00008806                    	.code
                            	_Key_scan:
                            	  
                            	F_Key_Scan_A4: 
00008806 40 98              	    r4=0x0000;  	    
00008807 4E 94              	    R2=0x000e;                        //扫描第一行
00008808 1A D5 00 70        		[P_IOA_Data] = R2 ; 
0000880A 09 93 F0 00        		R1 = 0x00f0;    	   
0000880C 11 B3 00 70        	    R1& =[P_IOA_Data];
0000880E 09 43 F0 00        		CMP R1,0x00f0;                    //是否该行有键按下
00008810 1F 4E              	    JNZ   L_make_sure;  	        
                            	F_Key_Scan_A5:
00008811 4D 94              	    R2=0x000d;                        //扫描第二行
00008812 1A D5 00 70        		[P_IOA_Data] = R2;
00008814 09 93 F0 00        		R1 = 0x00f0;	    	   
00008816 11 B3 00 70        	    R1& =[P_IOA_Data];
00008818 09 43 F0 00        		CMP R1,0x00f0;                   //是否该行有键按下
0000881A 15 4E              	    JNZ   L_make_sure;   
                            	F_Key_Scan_A6:           
0000881B 4B 94              	    R2=0x000b;                       //扫描第三行
0000881C 1A D5 00 70        		[P_IOA_Data] = R2;
0000881E 09 93 F0 00        		R1 = 0x00f0;	    	   
00008820 11 B3 00 70        	    R1& =[P_IOA_Data]; 
00008822 09 43 F0 00        		CMP R1,0x00f0;                   //是否该行有键按下
00008824 0B 4E              	    JNZ   L_make_sure;   
                            	F_Key_Scan_A7:
00008825 47 94              		R2=0x0007;                       //扫描第四行
00008826 1A D5 00 70        		[P_IOA_Data] = R2;
00008828 09 93 F0 00        		R1 = 0x00f0;	    	   
0000882A 11 B3 00 70        	    R1& =[P_IOA_Data];
0000882C 09 43 F0 00        		CMP R1,0x00f0;                  //是否该行有键按下
0000882E 01 4E              	    JnZ  L_make_sure;
0000882F 90 9A              	    RETF
                            	    
                            	L_make_sure:                          // 去抖
00008830 01 97              	     r3=r1;
00008831 1A D5 00 70        	     [P_IOA_Data] = R2;
00008833 09 93 F0 00        	     R1 = 0x00f0;	    	   
00008835 11 B3 00 70        	     R1& =[P_IOA_Data];
00008837 03 43              	     cmp r1,r3;
00008838 73 4E              	     jne F_Key_Scan_A4
00008839 41 08              	    r4+=1;
0000883A 0C 49 FA 00        	     cmp r4,250;
0000883C 4D 4E              	    jne  L_make_sure;
0000883D 40 98              	     r4=0x0000; 
0000883E 02 A3              	     r1=r1|r2 ;
0000883F 19 D3 31 00        	     [_Keycode]=r1
00008841 09 93 F0 00        	     r1=0x00f0
00008843 19 D3 00 70        	     [P_IOA_Data]=r1
00008845 40 92              	     r1=0
00008846 19 D3 35 00        	     [_Keydown]=r1
00008848 90 9A              	     RETF
0 error(s), 0 warning(s).

⌨️ 快捷键说明

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