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

📄 msp430f149i2c.s43

📁 以MPS430F149为硬件平台
💻 S43
📖 第 1 页 / 共 2 页
字号:

#include  "msp430x14x.h"
;AD部分
SDA         EQU     BIT2    ;AD数据线ADDATA
SCL         EQU     BIT1    ;AD时钟线ADCLK
#define     SDA_OUT      P1OUT
#define     SCL_OUT      P1OUT
#define     SDA_IN       P1IN
#define     SCL_IN       P1IN
#define     SDA_DIR      P1DIR
#define     SCL_DIR      P1DIR
;*******************************
;RAM区域定义
#define     ETEMP        R9
TEMP        EQU          200H   ;读时间的RAM区首地址
TEMP11      EQU          220H   ;写时间的RAM区首地址
;------------------------------------------------------------------------------ 
            ORG     01100h                  ; Progam Start 
;------------------------------------------------------------------------------ 
RESET
    mov.w   #0A00h,SP               ; Initialize 'F149 stackpointer
StopWDT
    mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
    DINT

;**************************************************************
;*********************调试区*********************************
;------------------------------------------------------------------------------
;需要对S35390A进行初始化,并且把SDA和SCK输出态,
;完成对S35390A后,把SDA和SCK输入态
;本部分需要最终给主程序提供4个子程序,以便调用,
;一个是初始化子程序,一个是设置时间的程序,一个是读时间的程序,一个是输出一个1赫兹的方波的程序
;------------------------------------------------------------------------------
    BIS.B   #SDA,&SDA_DIR            ;SDA为输出态
    BIS.B   #SCL,&SCL_DIR            ;SCL为输出态

    CALL    #I2CCLOCK_INIT          ;初始化S35390A
    CALL    #D500MS
    CALL    #I2CCLOCK_SET           ;设置S35390A
LMRTEST
    CALL    #I2CCLOCK_READTIME      ;读取S35390A的时间
   NOP
    CALL    #I2CCLOCK_1HZ           ;设置S35390A的INIT2输出一个1赫兹的方波
    //BIC.B   #SDA,&SDA_DIR         ;SDA为输入态
    //BIC.B   #SCL,&SCL_DIR         ;SCL为输入态        
    JMP     LMRTEST

;*********************调试区*********************************
;**************************************************************

;------------------------------------------------------------------------------ 
;I2C总线的S35390A的读写子程序
;------------------------------------------------------------------------------    
;程序名称:I2CCLOCK_INIT
;功能:设置S35390A:24小时的显示格式
;使用:R9、R11、R12、R15、200H
;调用:D500MS、I2CSTART、I2CSTOP、WRITEBYTE、ADREAD、
;影响:
;入口:
;出口:
I2CCLOCK_INIT  
    
    MOV     #WDT_ARST_1000,&WDTCTL  ;复位看门狗,时间为1S by fACLK 
    MOV     #03H,R12                ;循环2次,如果S35390A还是不好则继续下一个
INITLOOP1
    CALL    #D500MS
    MOV.B   #060H,ETEMP		    ;SEND ADRESS TO S35390A
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    MOV.B   #080H,ETEMP              ;RESET S35390A AND 24HOUR DISPLAY
    CALL    #WRITEBYTE
    CALL    #I2CSTOP

    MOV     #TEMP11,R11
    MOV.B   #61h,ETEMP		    ;SEND ADRESS AND READ(TIME DATA) COMMAND TO S35390A 
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    CLR     ETEMP
    CALL    #READBYTE
    CALL    #NOTXACK
    CALL    #I2CSTOP
    DEC     R12
    JZ      INTI_NEXT 
    BIT.B   #01H,ETEMP
    JNZ      INITLOOP1    
    BIT.B   #02H,ETEMP
    JNZ      INITLOOP1 
INTI_NEXT 
    MOV.B   #060H,ETEMP		    ;SEND ADRESS TO S35390A
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    MOV.B   #040H,ETEMP              ;RESET S35390A AND 24HOUR DISPLAY
    CALL    #WRITEBYTE
    CALL    #I2CSTOP
    RET
;------------------------------------------------------------------------------ 
;设置S35390A的年,月,日,星期,小时,分,秒
;程序名称:I2CCLOCK_SET
;功能:设置S35390A的年,月,日,星期,小时,分,秒
;      把TEMP11~TEMP11+5中的内容(左->右依次是年,月,日,星期,小时,分钟,秒)写到S35390A相应的寄存器中
;      其中星期直接写00星期,
;使用:R9、R11、R15、TEMP11~TEMP11+5
;调用:D500MS、I2CSTART、I2CSTOP、WRITEBYTE、ADREAD、
;影响:
;入口:R11为读取RAM区的地址(共6个数据)
;出口:
I2CCLOCK_SET
    MOV     #WDT_ARST_1000,&WDTCTL  ;复位看门狗,时间为1S by fACLK 
    MOV     #TEMP11,R11
    MOV.B   #64H,ETEMP		    ;SEND ADRESS AND WRITE(TIME DATA) COMMAND TO S35390A
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    MOV.B   0(R11),ETEMP              ;WRITE YEAR=08
    CALL    #WRITEDATA
    MOV.B   1(R11),ETEMP              ;WRITE MONTH=10
    CALL    #WRITEDATA
    NOP
    MOV.B   2(R11),ETEMP              ;WRITE DATA=08
    CALL    #WRITEDATA
    NOP
    MOV.B   #000H,ETEMP              ;WRITE WEEK=00
    CALL    #WRITEDATA
    NOP
    //判断是否大于12点,是则加040h  ;WRITE HOUR=23PM
    CMP.B   #12H,3(R11)             
    JLO     HOUR_AM
    ADD.B   #040H,3(R11)
    MOV.B   3(R11),ETEMP
    CALL    #WRITEDATA
    JMP     HOUR_PM
HOUR_AM    
    MOV.B   3(R11),ETEMP              
    CALL    #WRITEDATA
HOUR_PM
    NOP
    MOV.B   4(R11),ETEMP              ;WRITE MIN=59
    CALL    #WRITEDATA
    NOP
    MOV.B   5(R11),ETEMP              ;WRITE SEC=51
    CALL    #WRITEDATA
    NOP
    CALL    #I2CSTOP    
/*
    MOV.B   #64H,ETEMP		    ;SEND ADRESS AND WRITE(TIME DATA) COMMAND TO S35390A
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    MOV.B   #008H,ETEMP              ;WRITE YEAR=08
    CALL    #WRITEDATA
    MOV.B   #010H,ETEMP              ;WRITE MONTH=10
    CALL    #WRITEDATA
    MOV.B   #009H,ETEMP              ;WRITE DATA=08
    CALL    #WRITEDATA
    MOV.B   #003H,ETEMP              ;WRITE WEEK=03
    CALL    #WRITEDATA
    MOV.B   #063H,ETEMP              ;WRITE HOUR=23PM
    CALL    #WRITEDATA
    MOV.B   #059H,ETEMP              ;WRITE MIN=59
    CALL    #WRITEDATA
    MOV.B   #051H,ETEMP              ;WRITE SEC=51
    CALL    #WRITEDATA
    CALL    #I2CSTOP
*/    
    RET    
;------------------------------------------------------------------------------ 
;读取S35390A的年,月,日,星期,小时,分,秒
;程序名称:I2CCLOCK_SET
;功能:读取S35390A的年,月,日,星期,小时,分,秒
;      把S35390A相应的寄存器中(左->右依次是年,月,日,小时,分钟,秒)读到TEMP11~TEMP11+5中的内容
;使用:R9、R11、R15、TEMP~TEMP+6
;      (共6个数据,分别是TEMP(YEAR),TEMP+1(MOUTH,TEMP+2(DATA),TEMP+3(HOUR),TEMP+4(MINUTE),TEMP+5(SECOND))
;调用:I2CSTART、I2CSTOP、WRITEBYTE、ADREAD、WRITEDATA
;影响:
;入口:R11为写入RAM区的地址
;出口:
I2CCLOCK_READTIME
    MOV     #TEMP,R11
    MOV     #07H,R12 
    MOV.B   #65h,ETEMP		    ;SEND ADRESS AND READ(TIME DATA) COMMAND TO S35390A 
    CALL    #ADREAD                 // READ YEAT MONTH DATA WEEK HOUR MINUTE SECOND
    MOV.B   (TEMP+4),(TEMP+3)    
    MOV.B   (TEMP+5),(TEMP+4) 
    MOV.B   (TEMP+6),(TEMP+5) 
    ;(TEMP+3)判断是否是大于12点,是则减去#040H
    BIT.B   #040H,(TEMP+3)
    JZ      RHOUR_AM
    SUB.B   #040H,(TEMP+3)
RHOUR_AM    
    RET 
;------------------------------------------------------------------------------ 
;设置S35390A的INIT2输出一个1赫兹的方波,
;程序名称:I2CCLOCK_1HZ
;功能:设置S35390A的INIT2输出一个1赫兹的方波
;使用:R9、R11、R15、
;调用:I2CSTART、I2CSTOP、WRITEBYTE、
;影响:
;入口:
;出口:
I2CCLOCK_1HZ
    MOV.B   #062H,ETEMP		    ;SEND ADRESS TO S35390A
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    MOV.B   #008H,ETEMP              ;ENBLE S35390A INIT2 OUTPUT 
    CALL    #WRITEBYTE
    CALL    #I2CSTOP
   
    MOV.B   #06AH,ETEMP		    ;SEND ADRESS TO S35390A
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    MOV.B   #000H,ETEMP              ;CLEAR INIT2 REG
    CALL    #WRITEBYTE
    CALL    #I2CSTOP 
   
    MOV.B   #06AH,ETEMP		    ;SEND ADRESS TO S35390A
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    MOV.B   #080H,ETEMP              ;SET S35390A INIT2 OUTPUT 1HZ WAVE
    CALL    #WRITEBYTE
    CALL    #I2CSTOP 
    RET
;------------------------------------------------------------------------------ 
;从S35390A读取采输出寄存器和配置寄存器中的数据子程序
;ETEMP(R9)、R11(RAM地址)、R12(字节数)
;读出的结果存放在R11指向的RAM中
ADREAD      
    MOV     #WDT_ARST_1000,&WDTCTL  ;复位看门狗,时间为1S by fACLK 
    DEC     R12
    JZ      RDONETYPE
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    CLR     ETEMP
ADRDLOOP0
    CALL    #READBYTE
    CALL    #TXACK	 	     ;Send ACK sign to ADS1110:read 8bit data over
    MOV.B   R9,0(R11)
    INC     R11
    DEC     R12
    JNZ     ADRDLOOP0
    JMP     FINALTYPE
RDONETYPE
    CALL    #I2CSTART
    CALL    #WRITEBYTE		    ;write one byte to S35390A
    CLR     ETEMP
FINALTYPE
    CALL    #READBYTE
    MOV.B   R9,0(R11)
    CALL    #NOTXACK
    CALL    #I2CSTOP

⌨️ 快捷键说明

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