⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.lst

📁 这个是汽车制动台控制程序的C语言版本. 用于实际产品中.单片机用的是PIC16F877A.
💻 LST
字号:
     1: #include <pic.h>

     2: #include "total.h"      

     3: 

     4: /******************************************************************************************

     5: * 函数名称: void Check_Idle(void)

     6: * 功能: 检测总线是否处于空闲状态

     7: * 入口参数: 无

     8: * 出口参数: 无

     9: * 全局变量: 无

    10: * 调用模块: 无

    11: * 设计者: 饶阳胜

    12: * 日期: 05/3/1

    13: ******************************************************************************************/

    14: void CheckIdle(void)

    15: {

    16:         while(STAT_RW != 0);    //总线正在向外发送数据

    17:         while((SSPCON2 & 0x1F)!= 0);

    18: }

    19: 

    20: /*****************************************************************************************

    21: * 函数名称:     void WrtAckTest(void)

    22: * 功能:         检测器件的应答信号

    23: * 入口参数:     无

    24: * 出口参数:     无

    25: * 全局变量:     无

    26: * 调用模块:     无

    27: * 设计者:       饶阳胜

    28: * 日期:         05-3-1

    29: *****************************************************************************************/

    30: void WrtAckTest(void)

    31: {

    32:         SSPIF = 0;

    33:         while(SSPIF == 0);      //等待总线应答信号

    34: }

    35: 

    36: /******************************************************************************************

    37: * 函数名称:     void I2C_Write_Byte(unsigned char Devive_Address,unsigned char address,unsigned char data)

    38: * 功能:                 向EEPROM中写入一个字节的数据

    39: * 入口参数:     address,(要写入EEPROM的地址) data(要写入的数据) Device_Address 器件地址

    40: * 出口参数:     无

    41: * 全局变量:

    42: * 调用模块: 

    43: * 设计者:       饶阳胜

    44: * 日期:                 05-3-1

    45: ******************************************************************************************/

    46: void I2C_Write_Byte(unsigned char Device_Address,unsigned char Address,unsigned char Data)

    47: {

    48:         CheckIdle();                            //查询总线状态,是否空闲

    49:         SEN = 1;                                        //向总线发出起始信号

    50:         while(SSPIF == 0);                      //等待总线的应答信号

    51:         SSPBUF = Device_Address;        //向总线发出器件地址

    52:         WrtAckTest();                           //查询应答信号

    53:         while(STAT_BF == 1);

    54:         SSPBUF = Address;                       //向总线发出要写入的数据存放地址

    55:         WrtAckTest();                           //查询应答信号

    56:         while(STAT_BF == 1);

    57:         SSPBUF = Data;                          //向总线写入数据

    58:         WrtAckTest();                           //查询应答信号

    59:         SSPIF = 0;

    60:         PEN = 1;                                        //向总线发出停止信号

    61:         while(SSPIF == 0);

    62:         SSPIF = 0;                                      //清除总线中断标志      

    63:         Delay(16,250);                          //延时,让写操作完成

    64: }

    65: 

    66: /*******************************************************************************************

    67: * 函数名称:     unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)

    68: * 功能:                 从EEPROM中读出一个字节的数据

    69: * 入口参数:     Device_Address(器件地址),Address(数据在EEPROM中的存放地址)

    70: * 出口参数:     Data(   读出的数据)

    71: * 全局变量:

    72: * 调用模块: 

    73: * 设计者:       饶阳胜

    74: * 日期:                 05-3-2

    75: ********************************************************************************************/

    76: unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)

    77: {

    78:         unsigned char Recieve;

    79: 

    80:         CheckIdle();

    81:         SSPIF = 0;

    82:         SEN = 1;

    83:         while(SSPIF == 0);

    84:         SSPBUF = Device_Address;                //向总线发送器件地址

    85:         WrtAckTest();                                   //等待总线的应答信号

    86:         SSPBUF = Address;                               //向总线发出数据在EEPROM中的存储地址

    87:         WrtAckTest();                                   //等待总线的应答信号

    88:         Delay(16,250);  

    89:         CheckIdle();                                    //等待总线处于空闲状态

    90:         SSPIF = 0;                                              //清除总线的中断标志

    91:         RSEN = 1;                                               //发出重启动信号

    92:         while(SSPIF == 0);                              //等待总线中断信号,重启动完成

    93:         SSPBUF = (Device_Address + 1);  //发出器件地址(+1)表示读操作

    94:         WrtAckTest();                                   //等总线的应答信号

    95:         SSPIF = 0;                                              //清总线中断标志

    96:         RCEN = 1;                                               //使能接收

    97:         SSPIF = 0;

    98:         while(SSPIF == 0);

    99:         Recieve = SSPBUF;                               //存放接收到的数据

   100:         SSPIF = 0;                                              //清除总线的中断标志

   101:         ACKDT = 1;                                              //向总线发出应答信号

   102:         ACKEN = 1;

   103:         while(SSPIF == 0);

   104:         PEN = 1;

   105:         while(SSPIF == 0);

   106:         SSPIF = 0;

   107:         return(Recieve);

   108: }

   109:         

   110: /******************************************************************************************

   111: * 函数名称:     unsigned char MyWrite(unsigned char *Data,unsigned char Number,

   112: *                                                                                                               unsigned char Address)

   113: * 功能:                 向EEPROM中写入标定数据

   114: * 入口参数:     *Data(指向要写入EEPROM的数据的指针) Number(要写入的数据个数)

   115: *                       Address(数据在EEPROM中的存放地址)

   116: * 出口参数:     unsigned char(0: 写入不成功, 1: 写入成功)

   117: * 全局变量: 

   118: * 调用模块:     I2C_Write_Byte(向EEPROM中写入一个字节的数据)

   119: * 设计者:       饶阳胜

   120: * 日期:                 05/3/4

   121: * 说明:                 数据在EEPROM中的存储格式为:以字节的形式

   122: *               而数据在RAM中的存储形式为unsigned short(半字形式),所以要进行转换

   123: ******************************************************************************************/

   124: unsigned char My_Write(bank1 short *data,unsigned char number,unsigned char address)

   125: {

   126:         static bit change;                      //用于将RAM中以半字形式存储的数据拆成在便于在EEPROM中存储的字节形式

   127:         unsigned char writedata;        //要写入EEPROM中的数据变量

   128: 

   129:         change = 0;

   130: 

   131:         for(;number > 0; number--){             //向EEPROM中写入数据循环

   132:                 do{     

   133:                         if(change == 0){

   134:                                 writedata = (unsigned char)(*data & 0xFF);      //得到低字节数据        

   135:                                 change = 1;

   136:                         }else{

   137:                                 writedata = (unsigned char)(*data >> 8);        //得到高字节数据

   138:                                 change = 0;             

   139:                         }       

   140:                         I2C_Write_Byte(0xA0,address,writedata);         //向EEPROM写数据

   141:                         ++address;                                                                      //数据在EEPROM中的存放地址加1

   142:                 }while(change == 1);

   143:                 ++data;         //指向下一个数据

   144:         }       

   145:         return(1);

   146: }

   147: 

   148: /****************************************************************************************

   149: * 函数名称:     unsigned char MyRead(unsigned short *Data,unsigned char Number,

   150: *                                                                               unsigned char Address)

   151: * 功能:                 将EEPROM中的数据读出到RAM中

   152: * 入口参数:     unsigned short *Data(指向读出数据存放到RAM中的地址指针)

   153: *                       unsigned char Number 要读出的数据个数

   154: *                       unsigned char Address 数据在EEPROM中的存放地址

   155: * 出口参数:     unsigned char(0: 读出不成功,1:读出成功)

   156: * 全局变量:

   157: * 调用模块:     unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)

   158: *           从EEPROM中读出一个字节数据的函数

   159: * 设计者:       饶阳胜

   160: * 日期:                 05/3/5

   161: * 说明:                 每次从EEPROM中读出的数据是一个字节,而读出的数据在EEPROM中的存储形式是半字形式,所以要进行转换

   162: ****************************************************************************************/

   163: unsigned char My_Read(bank1 short *data,unsigned char number,unsigned char address)

   164: {

   165:         static bit change;              //用于将读出的数据合成一个半字形式

   166:         unsigned char readdata; //从EEPROM中的读出的数据变量

   167: 

   168:         change = 0;

   169: 

   170:         for(;number > 0; number--){             //从EEPROM中读出数据的循环

   171:                 do{

   172:                         readdata = I2C_Read_Byte(0xA0,address); //从EEPROM中读取数据

   173:                         ++address;                                                              //EEPROM地址加1

   174:                         if(change == 0){

   175:                                 *data = readdata;                                       //存储低字节

   176:                                 change = 1;

   177:                         }else{

   178:                                 *data = (readdata << 8) | (*data & 0xff);       //存储高字节

   179:                                 change = 0;

   180:                         }

   181:                 }while(change == 1);

   182:                 ++data;                                         //指向一个字节

   183:         }

   184:         return(1);

   185: }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -