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

📄 d413_tmp_sensor_master.s43

📁 MSP430X16X子程序
💻 S43
📖 第 1 页 / 共 3 页
字号:
                                             ;
Main_2_End  jmp     Mainloop_2               ;
                                             ;
;------------------------------------------------------------------------------ 
Disp_430_dAY   ; Flash "430 dAY" until 1st button press
            mov.b   #03Eh,&LCDM1             ; 
            mov.b   #0BBh,&LCDM2             ; 
            mov.b   #09Eh,&LCDM3             ; 
            mov.b   #000h,&LCDM4             ; 
            mov.b   #0B7h,&LCDM5             ; 
            mov.b   #01Fh,&LCDM6             ; 
            mov.b   #03Ah,&LCDM7             ; 
            mov.b   #000h,&LCDM8             ;
                                             ;
Mainloop_3  bis.w   #LPM3,SR                 ; Enter LPM3
            xor.b   #LCDSON,&LCDCTL          ; Flash the LCD
                                             ;
Main_3_End  jmp     Mainloop_3               ;
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;------------------------------------------------------------------------------ 
Init_Sys;   Subroutine sets up Modules and Control Registers
;------------------------------------------------------------------------------ 
            mov.w   #WDTPW+WDTHOLD,&WDTCTL   ; Stop WDT
SetupFLL2   bis.b   #XCAP18PF,&FLL_CTL0      ;set load capacitance for xtal
SetupLCD    mov.b   #LCDON+LCD4MUX+LCDP0,&LCDCTL       ; STK LCD 4Mux, S0-S16
SetupBT     mov.b   #BTFRFQ1+BTDIV+BTIP2+BTIP1,&BTCTL  ; 1s Int, STK LCD freq 
            mov.b   #0FCh,&P5SEL             ; Common and Rxx all selected
            bis.b   #BTIE,&IE2               ; Enable Basic Timer interrupt      
                                             ;
            clr.b   &LCDM1                   ; Clear the LCD Display
            clr.b   &LCDM2                   ;
            clr.b   &LCDM3                   ;
            clr.b   &LCDM4                   ;
            clr.b   &LCDM5                   ;
            clr.b   &LCDM6                   ;
            clr.b   &LCDM7                   ;
            clr.b   &LCDM8                   ;
                                             ;            
SetupPorts  mov.b   #0FFh,&P1DIR             ;set port to outputs
            clr.b   &P1OUT                   ;
            bic.b   #S1+S2,&P1DIR            ;Switches as inputs
            bis.b   #S1+S2,&P1IE             ;IE Switches
            bis.b   #S1+S2,&P1IES            ;Falling Edge
            clr.b   &P1IFG                   ;Clear P1 Ints
            mov.b   #0FFh,&P2DIR             ;set port to outputs
            clr.b   &P2OUT                   ;
            mov.b   #0FFh,&P3DIR             ;set port to outputs
            clr.b   &P3OUT                   ;
            mov.b   #0FFh,&P4DIR             ;set port to outputs
            clr.b   &P4OUT                   ;
            mov.b   #0FFh,&P5DIR             ;set port to outputs
            clr.b   &P5OUT                   ;
            mov.b   #0FFh,&P6DIR             ;set port to outputs
            clr.b   &P6OUT                   ;
            eint                             ;enable interrupts
            ret                              ;
                                             ;
;///////////I2C Subroutines start////////////////////////////////////////////// 
;------------------------------------------------------------------------------ 
Read_I2C   ; Reads two bytes of data transmitted from slave
;            enter ADDRI2C=00 - FF I2C device address to read
;                  RXTXI2C=x
;                  DATAI2C=x
;            exit  ADDRI2C=x
;                  RXTXI2C=x
;                  DATAI2C=0000 - FFFF I2C device data
;------------------------------------------------------------------------------ 
            mov.b   #TMPADDR,RXTXI2C         ; Load HW Address
            call    #I2C_Start               ; Send Start, Address and Ack
            mov.b   ADDRI2C,RXTXI2C          ; Load Pointer Address
            call    #I2C_TX                  ; Send Pointer and Ack
            mov.b   #TMPADDR,RXTXI2C         ; Load HW Address
            bis.b   #01h,RXTXI2C             ; Set LSB for "READ"
            call    #I2C_Start               ; Send Start, Address+RD and Ack
            call    #I2C_RX                  ; Read Data and Ack
                                             ;
;***** Used for 2-Byte transfer only *****   ;
            call    #I2C_ACKn                ; Acknowledge Byte Rcv'd
            call    #I2C_RX                  ; Read Data and Ack
                                             ;
            call    #I2C_NACKn               ; NOT Acknowledge Byte Rcv'd
            call    #I2C_Stop                ; Send Stop
            ret                              ; Return from subroutine
                                             ;
;------------------------------------------------------------------------------ 
Write_I2C;  enter ADDRI2C=00 - FF I2C device address to write to
;                 RXTXI2C=x
;                 DATAI2C=00 - FF I2C device data to write
;           exit  ADDRI2C=x
;                 RXTXI2C=x
;                 DATAI2C=x
;------------------------------------------------------------------------------ 
            mov.b   #TMPADDR,RXTXI2C         ; Load HW Address
            call    #I2C_Start               ; Send Start, Address and Ack
            mov.b   ADDRI2C,RXTXI2C          ; Load Pointer Address
            call    #I2C_TX                  ; Send Pointer and Ack
            mov.b   DATAI2C,RXTXI2C          ; Load Out-Going Data
            call    #I2C_TX                  ; Send Data and Ack
            call    #I2C_Stop                ; Send Stop
            ret                              ; Return from subroutine
                                             ;
;------------------------------------------------------------------------------ 
I2C_Start;  enter SDA=1, SCL=x
;           exit  SDA=0, SCL=0
;------------------------------------------------------------------------------ 
            bic.b   #SCL+SDA,&PxDIR          ; SCL and SDA to input direction

            bic.b   #SCL,&PxOUT              ; SCL=1
I2C_Start2  bit.b   #SCL,&PxIN               ; SCL==1?
            jz      I2C_Start2               ; wait for SCL==1

            bic.b   #SDA,&PxOUT              ; SDA=1
            nop                              ; delay
            nop                              ; (START condition needs
            nop                              ; set-up time >4.7us)
            nop
            bis.b   #SDA,&PxDIR              ; SDA=0
            nop                              ; delay
            nop                              ; (START condition needs
            nop                              ; hold time >4.0us)
            nop
            bis.b   #SCL,&PxDIR              ; SCL=0
                                             ;
;------------------------------------------------------------------------------ 
I2C_TX;     enter SDA=x, SCL=0
;           exit  SDA=1, SCL=0
;------------------------------------------------------------------------------ 
            mov     #08,BITI2C               ; number of bits to xfer
I2C_TX_Bit  rla.b   RXTXI2C                  ; data bit -> carry
            jc      I2C_TX1                  ; test carry for 1 or 0
I2C_TX0     bis.b   #SDA,&PxDIR              ; SDA=0
            jmp     I2C_TXx                  ; Toggle SCL
I2C_TX1     bic.b   #SDA,&PxDIR              ; SDA=1
I2C_TXx     bic.b   #SCL,&PxDIR              ; SCL=1
I2C_TXx2    bit.b   #SCL,&PxIN               ; SCL==1?
            jz      I2C_TXx2                 ; wait for SCL==1
            bis.b   #SCL,&PxDIR              ; SCL=0
            dec     BITI2C                   ; all bits read?
            jnz     I2C_TX_Bit               ; continue until 8 bits are sent
            bic.b   #SDA,&PxDIR              ; SDA=1
                                             ;
TX_Ackn     bic.b   #SCL,&PxDIR              ; SCL=1
TX_Ackn2    bit.b   #SCL,&PxIN               ; SCL==1?
            jz      TX_Ackn2                 ; wait for SCL==1
            bis.b   #SCL,&PxDIR              ; SCL=0
                                             ;
            ret                              ; Return from subroutine
                                             ;
;------------------------------------------------------------------------------ 
I2C_RX  ;   enter SDA=1, SCL=0
;           exit  SDA=x, SCL=0
;------------------------------------------------------------------------------ 
            mov.b   #08,BITI2C               ; number of bits to rcv
I2C_RX_Bit  bic.b   #SCL,&PxDIR              ; SCL=1
I2C_RX_Bit2 bit.b   #SCL,&PxIN               ; SCL==1?
            jz      I2C_RX_Bit2              ; wait for SCL==1
            bit.b   #SDA,&PxIN               ; SDA bit -> carry
            rlc.w   DATAI2C                  ; Shift new bit into DATAI2C
            bis.b   #SCL,&PxDIR              ; SCL=0
            dec     BITI2C                   ; all bits read?
            jnz     I2C_RX_Bit               ; continue until 8 bits are read
                                             ;
            ret                              ; Return from subroutine
                                             ;
;------------------------------------------------------------------------------ 
I2C_ACKn;   enter SDA=x, SCL=0
;           exit  SDA=1, SCL=0
;------------------------------------------------------------------------------ 
            bis.b   #SDA,&PxDIR              ; SDA=0, Ack
            bic.b   #SCL,&PxDIR              ; SCL=1
I2C_ACKn2   bit.b   #SCL,&PxIN               ; SCL==1?
            jz      I2C_ACKn2                ; wait for SCL==1
            bis.b   #SCL,&PxDIR              ; SCL=0
            bic.b   #SDA,&PxDIR              ; SDA=1
Ackn_End    ret                              ; Return from subroutine
                                             ;
;------------------------------------------------------------------------------ 
I2C_NACKn;  enter SDA=x, SCL=0
;           exit  SDA=1, SCL=0
;------------------------------------------------------------------------------ 
            bic.b   #SDA,&PxDIR              ; SDA=1, NOT Ack
            bic.b   #SCL,&PxDIR              ; SCL=1
I2C_NACKn2  bit.b   #SCL,&PxIN               ; SCL==1?
            jz      I2C_NACKn2               ; wait for SCL==1          
            bis.b   #SCL,&PxDIR              ; SCL=0
NAckn_End   ret                              ; Return from subroutine
                                             ;
;------------------------------------------------------------------------------ 
I2C_Stop;   enter SDA=x, SCL=0
;           exit  SDA=1, SCL=1
;------------------------------------------------------------------------------ 
            bis.b   #SDA,&PxDIR              ; SDA = 0
            nop                              ; delay
            nop                              ; (STOP condition needs
            nop                              ; set-up time >4.0us)
            nop
            bic.b   #SCL,&PxDIR              ; SCL=1
I2C_Stop2   bit.b   #SCL,&PxIN               ; SCL==1?
            jz      I2C_Stop2                ; wait for SCL==1    
            bic.b   #SDA,&PxDIR              ; SDA = 1
I2C_End     ret                              ; Return from subroutine
                                             ;
;///////////I2C Subroutines stop///////////////////////////////////////////////

;------------------------------------------------------------------------------ 
Calc_Temp  ;Subroutine handles MSB decoding for negative temp and oF conversion
           ;CPU Registers used R15, R14, R13; R13 saved for display
;------------------------------------------------------------------------------ 
            bic.b   #001h,Neg_Sign           ; Clear Neg Sign
                                             ; 
            bit.b   #001h,Disp_oF            ; Test if oF mode set
            jnz     Calc_F                   ; Display in oC
                                             ;
Calc_C      swpb    DATAI2C                  ;
            and.w   #000FFh,DATAI2C          ;
            bit.b   #080h,DATAI2C            ; test for negative
            jz      Calc_End                 ; Jump if number is positive   
            bis.b   #001h,Neg_Sign           ; Diplay Neg sign
            inv.b   DATAI2C                  ;
            inc.b   DATAI2C                  ;
            jmp     Calc_End                 ; Display in oC
                                             ;
Calc_F      bit.w   #8000h,DATAI2C           ; test for negative
            jz      Calc_F1                  ; Jump if number is positive
            bis.b   #001h,Neg_Sign           ; Display Neg Sign
            inv.w   DATAI2C                  ;
            inc.w   DATAI2C                  ;
Calc_F1     clrc                             ;

⌨️ 快捷键说明

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