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

📄 lcd.s43

📁 DESCRIPTION : 0.2S级三相电子式电能表 功能: (1)、LCD显示 (2)、内部通讯:通讯规约采用部颁规约(DL/T645-1997) (3)、红外通讯:通讯规约
💻 S43
📖 第 1 页 / 共 3 页
字号:
	push	R5
	push    R6
        clr.w   R4
        bit.w   #rxdok0,&COMM_FLAG    ;Uart0
        jnz     RCEXIT0
	mov.b	&U0RXBUF,R4
	bit.w	#headok0,&COMM_FLAG
	jnz	RCBYTE00
	cmp.b	#68H,R4               ;判别帧起始符1(68H)
	jnz	RCEXIT0
	bis.w	#headok0,&COMM_FLAG
	mov.w	#1H,&RXDPTR0
	mov.w	#RXDBUF0,R5
	mov.b	R4,0(R5)
	mov.b   R4,&CS0
	jmp	RCEXIT0
RCBYTE00
	mov.w	#RXDBUF0,R5
	add.w	&RXDPTR0,R5
	mov.b	R4,0(R5)
	inc.w	&RXDPTR0
        cmp.w   #08H,&RXDPTR0
        jnz     RCBYTE04
	cmp.b   #68H,R4               ;判别帧起始符8(68H)
	jeq     RCEXIT0CS
RCBYTE00_0                            ;68 xx ... xx 68 A0 A1 A2 A3 A4 A5 68 CTL LEN
        cmp.w   #1,&RXDPTR0
        jeq     RCEXITERR0
	mov.w	#RXDBUF0,R5
	add.w	&RXDPTR0,R5
	mov.b	0(R5),R4
        add.w   R4,&CS0
	mov.w	#RXDBUF0,R5
	mov.b	0(R5),R4
        sub.w   R4,&CS0
	inc.w	R5
	mov.w	#RXDBUF0,R6
	dec.w	&RXDPTR0
        mov.w   &RXDPTR0,R4
RCBYTE00_1
	mov.b	0(R5),0(R6)
	inc.w	R5
	inc.w	R6
	dec.b   R4  
	jnz     RCBYTE00_1
	mov.w	#RXDBUF0,R5
	mov.b	0(R5),R4
	cmp.b   #68H,R4
	jne     RCBYTE00_0
RCBYTE04
        cmp.w   #0AH,&RXDPTR0
        jnz     RCBYTE08
        mov.w   R4,&RXDLEN0
        add.w   #0BH,&RXDLEN0
        cmp.b   #RXDLENMAX,&RXDLEN0
        jhs     RCEXITERR0
	jmp	RCEXIT0CS
RCBYTE08
        jlo     RCEXIT0CS
	cmp.w	&RXDLEN0,&RXDPTR0
        jnz     RCBYTE0C
        cmp.b   R4,&CS0
        jeq     RCEXIT0CS
	jmp	RCEXITERR0
RCBYTE0C
        jlo     RCEXIT0CS
        cmp.B   #16H,R4
        jeq     RCEXIT0OK
	bic.w	#headok0,&COMM_FLAG
RCEXIT0OK
	bis.w	#rxdok0,&COMM_FLAG
RCEXIT0CS
        add.w   R4,&CS0
RCEXIT0
	pop     R6
	pop	R5
	pop	R4
	reti
RCEXITERR0
	bic.w	#headok0,&COMM_FLAG
        pop     R6
	pop	R5
	pop	R4
	reti
;******************************************************************
;   串行发送中断0
;******************************************************************
TRANSMIT0
	push    R4
	bit.W   #txdbegin0,&COMM_FLAG
	jz      NOTSENBEGIN0
	mov.w   &TXDPTR0,R4
	cmp.w   R4,&TXDLEN0
 	jz      SENDOVER0
	add.w   #TXBUF0,R4
	mov.b   0(R4),&U0TXBUF
	inc.w   &TXDPTR0
	pop     R4
	reti
SENDOVER0
	bic.w	#txdbegin0,&COMM_FLAG
NOTSENBEGIN0
	pop	R4           
        reti		
********************************************以下为中断程序********************************************
;-------日历时钟(软件)------------------------------------------
TIMERA_CCR12
	ADD	&TAIV,PC
	reti
        jmp 	TIMMOD1
        jmp 	TIMMOD2
        jmp 	TIMMOD3
        jmp 	TIMMOD4
        jmp 	TIMMOD5
        jmp 	TIMMOD6
        jmp 	TIMMOD7
        jmp 	TIMMOD8
TIMOVH
TIMMOD3
TIMMOD4
TIMMOD5
TIMMOD6
TIMMOD7
TIMMOD8
	reti                    
       
TIMERA_CCR0
            INV.B    &P2OUT
            inv.b       &P1OUT       ;采用TA0翻转作为秒脉冲输出
            inc.b       &Second      ;加0.5秒钟
            cmp.b       #3ch,&Second ;判60秒
            jhs         TA0_Minute   ;>=60秒时,分钟进位
            reti
TA0_Minute
            clr.b       &Second      ;清秒
            inc.b       &Minute      ;加1分钟
            cmp.b       #3ch,&Minute ;判60分
            jhs         TA0_Hour     ;>=60分钟时,小时进位
            reti
TA0_Hour
            clr.b       &Minute     ;清分
            inc.b       &Hour       ;加1小时
            cmp.b       #18h,&Hour  ;判24小时
            jhs         TA0_Day     ;>=24小时,日进位
            reti
TA0_Day
            push        R5
            clr.b       &Hour       ;清小时
            inc.b       &Week       ;加星期
            and.b       #07H,&Week  ;
            jnz         TA0_Week    ;
            inc.b       &Week       ;加星期"0->1"
TA0_Week
            inc.b       &Day        ;加日 
            clr         R5
            mov.b       &Year,R5
            and.b       #03h,R5
            jz          TA0_Day_LEAP;判别闰年
TA0_Day_Nor                         ;闰年
            clr         R5
            mov.b       &Month,R5
            dec.b       R5
            cmp.b       Tab_Day(R5),&Day
            jhs         TA0_Month   ;
            jmp         TA0_Exit
TA0_Day_LEAP                        ;非闰年
            clr         R5
            mov.b       &Month,R5
            dec.b       R5
            cmp.b       Tab_Day1(R5),&Day
            jhs         TA0_Month   ;
            jmp         TA0_Exit
TA0_Month
            mov.b       #1,&Day     ;日期=1
            inc.b       &Month      ;月份加1
            cmp.b       #0Ch,&Month ;判12个月
            jhs         TA0_Year    ;月份>12
            jmp         TA0_Exit
TA0_Year
            mov.b       #1,&Month   ;月份=1
            inc.w       &Year       ;年份加1
TA0_Exit
            pop         R5
            reti
;-----------星期设置-------------------------
;           日期设置时调用
;--------------------------------------------
Adjust_Week
            ;1980--2099
            ;R4   星期
            ;R5   日
            ;R6   月
            ;R7   年
Check_Y     cmp.w       #07bch,&Year  ;1980
            jhs         Check_Y1
            mov.w       #07d0h,&Year  ;2000
Check_Y1    cmp.w       #0834h,&Year  ;2100
            jlo         Check_M
            mov.w       #07d0h,&Year  ;2000
Check_M     cmp.b       #01h,&Month   ;1
            jhs         Check_M1
            mov.b       #01h,&Month   ;1
Check_M1    cmp.b       #0dh,&Month   ;13
            jlo         Check_D
            mov.b       #01h,&Month   ;1
Check_D     cmp.b       #01h,&Day     ;1
            jhs         Check_D1
            mov.b       #01h,&Day     ;1
Check_D1    cmp.b       #020h,&Day    ;32
            jlo         Check_End
            mov.b       #01h,&Day     ;1
Check_End           
            mov.w       &Year,R7
            sub.w       #1980,R7
            mov.w       #1,R6
            mov.w       #1,R5
            mov.b       Tab_Week(R7),R4
Adjust_0
            cmp.b       R6,&Month
            jne         Adjust_2
Adjust_1
            cmp.b       R5,&Day
            jne         Adjust_2
            jmp         Adjust_Exit
Adjust_2
            inc.b       R5              ;加日
            inc.b       R4              ;加星期&Week
            and.b       #07H,R4         ;&Week
            jnz         Adjust_3        ;
            inc.b       R4              ;加星期"0->1"&Week
Adjust_3
            clr         R8
            mov.b       &Year,R8        ;
            and.b       #03h,R8
            jz          Adjust_Day_LEAP ;判别闰年
Adjust_Day_Nor                          ;闰年
            mov.w       R6,R8           ;&Month
            dec.w       R8
            cmp.b       Tab_Day(R8),R5  ;&Day
            jhs         Adjust_Month    ;
            jmp         Adjust_Next
Adjust_Day_LEAP                         ;非闰年
            mov.w       R6,R8           ;&Month
            dec.w       R8
            cmp.b       Tab_Day1(R8),R5 ;&Day
            jhs         Adjust_Month    ;
            jmp         Adjust_Next
Adjust_Month
            mov.b       #1,R5           ;日期=1   &Day
            inc.b       R6              ;月份加1  &Month
Adjust_Next
            jmp         Adjust_0
Adjust_Exit
            mov.b       R4,&Week
            ret
            align     2
Tab_Day     DB        32,29,32,31,32,31,32,32,31,32,31,32
Tab_Day1    DB        32,30,32,31,32,31,32,32,31,32,31,32
Tab_Week    DB        2,4,5,6,7,2,3,4,5,7		;1980-1989
            DB        1,2,3,5,6,7,1,3,4,5		;1990-1999	
            DB        6,1,2,3,4,6,7,1,2,4		;2000-2009	
            DB        5,6,7,2,3,4,5,7,1,2		;2010-2019	
            DB        3,5,6,7,1,3,4,5,6,1		;2020-2029	
            DB        2,3,4,6,7,1,2,4,5,6		;2030-2039	
            DB        7,2,3,4,5,7,1,2,3,5		;2040-2049	
            DB        1,7,1,3,4,5,6,1,2,3		;2050-2059	
            DB        4,1,7,1,2,4,5,6,7,2		;2060-2069	
            DB        3,4,5,7,1,2,3,5,6,7		;2070-2079	
            DB        1,3,4,5,6,1,2,3,4,6		;2080-2089	
            DB        7,1,2,4,5,6,7,2,3,4		;2090-2099
            align     2
TIMMOD1
        reti		
TIMMOD2
        reti		
;------------------------------------------------------------------
;ONLY FOR TEST
;-----------FLASH Write
Test_Busy1            
            bit     #BUSY,&FCTL3
            jnz     Test_Busy1
            mov     #Fresh_W,&FCTL3
            mov     #(Fresh_W+WRT),&FCTL1
            mov     #0EEEEh,&010F0h
Test_Busy12
            bit     #BUSY,&FCTL3
            jnz     Test_Busy12

            mov     #0123h,&01000h
Test_Busy2
            bit     #BUSY,&FCTL3
            jnz     Test_Busy2
            mov     #Fresh_W,&FCTL1
            xor     #(Fresh_X+LOCK),&FCTL3
Test_Busy3
            bit     #BUSY,&FCTL3
            jnz     Test_Busy3
            mov     #Fresh_W,&FCTL3
            mov     #(Fresh_W+WRT+SEGWRT),&FCTL1
            mov     #1234h,&010F0h

Test_Busy4
            bit     #BUSY,&FCTL3
            jnz     Test_Busy4
            mov     #Fresh_W,&FCTL3
            mov     #(Fresh_W+ERASE),&FCTL1
            CLR     &0FA00h
Test_Busy5
            bit     #BUSY,&FCTL3
            jnz     Test_Busy5
            mov     #Fresh_W,&FCTL1
            xor     #(Fresh_X+LOCK),&FCTL3

            RET
;-----------I2C  WRITE/READ
TST1
            MOV.b	I2C_R_Addr,R5	;送出字节地址的低8位
            MOV.b	I2C_R_Addr+1,R5	;送出字节地址的低8位
;            JMP     MAINLOOP1
;             JMP     RDNBYT

WRNBYT
            call    #I2C_Sta
            mov.b   #10100110b,R5
            call    #I2C_WR_BYT
            call    #I2C_Ackn            
            bit.w   #BIT0,&StateFlag
            jnz     WRNBYT
            mov.b   #00H,R5
            call    #I2C_WR_BYT
            
            call    #I2C_Ackn            
            bit.w   #BIT0,&StateFlag
            jnz     WRNBYT
            
            mov.b   #00h,R5
            call    #I2C_WR_BYT
            
            call    #I2C_Ackn
            bit.w   #BIT0,&StateFlag
            jnz     WRNBYT
            CLR     R5
            MOV     #00H,R10
WRNBYT1           
            mov     #088h,R5
            call    #I2C_WR_BYT
            call    #I2C_Ackn           
            bit.w   #BIT0,&StateFlag
            jnz     WRNBYT
            INC     R10
            CMP.W   #40H,R10
            JNE     WRNBYT1
            call    #I2C_Stop

RDNBYT
            call    #I2C_Sta
            
            mov.b   #10100110b,R5
            call    #I2C_WR_BYT
            
            call    #I2C_Ackn            
            bit.w   #BIT0,&StateFlag
            jnz     RDNBYT
            
            mov.b   #00H,R5
            call    #I2C_WR_BYT
            
            call    #I2C_Ackn            
            bit.w   #BIT0,&StateFlag
            jnz     RDNBYT
            
            mov.b   #00H,R5
            call    #I2C_WR_BYT
            
            call    #I2C_Ackn
            bit.w   #BIT0,&StateFlag
            jnz     RDNBYT
            
            call    #I2C_Sta
            
            mov.b   #10100111b,R5
            call    #I2C_WR_BYT
            
            call    #I2C_Ackn           
            bit.w   #BIT0,&StateFlag
            jnz     RDNBYT
            CLR     R10
RDNBYT1           
            call    #I2C_RD_BYT
                     
            call    #I2C_Mack
            ADD     #10H,R10
;            JMP     RDNBYT1
            call    #I2C_RD_BYT
            
            call    #I2C_Mack
            
            call    #I2C_RD_BYT
            
            nop
            call    #I2C_MNack
            
            call    #I2C_Stop

            mov.w   #000h,&I2C_R_Addr
TEST0
;            MOV     #400H,R6
;            MOV.B   #0FFH,0(R6)
;            CALL    #I2C_WR_1byte
;            CALL    #I2C_RD_1byte
;            CMP.B   #0FFH,R5
;            JEQ     TEST1      
;            NOP
TEST1
;            INC     &I2C_R_Addr
;            CMP     #100H,I2C_R_Addr
;            JL      TEST0
             RET
;------------------------------------------------------------------------------------------
            ORG     0FFE0h                                      ; No Used
            DW      MAINLOOP
            ORG     0FFE2h                                      ; No Used(P2口中断向量)
            DW      MAINLOOP


          	ORG     	0FFE4h                                      ; 通讯发送 Uart1 Interrup Vector
          	DW      	TRANSMIT1
          	ORG     	0FFE6h                                      ; 通讯接收 Uart1 Interrup Vector
         	DW      	RECEIVE1

            ORG     0FFE8h                                      ; No Used(P1口中断向量)
            DW      MAINLOOP
            ORG     0FFEEh                                      ; No Used(ADCIFG)
            DW      MAINLOOP



          	ORG     	0FFF0h                                      ; 通讯发送 Uart0 Interrup Vector
          	DW      	TRANSMIT1
          	ORG     	0FFF2h                                      ; 通讯接收 Uart0 Interrup Vector
         	DW      	RECEIVE1

            ORG     0FFF4h                                      ; No Used(WDT)
            DW      MAINLOOP
            ORG     0FFF6h                                      ; No Used(CMPIFG)
            DW      MAINLOOP
            ORG     0FFF8h                                      ; No Used(BCCIFG/TBIFG)
            DW      MAINLOOP


          	ORG     	0FFEAh                                      ; CCR1/CCR2/TAIFG2 Interrup Vector
          	DW      	TIMERA_CCR12
          	ORG     	0FFECh                                      ; CCR0 Interrup Vector
          	DW      	TIMERA_CCR0
                ORG             0FFFEh              ; MSP430 RESET Vector
                DW              START                    
                end

⌨️ 快捷键说明

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