📄 d413_tmp_sensor_master.s43
字号:
;
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 + -