发表于:2005/12/15 21:48:00
#0楼
At24c02的使用
参考程序:
;******************************************************
;功能:MSP430F1121把一个数写入任何地址中,然后再把数据
; 从24C02中读出来,进行LED闪烁次数的显示,显示次数
; 是写入数据的1/2。写入数据无应答时蜂鸣器叫。
;使用资源:SDA P2.5, SCL P2.0 ,LED P2.4,BUZ P2.3
;******************************************************
#include "msp430x11x1.h"
RXTXI2C EQU 202H ;要写入命令数据寄存器
ADDRI2C0 EQU 203H ;写入数据的地址(24C02)
DATAI2C EQU 204H ;要写入的数据寄存器
BITI2C EQU 205H ;数据位数寄存器
R_I2C EQU 206H ;接收数据寄存器
SDA EQU 020H ;p2.5 SDA
SCL EQU 001H ;p2.0 SCL
Code EQU 0A0H ;命令数据寄存器
;--------------------------------------------
ORG 0F000H
RESET MOV #300H,SP
StopWDT MOV #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
BIS.B #18H,&P2DIR ;据LED,BUZ数据设为输出
BIC.B #08H,&P2OUT ;关闭蜂鸣器的的鸣叫
MOV.B #03h,R7 ;要写入数据地址
MOV.B #0AH,R8 ;要写入的数据
BIC.B #SDA,&P2OUT ;初始化SDA,SCL 为输出低电平
BIC.B #SCL,&P2OUT
MAIN MOV.B R7,ADDRI2C0 ;把地址赋予ADDRI2C
MOV.B R8,DATAI2C ;把数据赋予ADDRI2C
CALL #Write_I2C ;把数据写入24C02中
MOV #01FFFH,R15 ;延时
DLY0 DEC R15
JNZ DLY0
MOV.B R7,ADDRI2C0 ;把要读的数据地址赋予ADDRI2C
CALL #Read_I2C ;读取数据到R_I2C
MOV.B R_I2C,R9 ;把R_I2C赋予R9
LOOP
XOR.B #010h,&P2OUT ;LED闪烁
MOV.W #65000,R15 ;延时
DLY1 DEC.W R15
JNZ DLY1
MOV.W #65000,R15 ;延时
DLY2 DEC.W R15
JNZ DLY2
DEC.B R9 ;闪烁资数减1
JNZ LOOP ;不为0继续闪烁,为0停止
STP BIS.W #CPUOFF,SR
JMP $
;-------------------------------------I2C延时程序
I2CDLY NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;----------------------------------------I2C启动程序
I2C_Start BIS.B #SDA,&P2DIR
NOP
BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
CALL #I2CDLY
BIS.B #SDA,&P2DIR
CALL #I2CDLY
BIS.B #SCL,&P2DIR
I2C_TX MOV.B #08,BITI2C
I2C_Send RLA.B RXTXI2C
JC I2C_Send1
I2C_Send0 BIS.B #SDA,&P2DIR
JMP I2C_Sx
I2C_Send1 BIC.B #SDA,&P2DIR
I2C_Sx BIC.B #SCL,&P2DIR
NOP
NOP
BIS.B #SCL,&P2DIR
BIS.B #SDA,&P2DIR
DEC.B BITI2C
JNZ I2C_Send
;;;;;;;;;;;;;;;;;检测应答位
CACK ;BIC.B #SCL+SDA,&P2DIR
BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
Ack_wait BIT.B #SDA,&P2IN
BIS.B #08H,&P2OUT ;如果不应答蜂鸣器鸣叫
CALL #I2CDLY
JNZ I2C_Start ;如果不应答重新启动
BIC.B #08H,&P2OUT ;如果应答则关闭蜂鸣器
BIS.B #SCL,&P2DIR
RET
;------------------------------------发送应答位
MACK BIS.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
NOP
NOP
BIS.B #SCL,&P2DIR
BIC.B #SDA,&P2DIR
RET
;-----------------------------------发送非应答位
MNACK BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
NOP
NOP
BIS.B #SCL,&P2DIR
BIS.B #SDA,&P2DIR
RET
;-----------------------------------I2C读24C02的1个字节程序
I2C_Read MOV.B #08,BITI2C
I2C_Rx BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
;BIC.B #SCL+SDA,&P2DIR
BIT.B #SDA,&P2IN
RLC.B R_I2C
BIS.B #SCL,&P2DIR
DEC.B BITI2C
;CALL #I2CDLY
JNZ I2C_Rx
;JMP MACK
RET
;-------------------------------------I2C停止程序
I2C_Stop BIS.B #SCL,&P2DIR
BIS.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
CALL #I2CDLY
BIC.B #SDA,&P2DIR
CALL #I2CDLY
BIS.B #SDA,&P2DIR
NOP
BIS.B #SCL,&P2DIR
I2C_End RET
;-------------------------------------I2C读24C02
Read_I2C ;Write addr
MOV.B #Code,RXTXI2C
ADD.B #0, RXTXI2C
CALL #I2C_Start
MOV.B ADDRI2C0,RXTXI2C
CALL #I2C_TX
CALL #I2C_Stop
;Read data----------
MOV.B #Code,RXTXI2C
ADD.B #1,RXTXI2C
;BIS.B #01H,RXTXI2C
CALL #I2C_Start
CALL #I2C_Read
CALL #MNACK
CALL #I2C_Stop
RET
;-------------------------------------I2C写24C02
Write_I2C MOV.B #Code,RXTXI2C
ADD.B #0,RXTXI2C
CALL #I2C_Start
;MOV.B ADDRI2C1,RXTXI2C
;CALL #I2C_TX
MOV.B ADDRI2C0,RXTXI2C
CALL #I2C_TX
MOV.B DATAI2C,RXTXI2C
CALL #I2C_TX
CALL #I2C_Stop
RET
;--------------------------------------------
;MSP430F1121
;--------------------------------------------
ORG 0FFFEH
DW RESET
END
参考程序:
;******************************************************
;功能:MSP430F1121把一个数写入任何地址中,然后再把数据
; 从24C02中读出来,进行LED闪烁次数的显示,显示次数
; 是写入数据的1/2。写入数据无应答时蜂鸣器叫。
;使用资源:SDA P2.5, SCL P2.0 ,LED P2.4,BUZ P2.3
;******************************************************
#include "msp430x11x1.h"
RXTXI2C EQU 202H ;要写入命令数据寄存器
ADDRI2C0 EQU 203H ;写入数据的地址(24C02)
DATAI2C EQU 204H ;要写入的数据寄存器
BITI2C EQU 205H ;数据位数寄存器
R_I2C EQU 206H ;接收数据寄存器
SDA EQU 020H ;p2.5 SDA
SCL EQU 001H ;p2.0 SCL
Code EQU 0A0H ;命令数据寄存器
;--------------------------------------------
ORG 0F000H
RESET MOV #300H,SP
StopWDT MOV #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
BIS.B #18H,&P2DIR ;据LED,BUZ数据设为输出
BIC.B #08H,&P2OUT ;关闭蜂鸣器的的鸣叫
MOV.B #03h,R7 ;要写入数据地址
MOV.B #0AH,R8 ;要写入的数据
BIC.B #SDA,&P2OUT ;初始化SDA,SCL 为输出低电平
BIC.B #SCL,&P2OUT
MAIN MOV.B R7,ADDRI2C0 ;把地址赋予ADDRI2C
MOV.B R8,DATAI2C ;把数据赋予ADDRI2C
CALL #Write_I2C ;把数据写入24C02中
MOV #01FFFH,R15 ;延时
DLY0 DEC R15
JNZ DLY0
MOV.B R7,ADDRI2C0 ;把要读的数据地址赋予ADDRI2C
CALL #Read_I2C ;读取数据到R_I2C
MOV.B R_I2C,R9 ;把R_I2C赋予R9
LOOP
XOR.B #010h,&P2OUT ;LED闪烁
MOV.W #65000,R15 ;延时
DLY1 DEC.W R15
JNZ DLY1
MOV.W #65000,R15 ;延时
DLY2 DEC.W R15
JNZ DLY2
DEC.B R9 ;闪烁资数减1
JNZ LOOP ;不为0继续闪烁,为0停止
STP BIS.W #CPUOFF,SR
JMP $
;-------------------------------------I2C延时程序
I2CDLY NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;----------------------------------------I2C启动程序
I2C_Start BIS.B #SDA,&P2DIR
NOP
BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
CALL #I2CDLY
BIS.B #SDA,&P2DIR
CALL #I2CDLY
BIS.B #SCL,&P2DIR
I2C_TX MOV.B #08,BITI2C
I2C_Send RLA.B RXTXI2C
JC I2C_Send1
I2C_Send0 BIS.B #SDA,&P2DIR
JMP I2C_Sx
I2C_Send1 BIC.B #SDA,&P2DIR
I2C_Sx BIC.B #SCL,&P2DIR
NOP
NOP
BIS.B #SCL,&P2DIR
BIS.B #SDA,&P2DIR
DEC.B BITI2C
JNZ I2C_Send
;;;;;;;;;;;;;;;;;检测应答位
CACK ;BIC.B #SCL+SDA,&P2DIR
BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
Ack_wait BIT.B #SDA,&P2IN
BIS.B #08H,&P2OUT ;如果不应答蜂鸣器鸣叫
CALL #I2CDLY
JNZ I2C_Start ;如果不应答重新启动
BIC.B #08H,&P2OUT ;如果应答则关闭蜂鸣器
BIS.B #SCL,&P2DIR
RET
;------------------------------------发送应答位
MACK BIS.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
NOP
NOP
BIS.B #SCL,&P2DIR
BIC.B #SDA,&P2DIR
RET
;-----------------------------------发送非应答位
MNACK BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
NOP
NOP
BIS.B #SCL,&P2DIR
BIS.B #SDA,&P2DIR
RET
;-----------------------------------I2C读24C02的1个字节程序
I2C_Read MOV.B #08,BITI2C
I2C_Rx BIC.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
;BIC.B #SCL+SDA,&P2DIR
BIT.B #SDA,&P2IN
RLC.B R_I2C
BIS.B #SCL,&P2DIR
DEC.B BITI2C
;CALL #I2CDLY
JNZ I2C_Rx
;JMP MACK
RET
;-------------------------------------I2C停止程序
I2C_Stop BIS.B #SCL,&P2DIR
BIS.B #SDA,&P2DIR
BIC.B #SCL,&P2DIR
CALL #I2CDLY
BIC.B #SDA,&P2DIR
CALL #I2CDLY
BIS.B #SDA,&P2DIR
NOP
BIS.B #SCL,&P2DIR
I2C_End RET
;-------------------------------------I2C读24C02
Read_I2C ;Write addr
MOV.B #Code,RXTXI2C
ADD.B #0, RXTXI2C
CALL #I2C_Start
MOV.B ADDRI2C0,RXTXI2C
CALL #I2C_TX
CALL #I2C_Stop
;Read data----------
MOV.B #Code,RXTXI2C
ADD.B #1,RXTXI2C
;BIS.B #01H,RXTXI2C
CALL #I2C_Start
CALL #I2C_Read
CALL #MNACK
CALL #I2C_Stop
RET
;-------------------------------------I2C写24C02
Write_I2C MOV.B #Code,RXTXI2C
ADD.B #0,RXTXI2C
CALL #I2C_Start
;MOV.B ADDRI2C1,RXTXI2C
;CALL #I2C_TX
MOV.B ADDRI2C0,RXTXI2C
CALL #I2C_TX
MOV.B DATAI2C,RXTXI2C
CALL #I2C_TX
CALL #I2C_Stop
RET
;--------------------------------------------
;MSP430F1121
;--------------------------------------------
ORG 0FFFEH
DW RESET
END