MSP430学习的个模拟I2C程序

发表于:前天 12:30|本帖共 2,040 字 2918
       #include unsigned char I2CBUF; unsigned char checkbit; #define SCL_H (P10OUT |= BIT2) // P10.2为SCL #define SCL_L (P10OUT &= ~BIT2) #define SDA_H (P10OUT |= BIT1) //p10.1为SDA #define SDA_L (P10OUT &= ~BIT1) #define SDA_OUT (P10DIR |= BIT1) #define SDA_IN (P10DIR &= ~ BIT1) void I2C_Start(void) //I2C开始信号 {
SDA_OUT; SCL_L; SDA_H; __delay_cycles(5); SCL_H; __delay_cycles(5); SDA_L; __delay_cycles(5); SCL_L; __delay_cycles(5); }
unsigned char testACK(void) { SDA_IN; __delay_cycles(5); SCL_H; __delay_cycles(5); checkbit = (P10IN & BIT1) >> 4; __delay_cycles(5); SCL_L; __delay_cycles(5); return (checkbit); }
void I2C_ACK(void) //应答信号 {
SDA_OUT; SCL_L; SDA_L; __delay_cycles(5); SCL_H; __delay_cycles(5); SCL_L; __delay_cycles(5); SDA_H; }
void I2C_NACK(void) { SDA_OUT; SDA_H; __delay_cycles(5); SCL_H; __delay_cycles(5); SCL_L; __delay_cycles(5); }
void I2C_STOP(void) //产生结束信号 {
SCL_L; __delay_cycles(5); SDA_L; __delay_cycles(5); SCL_H; __delay_cycles(5); SDA_H; __delay_cycles(5); }
void I2C_WRITE(unsigned char data) {
SDA_OUT; unsigned char i; for (i = 8; i > 0; i--) //高位循环8次,发送1个字节数据 {
  if (data & ) //判断数据高位是0还是1 {
  SDA_H; //高位数据写1 }
  else {
  SDA_L; }
  SCL_H; __delay_cycles(5); //发送数据 SCL_L; __delay_cycles(5); data }
} unsigned char I2C_READ(void) {
unsigned char j; unsigned char BUFFER = ; SDA_IN; for (j = 8; j >0; j--) //高位循环8次,发送1个字节数据 {
  SCL_H; __delay_cycles(5); BUFFER if ((P10IN & BIT1) == BIT1) //判断数据高位是0还是1 {
  BUFFER |= ; //高位数据写1 }
  else {
  BUFFER |= 0XFE; }
  __delay_cycles(5); //发送数据 SCL_L; __delay_cycles(5); }
return BUFFER; }
void C16_WRITEDATA(unsigned char address, unsigned char DATA) {
I2C_Start(); I2C_WRITE(address); testACK(); I2C_ACK(); I2C_WRITE(); testACK(); I2C_ACK(); I2C_WRITE(DATA); I2C_STOP(); }
unsigned char C16_READEDATA(unsigned char address) {
unsigned char READDATA; I2C_Start(); I2C_WRITE(0XA1); testACK(); I2C_ACK(); I2C_WRITE(address); I2C_Start(); testACK(); I2C_ACK(); I2C_WRITE(0XA1); READDATA = I2C_READ(); I2C_STOP(); return READDATA; }
int main(void) {
  const int DATA = ; unsigned char READBUFFER; WDTCTL = WDTPW + WDTHOLD; P10DIR |= BIT1 + BIT2; P2DIR |= BIT0; P2OUT &= ~BIT0; C16_WRITEDATA(, DATA); __delay_cycles(5); READBUFFER = C16_READEDATA(); while (1) {
  if (READBUFFER == ) {
  P2OUT |= BIT0; } else { P2OUT &= ~ BIT0; }
  __delay_cycles(15); }
}
收藏
送赞
分享

发表回复