📄 msp430f149i2c.s43
字号:
#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 + -