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

📄 system.lst

📁 关于凌阳单片机的应用--语音播报电子钟。功能为实时当前的时间。
💻 LST
📖 第 1 页 / 共 2 页
字号:
                     <      	//========================================================================================        
                     <      	// End of hardware.inc
                     <      	//========================================================================================
                            	.EXTERNAL  _SecondAddOne
                            	.PUBLIC		Year; 
                            	.PUBLIC		MonDayHr; 
                            	.PUBLIC		MinSec; 
                            	.PUBLIC		Per500msSet; 
                            	//*********************RAM空间占用*************************//
0000032D                    	.RAM
0000032D 00 00              	.VAR		Year          //年 b15--if leap year
0000032E 00 00              	.VAR		MonDayHr      //月日时  b13--b10(month) b9--b5(day)  b4--b0(hour) 
0000032F 00 00              	.VAR		MinSec        //分秒    b12--b7(minute) b6--b1(second) b0--500ms
00000330 00 00              	.VAR		Per500msSet   //500ms 标志
                            	
00009272                    	.CODE
                            	//*********************************************************//
                            	//函数:System_Initial()
                            	//描述:键盘扫描初始化
                            	//参数:无
                            	//返回:无
                            	//*********************************************************//
                            	.PUBLIC _System_Initial;
                            	_System_Initial: .PROC
                            	//******************系统时钟、中断*************************//
                            	
00009272 40 92              	     r1=0
00009273 19 D3 13 70        	     [P_SystemClock]=r1
                            	
00009275 40 92              	     r1=0
00009276 19 D3 F7 02        	     [R_InterruptStatus] = r1
00009278 19 D3 10 70        	     [P_INT_Ctrl]=r1
0000927A 48 F1              	     IRQ OFF
0000927B 4C F1              	     FIQ OFF
                            	
                            	//*********************I/O口*******************************//
0000927C 09 93 00 FF        		r1=0xff00
0000927E 19 D3 03 70        		[P_IOA_Attrib] = r1						//A7--A0  输入
00009280 19 D3 02 70        		[P_IOA_Dir] = r1						//A15--A8 输出
00009282 40 92              		r1 = 0x0000				
00009283 19 D3 00 70        		[P_IOA_Data] = r1
                            	     
                            	//*********************万年历******************************//
00009285 09 93 D1 07        	     r1=2001
00009287 19 D3 2D 03        	     [Year]=r1     							//2001年  b15--not leap year
00009289 09 93 20 04        	     r1=0x0420
0000928B 19 D3 2E 03        	     [MonDayHr]=r1  						//1月1日1时 
                            	                    						// b13--b10(month) b9--b5(day)  b4--b0(hour)
0000928D 40 92              	     r1=0x0000      
0000928E 19 D3 2F 03        	     [MinSec]=r1      						//0分0秒    
                            	                   							//b12--b7(minute) b6--b1(second) b0--500ms
00009290 19 D3 30 03        	     [Per500msSet]=r1   
                            	  
                            	//*******************中断**********************************//
00009292 09 93 84 00        	     r1 = C_IRQ5_2Hz+ C_IRQ3_KEY     		//2Hz+KeyUp
00009294 11 A3 F7 02        	     r1|=[R_InterruptStatus] 
00009296 19 D3 F7 02        		 [R_InterruptStatus] = r1
00009298 19 D3 10 70        	     [P_INT_Ctrl]=r1
0000929A 49 F1              	     IRQ ON 
                            	     
0000929B 90 9A              	     retf;
                            		.ENDP;
                            	//*********************************************************//
                            	//函数:Clear_WatchDog()
                            	//描述:看门狗清0
                            	//参数:无
                            	//返回:无
                            	//*********************************************************//
                            	.PUBLIC _Clear_WatchDog;
                            	_Clear_WatchDog: 	.PROC
0000929C 41 92              			r1=0x0001;                      	// Clear watch dog
0000929D 19 D3 12 70        			[P_Watchdog_Clear]=r1;       		//
0000929F 90 9A              			retf;
                            			.ENDP
                            	//*********************************************************//
                            	//函数:LightOn()
                            	//描述:点亮放光二极管
                            	//参数:无
                            	//返回:无
                            	//*********************************************************//
                            	.PUBLIC	_LightOn;
                            	_LightOn:	.PROC         					//点亮IOA15 LED 	
000092A0 09 93 00 80        				r1= 0x8000;
000092A2 11 A3 01 70        				r1 |= [P_IOA_Buffer];
000092A4 19 D3 01 70        				[P_IOA_Buffer] = r1;
000092A6 90 9A              				retf;
                            				.ENDP
                            	
                            	.PUBLIC	_LightOff;      					//熄灭 IOA15 LED
                            	_LightOff:	.PROC
000092A7 09 93 FF 7F        				r1= 0x7FFF;
000092A9 11 B3 01 70        				r1&= [P_IOA_Buffer];
000092AB 19 D3 01 70        				[P_IOA_Buffer] = r1;
000092AD 90 9A              				retf;
                            				.ENDP
                            	//*********************************************************//
                            	//函数:Calendar_Counter()
                            	//描述:万年历调整
                            	//参数:500ms标志  [Per500msSet]----0xFFFF,500ms到
                            	//返回:无
                            	//*********************************************************//
                            	
                            	.PUBLIC _Calendar_Counter
                            	 _Calendar_Counter: .PROC
000092AE 11 93 30 03        	        r1 = [Per500msSet];   				//500ms标志
000092B0 01 4E              	        JNZ  Update_Time;
000092B1 90 9A              	        RETF;
                            	 Update_Time:
000092B2 40 92              	        r1 = 0;
000092B3 19 D3 30 03        	        [Per500msSet] = r1;
                            	               
                            	//**************minute & second
000092B5 11 93 2F 03        	        r1 = [MinSec];
000092B7 41 02              	        r1 += 1;            				//秒+1
000092B8 09 B5 7E 00        	        r2 = r1 AND 0x007E;  				//是否到60秒? 
000092BA 0A 45 78 00        	        CMP     r2,60*2;
000092BC 37 0E              	        JB      _2HzRtc_90;
000092BD 09 B3 80 1F        	        r1 &= 0x1F80;               
000092BF 09 03 80 00        	        r1 += 0x0080;               
                            	        
000092C1 0C 99 FF FF        	        r4=0xFFFF            				//分+1,置调整标志
000092C3 1C D9 44 03        	        [_SecondAddOne]=r4
                            	        
000092C5 09 43 00 1E        	        CMP     r1,60*128;  				//是否到60分
000092C7 2C 0E              	        JB      _2HzRtc_90; 
                            	        
000092C8 43 02              	        r1+=0x0003;      					//手工校正 
                            	        
                            	//**************month, day, hour
000092C9 12 95 2E 03        	        r2 = [MonDayHr];
000092CB 41 04              	        r2 += 1;                    		//时+1
000092CC 0A B7 1F 00        	        r3 = r2 AND 0x001F;         
000092CE 58 46              	        CMP  r3,24;         				//是否到24小时
000092CF 21 0E              	        JB      _2HzRtc_80;
000092D0 0A B5 E0 3F        	        r2& = 0x3FE0;         				//小时清0
000092D2 7A 97              	        r3 = r2 LSR 4;
000092D3 63 97              	        r3 = r3 LSR 1;
000092D4 5F B6              	        r3 &= 0x001F;
                            	        
000092D5 40 F0 04 93        	        CALL    F_GetDaysOfTheMonth;  		//读本月天数
                            	       
000092D7 01 47              	        CMP  r3,r1;         
000092D8 17 0E              	        JB   _2HzRtc_75;
000092D9 0A B5 00 3C        	        r2 &= 0x3C00;
000092DB 0A 05 00 04        	        r2 += 0x0400;             			//月+1
000092DD 0A 45 00 34        	        CMP  r2,13*1024;       				//月超过12?
000092DF 10 0E              	        JB   _2HzRtc_75;
000092E0 0A 95 00 04        	        r2 = 0x0400;                		//月置1
                            	//**************year
000092E2 13 97 2D 03        	        r3 = [Year];
000092E4 41 06              	        r3 += 1;                 			//年+1
000092E5 0B B7 FF 7F        	        r3&=0x7FFF
000092E7 0B 47 1B 0C        	        CMP     r3,3099;       				//3099年
000092E9 02 8E              	        JBE     _2HzRtc_70;
000092EA 0B 97 D1 07        	        r3 = 2001;             				//2001年
                            	_2HzRtc_70:
000092EC 40 F0 18 93        	        CALL F_CalcLeapYear_or_NonLeapYear  //计算平闰年,r3---返回值
                            	                                            //闰年(b15=1) 平年(b15=0)
000092EE 1B D7 2D 03        	        [Year] = r3;
                            	
                            	_2HzRtc_75:
000092F0 60 04              	        r2 += 0x0020;               		//天+1
                            	_2HzRtc_80:
000092F1 1A D5 2E 03        	        [MonDayHr] = r2;
                            	_2HzRtc_85:
000092F3 40 92              	        r1 = 0x0000;          				//r1 = 0x0000;
                            	_2HzRtc_90:
000092F4 19 D3 2F 03        	        [MinSec] = r1;
                            	        
000092F6 90 9A              	        RETF;
                            	//**************Table
                            	TB_DaysOfMonth:     						//高字节---闰年天数, 低字节---- 平年天数
000092F7 1F 1F              	        .DW     31*256+31;
000092F8 1F 1F              	        .DW     31*256+31;          		//1 month
000092F9 1C 1D              	        .DW     29*256+28;          		//2 month
000092FA 1F 1F              	        .DW     31*256+31;          		//3 month
000092FB 1E 1E              	        .DW     30*256+30;          		//4 month
000092FC 1F 1F              	        .DW     31*256+31;          		//5 month
000092FD 1E 1E              	        .DW     30*256+30;          		//6 month
000092FE 1F 1F              	        .DW     31*256+31;          		//7 month
000092FF 1F 1F              	        .DW     31*256+31;          		//8 month
00009300 1E 1E              	        .DW     30*256+30;          		//9 month
00009301 1F 1F              	        .DW     31*256+31;          		//10 month
00009302 1E 1E              	        .DW     30*256+30;          		//11 month
00009303 1F 1F              	        .DW     31*256+31;          		//12 month
                            	        
                            	//*********************************************************//
                            	//函数:F_GetDaysOfTheMonth
                            	//描述:计算本月天数
                            	//参数:无
                            	//返回:r1--天数
                            	//*********************************************************// 
                            	F_GetDaysOfTheMonth:
00009304 11 93 2E 03        	        r1 = [MonDayHr];
00009306 79 93              	        r1 = r1 LSR 4;
00009307 79 93              	        r1 = r1 LSR 4;
00009308 69 93              	        r1 = r1 LSR 2;
                            	
00009309 4F B2              	        r1 &= 0x000F;
0000930A 09 0B F7 92        	        bp = r1 + TB_DaysOfMonth;
0000930C C5 92              	        r1 = [bp];
                            	
0000930D 0C 99 00 80        	        r4 = 0x8000 
0000930F 14 C9 2D 03        	        TEST r4,[Year];        				//平闰年?
00009311 03 4E              	        JNZ   GetDaysOfTheMonth_LeapYear;
                            	        
                            	GetDaysOfTheMonth_NonLeapYear:  			//平年
00009312 09 B3 FF 00        	        r1 &= 0x00FF;
00009314 90 9A              	        RETF;
                            	        
                            	GetDaysOfTheMonth_LeapYear:     			//闰年           
00009315 79 93              	        r1 = r1 LSR 4;
00009316 79 93              	        r1 = r1 LSR 4;
00009317 90 9A              	        RETF;        
                            	//**************平闰年计算*********************************//
                            	//描述:闰年条件:
                            	//		1、能被400整除
                            	//		2、能被4整除,但不能被100整除
                            	//*********************************************************//         
                            	F_CalcLeapYear_or_NonLeapYear:
00009318 03 99              	        r4=r3;
00009319 40 48              	        CMP     r4,0;
0000931A 06 5E              	        JZ      GetDaysOfTheMonth_20;
                            	GetDaysOfTheMonth_10:
0000931B 0C 49 90 01        	        CMP     r4,400;            			//判断是否能被400整除
0000931D 06 0E              	        JB      GetDaysOfTheMonth_30;     	//不能被400整除
0000931E 0C 29 90 01        	        r4 -= 400;
00009320 46 4E              	        JNZ     GetDaysOfTheMonth_10;
                            	GetDaysOfTheMonth_20:       				//闰年--能被400整除 或 能被4整除但不能被100整除

⌨️ 快捷键说明

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