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

📄 ss84b0337a.s

📁 普通三项表程序,基于NEC78F9232芯片的汇编程序
💻 S
📖 第 1 页 / 共 5 页
字号:
			LOCAL_CNT=#3
			CALL !KWH_BCDADJ	
			I2CRdWtCounter=#3			
			DE=#I2CRT_Buffer				;以上流程会恢复DE、I2CRdWtCounter、WordAddress的内容
			CALLT	[TAddr_WtDataWithBkUp]
			
			RET			
					
;-----------------------------------------------------------------------------------------------------						
;CIRCUITERR_OVERTIME:

;			 if_bit(B_VOLTAGEBREAKAVAIL)			
;				CALLT	[TAddr_READTIME_JUD1]
;				AX=BREAKPOINT
;				CALL	!WRITEOVER_TIME
;			endif
			
;			if_bit(B_CURRENTNOTAVAIL)
;			 	CALLT	[TAddr_READTIME_JUD1]
;				AX=CURRENTPOINT
;				CALL	!WRITEOVER_TIME				
;			endif			
					
; 			RET
                               
                        
;--------------------------------------------------------------------
;send byte via SPI  
;--------------------------------------------------------------------
Sendbyte:

			SPIBitInd=#08H 
			
Sendbyte1:		

			;if_bit(LVIF)
			;	B_LowVol=1
			;endif

                  SPICLKIM=1                           
                   ROLC A,1
                       if_bit (CY)
                        	SPISDOIM=1
                        else
                        	SPISDOIM=0
                        endif
                    CALLT	[TAddr_Delay]
                    SPICLKIM=0 
                    CALLT	[TAddr_Delay]
                    DBNZ SPIBitInd,$Sendbyte1
                           
			RET	
			
;--------------------------------------------------------------------
;Receive byte via SPI  
;--------------------------------------------------------------------					
Receivebyte:
                  SPICLKIM=0                   
			SPIBitInd=#08H   
Receivebyte1:			               			
                  	                    
                          SPICLKIM=1
                          CALLT	[TAddr_Delay]
                          CY=0
                              if_bit (SPISDIIM) 
                              CY=1
                              endif
                          ROLC  A,1 
                          SPICLKIM=0  
                          CALLT	[TAddr_Delay]                           
                         DBNZ SPIBitInd,$Receivebyte1 
                          
			RET  
			                    			                  
;--------------------------------------------------------------------
;write SPI subroutine  
;--------------------------------------------------------------------		
WriteSPI:         

			
			
					;Enable SPI
                  SPICSIM=1 
                  CALLT	[TAddr_Delay]
                  SPICLKIM=0
                  CALLT	[TAddr_Delay]
                  SPICSIM=0 
                  
                  		;Send 8-bits Command and 24-bits Data to SPI                  
			A=SPICMD
			CALLT	[TAddr_Sendbyte]
			A=SPIDATAH
			CALLT	[TAddr_Sendbyte]
			A=SPIDATAM
			CALLT	[TAddr_Sendbyte]
			A=SPIDATAL
			CALLT	[TAddr_Sendbyte]						
                    
                  		;Disable SPI
                  SPICSIM=1                    
                    
                  RET
                 
;--------------------------------------------------------------------
;read SPI subroutine  
;--------------------------------------------------------------------
ReadSPI:                                       
                  ;Enable SPI
                  SPICSIM=1
                   CALLT	[TAddr_Delay]
                  SPICLKIM=0 
                 CALLT	[TAddr_Delay]
                  SPICSIM=0  
                  
			A=SPICMD
			CALLT	[TAddr_Sendbyte]
                      
                  ;waiting 
                 CALLT	[TAddr_Delay]
                
                  ;read 24-bits data via SPI                                                 
                  CALL  !Receivebyte
                  SPIDATAH=A  
                  CALL  !Receivebyte
                  SPIDATAM=A 
                  CALL  !Receivebyte
                  SPIDATAL=A                                                   
                                           
                  ;disable SPI
                  SPICSIM=1                         
                      
                  RET
                  
;---------------------------------------------------------------------------------
;存取校表数据子程序                  
;---------------------------------------------------------------------------------                  
		
;WRITE_7022DATA: 	
RdWt_AdjData:				
				
			SPICMD=#0C6H
			SPIDATAH=#00H
			SPIDATAM=#00H
			SPIDATAL=#5AH
			CALL	!WriteSPI
			
 			WORKER_CNT=#5
                  HL=#TAB7022                 
RdWtAdjData_Loop:                                
                  A=[HL]
                  SPI_CNT=A
                  HL++
                  A=[HL]
                  REG_7022=A
                  PUSH	HL
                 	CALL	!RW_AdjDataSegm
                 	POP	HL
                  HL++
                  DBNZ WORKER_CNT,$RdWtAdjData_Loop
                  
                  if_bit(B_AdjDataErr)
                 		B_AdjDataErr=0
                 		Counter_AdjDataErr++
                 	else
                 		Counter_AdjDataErr=#0
                 	endif
                  
			SPICMD=#0C6H
			SPIDATAH=#00H
			SPIDATAM=#00H
			SPIDATAL=#00H
			CALL	!WriteSPI 
			                   
			RET
			
;---------------------------------------------------------------------------------
;分段读写校表数据子程序                  
;---------------------------------------------------------------------------------

RW_AdjDataSegm:     
			if_bit(!LVIF) 
			                            
	                 	WDTE=#0ACH
				A=REG_7022				;校表寄存器地址乘以4,再加上0x0600,得到E2中的相应地址
	                  ROL	A,1
	                  ROL	A,1
	                  A<->X
	                  A=#06H                 
	                  WordAddress=AX
	                  DE=#I2CRT_Buffer
	                  I2CRdWtCounter=#3  
	                  B_OPERATE04=1                
	                  CALLT	[TAddr_RdDataWithBkUp]
	                  B_OPERATE04=0
	                  if_bit(!CY)
	                  	CALLT	[TAddr_RdDataWithBkUp]
	                  endif                  
	                  if_bit(CY)                 	
	                  	if_bit(B_CheckAdjData)
						A=REG_7022
						SPICMD=A
						CALLT	[TAddr_ReadSPI]
						HL=#SPIDATA+2
						DE=#I2CRT_Buffer+2
						LOCAL_CNT=#3
						CALLT	[TAddr_JUDGE_MAX]
						if_bit(!Z)						
							B_AdjDataErr=1
							RET
						endif	                  	                 	
					else
						A=REG_7022
						A|=#80H
			                  SPICMD=A
	                  		SPIDATAH=I2CRT_Buffer(A)
	                  		SPIDATAM=I2CRT_Buffer+1(A)
	                  		SPIDATAL=I2CRT_Buffer+2(A)
			                  CALL !WriteSPI				                 	
	                  	endif                                                  	
	                  endif 
	                  	                  
	           	;else	  
	           	         	
	           	;	B_LowVol=1	
	           		           		
	           	endif  
	           	                                              
                  REG_7022++
                  DBNZ SPI_CNT,$RW_AdjDataSegm    
                               
                  ;Counter_AdjDataErr=#0                                                             
                	                	
                  RET
                  
;--------------------------------------------------------------------------	
;读E2数据子程序
;1、添加校验和
;2、读完后恢复DE和I2CRdWtCounter的值
;--------------------------------------------------------------------------                		
READ_24CX:
				
			I2CDeviceInd=#2
			AX=DE
			I2CPointer=AX
			CALLT	[TAddr_ReadI2C]
			A=I2CRdWtCounterBACK				
			I2CRdWtCounter=A					;恢复DE和I2CRdWtCounter的值
			LOCAL_CNT=A			
			AX=I2CPointer
			DE=AX
			HL=AX
			CALLT	[TAddr_CALC_CHECKSUM]			;该程序应避免修改DE
			A+=#5AH	
			B_CHECKSUMB=0		
			if(A!=[HL])
				B_CHECKSUMB=1
			;else
			;	B_CHECKSUMB=0
			endif	
			
			RET			  
			                                  
;-----------------------------------------------------------------------------------------
;RdDataWithBkUp:	读带备份数据子程序入口
;READ_COPYDAY:	读抄表日子程序入口
;入口参数:
;		DE
;		WordAddress
;		I2CRdWtCounter
;		读完后恢复I2CRdWtCounter、DE的值
;-----------------------------------------------------------------------------------------
READ_COPYDAY:			
			DE=#I2CRT_SubBuffer1
			WordAddress=#COPYDATY(AX)
			I2CRdWtCounter=#2
			
RdDataWithBkUp:   
			;WDTE=#0ACH

			AX=DE
			I2CPointer1=AX
			
			CALLT	[TAddr_READ_24CX]	
			
			if_bit(B_RdWrFail)			
				CY=0						
				RET 			
			endif			
									
			DE=#Universal_Buffer						
			WordAddressH++					;读备份数据							
			CALLT	[TAddr_READ_24CX]
			WordAddressH--	
					
			B=#0A6H
			CALL	!AddOffSet					;数据减5AH	
			
												
			AX=I2CPointer1					
			HL=AX							
			C=I2CRdWtCounterBACK(A)
Cmp_DataBkUpLoop:								;DE初值为#Universal_Buffer		
			A=[DE]
			if(A!=[HL])
				BR	$Cmp_DataBkUpEnd	
			endif
			DE++
			HL++
			DBNZ	C,$Cmp_DataBkUpLoop
Cmp_DataBkUpEnd:	
								
			AX=I2CPointer1
			DE=AX	
					
			if_bit(Z)
				CY=1
				RET				
			else				
				CALLT	[TAddr_READ_24CX]
				if(!B_CHECKSUMB)
					if_bit(!B_OPERATE04)
						CALL	!WriteBkUp
					endif
					CY=1
					RET
				endif
				WordAddressH++				;读备份数据							
				CALLT	[TAddr_READ_24CX]
				WordAddressH--	
				B=#0A6H
				CALL	!AddOffSet				;数据减5AH							
				if(!B_CHECKSUMB)	
					if_bit(!B_OPERATE04)							
						CALLT	[TAddr_WRITE_24CX]	
					endif				
					CY=1
					RET
				endif	
				CALLT	[TAddr_READ_24CX]															
			endif	
					
			CY=0						
			RET   
			
;---------------------------------------------------------------------------
;数据加偏移量子程序
;	
;处理完后恢复DE的值		          
;---------------------------------------------------------------------------
AddOffSet:
			LOCAL_CNT=I2CRdWtCounterBACK(A)
			AX=DE
			HL=AX			
AddOffSet_Loop:
			A=[DE]
			A+=B
			[DE]=A
			DE++
			DBNZ	LOCAL_CNT,$AddOffSet_Loop				
			AX=HL
     			DE=AX
        		RET			
									
;------------------------------------------------------------------						
;向E2写入数据子程序
;1、添加校验和
;2、写完后恢复DE和I2CRdWtCounter的值
;------------------------------------------------------------------
WRITE_24CX:			
			I2CDeviceInd=#2
			AX=DE
			I2CPointer=AX
			HL=AX
			A=I2CRdWtCounter
			LOCAL_CNT=A
			CALLT	[TAddr_CALC_CHECKSUM]
			A+=#5AH
			[HL]=A
			I2CRdWtCounter++			
			CALLT	[TAddr_WriteI2C]
			
			A=I2CRdWtCounterBACK				;恢复DE、I2CRdWtCounter的值
			A--
			I2CRdWtCounter=A
			I2CRdWtCounterBACK=A
			AX=I2CPointer
			DE=AX			
			
			RET	
		
;------------------------------------------------------------------
;WtDataWithBkUp:写数据及其备份入口
;WriteBkUp:写备份入口
;入口参数:
;		DE
;		WordAddress
;		I2CRdWtCounter
;		写完后恢复I2CRdWtCounter、DE、I2CRdWtCounter的值
;-----------------------------------------------------------------
WtDataWithBkUp:				
			CALLT	[TAddr_WRITE_24CX]
			
WriteBkUp:			
			B=#5AH
			CALL	!AddOffSet					;数据加5AH
			WordAddressH++					;写备份数据		
			CALLT	[TAddr_WRITE_24CX]
			WordAddressH--
			B=#0A6H
			CALL	!AddOffSet					;数据减5AH					
			RET	                  
;---------------------------------------------------------------------------------                  
; 			
;WRITE_7022DATA: 			
; 			WORKER_CNT=#4
;                  HL=#TAB7022
;WRITE_7022LOOP:                  
                 
;                  A=[HL]
;                 SPI_CNT=A
;                  HL++
;                  A=[HL]
;                  REG_7022=A
;                 PUSH HL
;                 	CALL	!WRITE_7022REG
;                 	POP HL
;                  HL++
;                  DBNZ WORKER_CNT,$WRITE_7022LOOP
;			RET
;-------------------------------------------------------------------------------------

;WRITE_7022REG:                  
                  
;                 AX=#0
;                  A=REG_7022
;                  A<->X
;                  BC=#4
;                  CALLT	[TAddr_Multiply]
                  
;                  HL=AX
;			AX=#0600H
;			A<->X
;			ADD A,L
;			A<->X
;			ADDC A,H
;                  SET1 B_OPERATE04
;                 	CALL !READ_7022PARA
;                  if_bit(B_CHECKSUMB)
;                  	AX=WordAddress
;                  	AX+=#100H
;                  	CALL !READ_7022PARA
;                  	if_bit(B_CHECKSUMB)
;                  		CLR1 B_OPERATE04
;                  		AX=WordAddress
;                  		CALL !READ_7022PARA
;                  		if_bit(B_CHECKSUMB)
;                  			AX=WordAddress
;                  			AX-=#100H
;                  			CALL !READ_7022PARA                 		
;                  			if_bit(B_CHECKSUMB)
;                  				BR $WRITE_7022REGEND1
;                  			endif
;                  		endif
;                  	endif
;                  endif	
;                  
;                  A=#80H
;                  OR A,REG_7022
;                  SPICMD=A
;                  CALL !WriteSPI
;WRITE_7022REGEND1:                  
;                	 REG_7022++
;                  DBNZ SPI_CNT,$WRITE_7022REG
;WRITE_7022REGEND:                  
;                 	CLR1 B_OPERATE04
;                 RET                
;---------------------------------------------------------------------------------------------						
;READ_POWERPARA:
;			WordAddress=#EPOWERPARA(AX)
;			I2CRdWtCounter=#12
;			DE=#I2CRT_Buffer+6					;I2CRT_SubBuffer0
;			CALLT	[TAddr_RdDataWithBkUp]				;初始化流程里读有备份数据,读备份时要占用Universal_Buffer以外的空间
;			BF B_CHECKSUMB,$READPARA_SUCCEED
;			LOCAL_CNT=#12
;			HL=#I2CRT_Buffer+6
;			CALLT	[TAddr_TEMP_BUFCLR]
;READPARA_SUCCEED:		
;			HL=#I2CRT_Buffer+10
;			DE=#KWHPOINT
;			LOCAL_CNT=#6
;			CALLT	[TAddr_TRAN_DATA]
;			AX=KWHPOINT
;			A=#8
;			KWHPOINT=AX
;			AX=BREAKPOINT
;			A=#9
;			BREAKPOINT=AX
;			AX=CURRENTPOINT
;			A=#10
;			CURRENTPOINT=AX
;			PULSE_CNT=I2CRT_Buffer+16(A)
;			A=I2CRT_Buffer+17
;			AND A,#0FH
;			if(A==#0)
;				CLR1 B_KWHCHAN
;			else
;				SET1 B_KWHCHAN
;			endif
;			A=TEMP_BUF0H
;			AND A,#0F0H
;			if(A==#0)
;				CLR1 B_CLRKWHFLAG
;			else
;				SET1 B_CLRKWHFLAG
;			endif
;				
;			
;			RET
;
;----------------------------------------------------------------------------------------------------------------
;AddrAndFlag --

⌨️ 快捷键说明

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