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

📄 ss84b0337a.s

📁 普通三项表程序,基于NEC78F9232芯片的汇编程序
💻 S
📖 第 1 页 / 共 5 页
字号:
			B_DATASAVE=1				;如果没掉电,写一次时间
						
			
;----------------------写入校表数据------------------------------------------------------------------	
			CALLT	[TAddr_Delay1]
			CALLT	[TAddr_Delay1]
																			
			B_CheckAdjData=0
			CALL	!RdWt_AdjData								
			SPIDATAH=#0
			SPIDATAM=#0
			SPIDATAL=#1
			SPICMD=#0AAH
                  CALL !WriteSPI							
;----------------------计算断相阀值------------------------------------------------------------------			
			AX=#BREAKVALUE								
			WordAddress=AX
			I2CRdWtCounter=#3
			DE=#I2CRT_Buffer
			CALLT	[TAddr_RdDataWithBkUp]			
			
			
			if_bit(!B_CHECKSUMB)
				A=TEMP_BUF00
				CALLT	[TAddr_BCD_HEX_SUB]
				CALL	!CALC_BREAKXUVALUE
				
				A=TEMP_BUF02
				CALLT	[TAddr_BCD_HEX_SUB]
				X=A
				A=#0
				BC=#100
				CALLT	[TAddr_Multiply]
				CURRENTVALUE=AX
				A=TEMP_BUF01
				CALLT	[TAddr_BCD_HEX_SUB]
				ADD A,CURRENTVALUE_L
				CURRENTVALUE_L=A
				ADDC CURRENTVALUE_H,#0
				AX=CURRENTVALUE
				CALL	!CALC_CURRENTVALUE
				
							
			else
				A=#70
				CALL	!CALC_BREAKXUVALUE
				AX=#50
				CALL	!CALC_CURRENTVALUE	
			endif
			
				
							
;---------------------读出时钟调整允许范围-----------------------------------------------------------											
			WordAddress=#TimeAdj_Range(AX)	
			DE=#I2CRT_Buffer
			I2CRdWtCounter=#2
			CALLT	[TAddr_RdDataWithBkUp]
			A=I2CRT_Buffer
			A<->X
			A=I2CRT_Buffer+1
			if_bit(!CY)
				AX=#0			
			endif	
			SecondAcc=AX

;---------------------读时间和参数--------------------------------------------------------------------																							
			CALLT	[TAddr_READ_TIMEBUF]		;读当前时间,放I2CRT_Buffer
			if_bit(CY)
				SET1 B_TIMEERR
			endif								
			CALL !READ_POWERPARA			;读掉电保存参数,掉电时间放I2CRT_SubBuffer0
										
;---------------------处理转存------------------------------------------------------------------------					
			if_bit(B_TIMEERR)
				CLR1 B_TIMEERR
				BR $RdKWHAndSetReg
			endif
			if(I2CRT_SubBuffer01==#0)
				BR $RdKWHAndSetReg
			endif								
			CALL !READ_COPYDAY			;读抄表日I2CRT_SubBuffer1												
			if(I2CRT_SubBuffer1+1==#0)
				BR $RdKWHAndSetReg
			endif					
			CALL !POWERHOUR_ADD			;上电转存																								
			WHILE(WORKER_CNT!=#0)
				CALL !KWH_CHAN
				WORKER_CNT--
			ENDW											
			if_bit(B_ClrSvPwFlagEn)			;当前时间不是抄表日
				B_KWHCHAN=0
			endif
			
			DE=#I2CRT_Buffer
			WordAddress=#COMMRATE(AX)	
			I2CRdWtCounter=#1									
			CALLT	[TAddr_RdDataWithBkUp]
			A=I2CRT_Buffer
			CALL	!BaudRateSet
			
;			SRMK6=1 
;			ASIM6=#01H			
;			BRGC6=#13					;1200 baud rate
;			ASIM6=#9DH					;power on,even parity,8 bits lenth ,1 stop bit
;			RXE6=1
;			SRMK6=0 
			     		
;---------------------计算校时范围-----------------------------------------------	
			if_bit(!LVIF)		
				AX=TIMEERR_CNT
				if(AX!=#0)
					BC=#5
					CALLT	[TAddr_Multiply]			
					AX<->BC			
					CALL	!ModifyTmAdj_Range	
				endif	
			endif

																														
RdKWHAndSetReg:																										
			CALL	!Fill_KWHBuf
			CALL	!SetUp_SFRFlag
					
;==========================================================================================	

			
MAIN_LOOP:
			if_bit(B_TM80INT&&B_MAINLOOP)
				WDTE=#0ACH
				CLR1 B_MAINLOOP				
				CLR1 B_TM80INT
			endif			
			B_AtMainLoop=1
			
							
POWERLOW_STOP:			
			
			IF_BIT(LVIF&&!B_UPFLAG)
				
				;CALL !INI_CLOCK
				
				LCDDispCounter=#0
				B_LCDCLOSE=0
				B_PowerDown=1
				CALL !LCD_DISPLAY	
					
				if_bit(!B_POWERSAVE)				;7022复位脚为低
				
					B_POWERSAVE=1
					
					;CALL	!POWERLSAVE	
														
					;CALLT	[TAddr_READ_TIMEBUF]
					;if_bit(CY)
					;	HL=#I2CRT_Buffer
					;	LOCAL_CNT=#4
					;	CALLT	[TAddr_TEMP_BUFCLR]
					;endif
					
					I2CRT_Buffer=PULSE_CNT(A)
					I2CRT_Buffer+1=KWH_BUF0(A)
					DE=#I2CRT_Buffer				
					WordAddress=#EPOWERPARA(AX)
					I2CRdWtCounter=#2	    	  			
		  			CALLT	[TAddr_WtDataWithBkUp]	
		  								
				endif
				
;				WordAddress=#POWERLOWDAY(AX)
;				DE=#SPIDATAM
;				I2CRdWtCounter=#1
;				CALLT	[TAddr_RdDataWithBkUp]
				
IRACTIVE_STOP:			
				
				;PM0=#11110111B
				;PM3=#11110011B
				;RESETM=0
				;SIGM=0
				;SPISDIIM=0
				
				;CALL !POWER_SET
				PMC2=#00000000B
				PM0=#11110111B
				PM3=#11110011B
				RESETM=0
				SIGM=0
				;P3&=#11110011B
				SPISDIIM=0 
			
				PM4=#11111100B
				KWHPulse=0	
				
				
				DI
				PIF2=0
				MK0=#11111111B
				MK1=#11111111B				
				;INTM0=#00000000B
				;PIF0=0
				;PMK2=0
				LCDCOM=#58H
				CALLT	[TAddr_LCDINI] 
				LCDCOM=#70H
				CALLT	[TAddr_LCDINI]
				
				 
        			;PM0=#0FFH
				PM2=#0FFH
        			;PM3=#11110111B
        			;PM4=#11111101B
        									;关红外
        			PM12=#11111110B 
        			
        			;P0=#0
				;P2=#0
				;P3=#0
				;P4=#0
				
				if_bit(!B_IRSTART)
					P12=#00000001B
				else
					P12=#00000000B	
				endif
				LCDCTRL=0 
        			A=#0       		
        			PU3=A
				PU4=A
				TMC00=A					
				CLR1	TCE80			;close th0	
				TMC80=#02H
				;CR80=#2		
				CLR1 	TMHE1			;close th1
				CLR1 	ADCE						
				CLR1 	ADCS			;close ad		
				ASIM6=#01H	
        							
				if_bit(LVIF)
					LVIM=#0
					LSRCM=#1
					
					PCC=#02			;divide clock to Fx/16 ,last low
					PPCC=#02
					EI												
					CALLT	[TAddr_Delay]
					
					if_bit(!B_CHUCHANG)
						CALL !JUDGECHUCHANG_STATE								
						if_bit(CY)
							B_CHUCHANG=1
						endif	
					endif
					
					B_SPIDATAFLAG=0
					
					;BR !STOPCON
					
STOPCON:					
					IRPOWER=1							
					PMK2=0
					PMK0=0																		
STOPCON1:				
					WDTE=#0ACH
					NOP
					STOP				
					NOP												
IRCHECK_LOOP:		
					WDTE=#0ACH
					if_bit(B_SEVENTY)	
						HALT
						NOP
						BR $IRCHECK_LOOP					
					endif
					if_bit(B_UPFLAG)
						DI
						PMK0=1
						PMK2=1
						BR !WAKEUP_START				
					endif
					BR $STOPCON1
															
				else
				
					BR !START
					
				endif
				
			ENDIF	
								
			if_bit(B_DATASAVE)
				B_DATASAVE=0
				
				CALLT	[TAddr_READ_TIMEBUF]
				if_bit(CY)
					HL=#I2CRT_Buffer
					LOCAL_CNT=#4
					CALLT	[TAddr_TEMP_BUFCLR]
				endif				
												
				HL=#KWHPOINT
				DE=#I2CRT_Buffer+4			
				LOCAL_CNT=#6
				CALLT	[TAddr_TRAN_DATA]	
				
				
				
				A=CLRKWHFLAG_BYTE
				AND A,#0FH
				I2CRT_Buffer+10=A						
				if_bit(B_KWHCHAN)
					(I2CRT_Buffer+10)+=#10H								
				endif	
							
				
				DE=#I2CRT_Buffer				
				WordAddress=#AddrAndFlag(AX)
				I2CRdWtCounter=#11    	  			
	  			CALLT	[TAddr_WtDataWithBkUp]
			endif
			
			if_bit(B_SJCLR)

				CALL	!TEMP_BUFCLR16
				B=#11
				A=WRITE_CYCLE
				if(A<#5)																					
					SWITCH(A)
					case 0:
						AX=#RVPKWHTIME
						B=#3						
						BREAK
					case 1:						
						AX=#RVPKWHTIME_BkUp
						B=#3
						BREAK						
					case 2:						
						AX=#NEARRVPKWH1
						B=#15
						BREAK											
					case 3:
						AX=#BREAKXULANG
						;B=#11
						BREAK
					DEFAULT:						
						AX=#CURRENTNOT
						;B=#11						
					ENDS					
					WordAddress=AX					
					CALL !SJCLR_LOOP
					WRITE_CYCLE++
				else
					WRITE_CYCLE=#0
					B_SJCLR=0
				endif	
				
			endif
			
			if_bit(B_RdWrFail)
				B_HardwareSta=1
				B_MemoryError=1
			else
				B_HardwareSta=0
				B_MemoryError=0
			endif
				
			if(COMTIME_COUNT==#20)
				COMTIME_COUNT++								
				CALL !SetUp_SFRFlag				
			endif
			
			if_bit(!LVIF)
				CALL !KWH_SAVE
			endif
			
			if_bit(!LVIF)
				CALL !TreatWithFrame
				CALL !COMMANDDEAL
			endif
			
			if_bit(B_TimeOutFlag_15ms)
				B_TimeOutFlag_15ms=0
				
				if_bit(B_FrameSend)
					SENDDELAY_45MS++
					if(SENDDELAY_45MS>=#3)
						B_FrameSend=0
						B_FrameSendEnable=1
					endif
				endif
				
				;CALL !SendFrame
					
				CALL !DealWithKey

			endif
				
			IF_BIT(B_TimeOutFlag_100ms)
				B_TimeOutFlag_100ms=0
				
				TIMER_PULSECNT++
				if(TIMER_PULSECNT>=#50)
					B_FLASHLCD_Curr=0
					if(TIME10S_PULSE>=#PULSENUM)						
						B_FLASHLCD_Curr=1											
					endif
					TIME10S_PULSE=#0
					TIMER_PULSECNT=#0					
				endif
				
				;CALL !COMDEY_TIME
				
				T1SEC_COUNT++
				IF(T1SEC_COUNT>=#10)
					T1SEC_COUNT=#0
					if_bit(B_UPFLAG)
						COUN60S_CNT++
						if(COUN60S_CNT>=#20)
							COUN60S_CNT=#0
							B_UPFLAG=0
						endif
						
					endif
					
					CALL !LCD_DISPLAY
					
					IF_BIT(!LVIF)
										
						A=MINUTE_CNTL
						
						SWITCH(A)
						
							case 1:	
																																																										
								
								CALL !COPYDAY_COP
								
								;CALL !CIRCUITERR_OVERTIME
													
								
								
								if_bit(B_RVPKWH_LCD)
									WordAddress=#RVPKWHTIME(AX)
									CALL !RVPTIME_ADD
								endif	
									
								BREAK	
															
							case 15:
																												
								;if_bit(!LVIF)
									B_CheckAdjData=1
									CALL	!RdWt_AdjData												
									if(Counter_AdjDataErr>=#2)
										RESETM=0	
										CALLT	[TAddr_Delay1]
										RESETM=1
										CALLT	[TAddr_Delay1]
										CALLT	[TAddr_Delay1]								
										B_CheckAdjData=0
										CALL	!RdWt_AdjData
									endif
									SPIDATAH=#0
									SPIDATAM=#0
									SPIDATAL=#1
									SPICMD=#0AAH
						                  CALL !WriteSPI	
								;endif																																
								BREAK	
															
							case 30:
																						
								CALLT	[TAddr_READ_TIMEBUF]			
								A=Second_Temp
								MINUTE_CNTL=A								
								BREAK	
															
							case 50:
							
								CALL	!Fill_KWHBuf
														
								Timer_PrgKeyCtl++	
								if(Timer_PrgKeyCtl>=#10)
									B_PrgEnable=0
								endif
								
								CALL !SetUpRegister
								if(COMTIME_COUNT>=#21)									
									CALL !SetUp_SFRFlag
									DE=#I2CRT_Buffer
									WordAddress=#COMMRATE(AX)	
									I2CRdWtCounter=#1									
									CALLT	[TAddr_RdDataWithBkUp]
									A=I2CRT_Buffer
									CALL	!BaudRateSet									
								endif
								
								;LCDCOM=#48H
								;CALLT	[TAddr_LCDINI]
																
								B_PowerDown=0
																	
								;BREAK
								
						ENDS
						
					ENDIF	
					
					
					
					if_bit(!LVIF)
						CALL !CHECK_7022
						CALL !SECOND_CNT
					endif
					
					
					;CALL !JUDGE_LCDCLOSE
					TEMER_COMMUSYM++								;通讯符号计数
					if(TEMER_COMMUSYM>=#2)
						Disp_Sym_K4=0
						;set1 B_LCDREF
					endif

⌨️ 快捷键说明

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