硬件I2C(中断方式)以STC8F2K08S2单片机为例
一、I2C相关的寄存器二、I2C中断相关的寄存器① I2C中断源② I2C中断允许位③ I2C中断标志位
三、程序编写① 寄存器和相关宏定义② 硬件I2C中断服务程序③ 硬件I2C初始化④ 硬件I2C操作代码⑤ BMP085 读写例程⑥ 串口代码
一、I2C相关的寄存器
STC8系列单片机硬件I2C使用教程(一)
二、I2C中断相关的寄存器
① I2C中断源
② I2C中断允许位
③ I2C中断标志位
三、程序编写
① 寄存器和相关宏定义
sfr P_SW2
= 0xBA;
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82)
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87)
bit i2c_busy
;
sbit SDA
= P3
^3;
sbit SCL
= P3
^2;
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
② 硬件I2C中断服务程序
void I2C_Isr() interrupt
24 using
1
{
_push_(P_SW2
);
P_SW2
|= 0x80;
if(I2CMSST
& 0x40){
I2CMSST
&= ~0x40;
i2c_busy
= 0;
}
_pop_(P_SW2
);
}
③ 硬件I2C初始化
void init_i2c(void)
{
uchar temp
= 0x00;
temp
|= (I2C_S0
| I2C_S1
);
temp
|= EAXFR
;
P_SW2
= temp
;
I2CCFG
= 0xE0;
I2CMSST
= 0x00;
}
④ 硬件I2C操作代码
void start()
{
i2c_busy
= 1;
I2CMSCR
= 0x81;
while(i2c_busy
);
}
void send_data(uchar dat
)
{
I2CTXD
= dat
;
i2c_busy
= 1;
I2CMSCR
= 0x82;
while(i2c_busy
);
}
void recv_ack()
{
i2c_busy
= 1;
I2CMSCR
= 0x83;
while(i2c_busy
);
}
uchar
recv_data()
{
i2c_busy
= 1;
I2CMSCR
= 0x84;
while(i2c_busy
);
return I2CRXD
;
}
void send_ack()
{
I2CMSST
= 0x00;
i2c_busy
= 1;
I2CMSCR
= 0x85;
while(i2c_busy
);
}
void send_nack()
{
I2CMSST
= 0x01;
i2c_busy
= 1;
I2CMSCR
= 0x85;
while(i2c_busy
);
}
void stop()
{
i2c_busy
= 1;
I2CMSCR
= 0x86;
while(i2c_busy
);
}
⑤ BMP085 读写例程
STC8系列单片机硬件I2C使用教程(一)
⑥ 串口代码
STC8系列单片机硬件I2C使用教程(一)
转载请注明原文地址:https://blackberry.8miu.com/read-4758.html