📄 iic_b.c
字号:
/********************************************************************************
* 描述: *
* 24C02调用程序模块 *
*******************************************************************************/
#include<reg51.h> /*=== 头文件包含 ===*/
#include<intrins.h>
#include<absacc.h>
#include <IC_CARD_b.h>
/* iic延时 */
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 开启iic总线 */
void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}
/* 关闭iic总线 */
void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}
/* 发送ACK信号 */
void iic_ack(void)
{
SDA=0;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/* 发送NOACK信号 */
void iic_no_ack(void)
{
SDA=1;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack
功 能:等待ACK信号
说 明:
入口参数:
返 回 值:1-ACK 0-ERROR
***********************************************************************/
bit iic_wait_ack(void)
{
uchar errtime=255;
//uint errtime = 1000;
SDA=1;
iic_wait();
SCL=1;
iic_wait();
while(SDA)
{
errtime--;
if(!errtime)
return 0;
}
SCL=0;
return 1;
}
/********************************************************************
函 数 名:iic_send_byte
功 能:MCU向iic设备发送一个字节
说 明:
入口参数:sbyte 待发送的字节数据
返 回 值:
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i = 8;
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(sbyte&0x80);
sbyte <<= 1;
iic_wait();
SCL = 1;
iic_wait();
}
SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte
功 能:MCU从iic设备接收一个字节
说 明:
入口参数:
返 回 值:ddata 接收数据
***********************************************************************/
uchar iic_receive_byte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata <<= 1;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/********************************************************************
函 数 名:write_iic_data
功 能:向iic设备写入N个字节
说 明:
入口参数:write_data 存放写入字节的数组
address 指定从address处开始写入
num 写入的字节数
返 回 值:无
***********************************************************************/
void write_iic_data(uchar write_data[], uchar address, uchar num)
{
uchar n;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
for(n=0; n<num; n++)
{
iic_send_byte(write_data[n]);
iic_wait_ack();
}
iic_stop();
}
/********************************************************************
函 数 名:read_iic_data
功 能:从iic设备读取N个字节
说 明:
入口参数:read_data 存放读取字节的数组
address 指定从address处开始读取
num 读取的字节数
返 回 值:无
***********************************************************************/
void read_iic_data(uchar read_data[], uchar address, uchar num)
{
uchar n;
uchar *pread_data;
pread_data = read_data;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (n=0; n<num; n++)
{
*pread_data = iic_receive_byte();
pread_data++;
if (n != (num - 1)) //最后一个数据不应答
{
iic_ack();
}
}
iic_no_ack();
iic_stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -