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

📄 fm24c16.c

📁 一个分选系统的软件:用SmallRtos操作系统
💻 C
字号:
#include "config.h"
bdata unsigned char ab;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
sbit FMSCL = P0^7;
sbit FMSDA = P0^6;
/***************************************************/
//void load_work_step_infomation_from_fm(unsigned char work_step)
//{
//    current_ws_type    = read_f24c16_byte(FM_WORK_STEP_INFO_BASE+4+work_step*7+0);
//    current_ws_current = read_f24c16_int (FM_WORK_STEP_INFO_BASE+4+work_step*7+1);
//    current_ws_voltage = read_f24c16_int (FM_WORK_STEP_INFO_BASE+4+work_step*7+3);
//    current_ws_minute  = read_f24c16_int (FM_WORK_STEP_INFO_BASE+4+work_step*7+5);
//}

void I_delay(void)
{
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
}
void I_delayl(void)
{
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();

//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();

}
/************************************************************
*函数原型:void I_start(void);                     *
* 功能:    提供I2C总线工作时序中的起始位。                 *
************************************************************/
void I_start(void)
{
    FMSCL = HIGH;I_delayl();
    FMSDA = LOW;I_delay();
    FMSCL = LOW;I_delay();
}
/************************************************************
*函数原型:void function I_stop(void);                      *
* 功能:    提供I2C总线工作时序中的停止位。                 *
************************************************************/
void I_stop(void)
{
    FMSDA = LOW;I_delay();
    FMSCL = HIGH;I_delayl();
    FMSDA = HIGH;I_delay();
    FMSCL = LOW;I_delay();
}
/**************************************************************/
/*函数原型:void function I_init(void);                        *
* 功能:    I2C总线初始化。在MAIN()函数中应首先调用本函数,  *
*  然后再调用其它函数。                                       */
/********************************** ****************************/
void I_init(void)
{
    FMSCL = LOW;I_delay();
    I_stop();I_delay();
}
/**********************************************************************************************************************/
/*函数原型:bit void function I_clock(void);
*  功能:    提供I2C总线的时钟信号,并返回在时钟电平为高期间FMSDA信号线上状态。本函数可用于数据发送,也可用于数据接收。*/
/*********************************************************************************************************************/
bit I_clock(void)
{
    bit sample;
    FMSCL = HIGH;I_delayl();
    sample = FMSDA;I_delay();
    FMSCL = LOW;I_delay();
    return (sample);
}
/*************************************************************************************************************/
/*函数原型:bit void function I_send(unsigned char I_data);
*  功能:    向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答则返回1(TRUE),否则返回0(FALSE)。*
/*************************************************************************************************************/
bit I_send(unsigned char  I_data)
{
    ab = I_data;
    FMSDA = abit7;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = abit6;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = abit5;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = abit4;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = abit3;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = abit2;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = abit1;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = abit0;;FMSCL = HIGH;I_delayl();FMSCL = LOW;I_delay();
    FMSDA = HIGH;I_delay();
    return(~I_clock());
}
/********************************************************************/
/*函数原型:unsigned char function I_receive(void);                          *
*功能:    从I2C总线接收8位数据,并将接收到8位数据作为一个字节返回,*
*不回送应答信号ACK。主函数在调用本函数之前应保证FMSDA信号线个于浮置状 *
*态,即使8051的P1.7脚置1.                                           */
/********************************************************************/
unsigned char I_receive(void)
{
    FMSCL = HIGH;I_delayl();abit7 = FMSDA;FMSCL = LOW;I_delay();
    FMSCL = HIGH;I_delayl();abit6 = FMSDA;FMSCL = LOW;I_delay();
    FMSCL = HIGH;I_delayl();abit5 = FMSDA;FMSCL = LOW;I_delay();
    FMSCL = HIGH;I_delayl();abit4 = FMSDA;FMSCL = LOW;I_delay();
    FMSCL = HIGH;I_delayl();abit3 = FMSDA;FMSCL = LOW;I_delay();
    FMSCL = HIGH;I_delayl();abit2 = FMSDA;FMSCL = LOW;I_delay();
    FMSCL = HIGH;I_delayl();abit1 = FMSDA;FMSCL = LOW;I_delay();
    FMSCL = HIGH;I_delayl();abit0 = FMSDA;FMSCL = LOW;I_delay();
    return (ab);
}
/******************************************************************/
/******************************************************************/
/*函数原型:void function I_ack(void);                            *
  功能:    向I2C总线发送一个应答案信号ACK,一般用于连续数据读取时.*/
/******************************************************************/
/*void function I_Ack(void)
{
    FMSDA = LOW;
    I_clock();
    FMSDA = HIGH;
}  */
/****************************************************************************
*    函数原型: bit function E_address(unsigned char Address);
*    功    能: 向f24C16写入器件地址和一个指定的字节地址。
*****************************************************************************/
void E_address( unsigned char Device_Address,unsigned char Address )
{
    I_start() ;
    I_send( Device_Address&0xfe );
    I_send( Address );
}
/*********************************************************************************************************
** 函数名称: EepromReadByte
** 功能描述: 从指定的地址读出一个字节数据
** 输 入:   address,bytenumber
** 输 出:   所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 EepromReadByte (uint16 address)
{
    unsigned char a;
    unsigned char device_address,data_address;
    data_address=(unsigned char)address;
    device_address=(unsigned char)(address>>8);
    device_address=device_address<<1;
    device_address=device_address&0x0f;
    device_address=device_address|0xA1;
    I_init();
    E_address( device_address,data_address );
    I_start();
    I_send(device_address);
    a = I_receive();
    I_stop();
    return(a);
}
/*********************************************************************************************************
** 函数名称: EepromReadWord
** 功能描述: 从指定的地址读出一个字节数据
** 输 入:   address,bytenumber
** 输 出:   所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint16 EepromReadWord (uint16 address)
{
    unsigned int a;
    unsigned char b,c;
    b =  EepromReadByte(address);
    c =  EepromReadByte(address+1);
    a=b;
    a=a<<8;
    a=a|c;
    return(a);
}
/*********************************************************************************************************
** 函数名称: EepromWriteByte
** 功能描述: 在指定的地址写入指定的字节
** 输 入:   address,temp
** 输 出:   无
** 全局变量: 
** 调用模块: SM_Send
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteByte(uint16 address ,uint8 temp)
{
    uint8 device_address,data_address;
    data_address=(uint8)address;
    device_address=(uint8)(address>>8);
    device_address=device_address<<1;
    device_address=device_address&0xe;
    device_address=device_address|0xA0;
    I_init();
    E_address( device_address,data_address );
    I_send(temp);
    I_stop();
 }
/*********************************************************************************************************
** 函数名称: EepromWriteWord
** 功能描述: 在指定的地址写入指定的字节
** 输 入:   address,temp16
** 输 出:   无
** 全局变量: 
** 调用模块: SM_Send
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteWord(uint16 address ,uint16 pata_data)
{
    uint8 high_byte,low_byte;
    high_byte =(uint8)( pata_data>>8);
    EepromWriteByte(address,high_byte);
    low_byte =(uint8)( pata_data&0xff);
    EepromWriteByte( address+1, low_byte);
}

⌨️ 快捷键说明

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