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

📄 fm24c16a.c

📁 一个分选系统的软件:用SmallRtos操作系统
💻 C
字号:
#include "config.h"
bdata unsigned char aba;
sbit abita0=aba^0;sbit abita1=aba^1;sbit abita2=aba^2;sbit abita3=aba^3;
sbit abita4=aba^4;sbit abita5=aba^5;sbit abita6=aba^6;sbit abita7=aba^7;
sbit FMSCLA = P0^5;
sbit FMSDAA = P0^4;
/***************************************************/
//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_delayA(void)
{
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
//    _nop_();    _nop_();    _nop_();    _nop_();    _nop_();
}
void I_delaylA(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_startA(void)
{
    FMSCLA = HIGH;I_delaylA();
    FMSDAA = LOW;I_delayA();
    FMSCLA = LOW;I_delayA();
}
/************************************************************
*函数原型:void function I_stop(void);                      *
* 功能:    提供I2C总线工作时序中的停止位。                 *
************************************************************/
void I_stopA(void)
{
    FMSDAA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();
    FMSDAA = HIGH;I_delayA();
    FMSCLA = LOW;I_delayA();
}
/**************************************************************/
/*函数原型:void function I_init(void);                        *
* 功能:    I2C总线初始化。在MAIN()函数中应首先调用本函数,  *
*  然后再调用其它函数。                                       */
/********************************** ****************************/
void I_initA(void)
{
    FMSCLA = LOW;I_delayA();
    I_stopA();I_delayA();
}
/**********************************************************************************************************************/
/*函数原型:bit void function I_clock(void);
*  功能:    提供I2C总线的时钟信号,并返回在时钟电平为高期间FMSDAA信号线上状态。本函数可用于数据发送,也可用于数据接收。*/
/*********************************************************************************************************************/
bit I_clockA(void)
{
    bit sample;
    FMSCLA = HIGH;I_delaylA();
    sample = FMSDAA;I_delayA();
    FMSCLA = LOW;I_delayA();
    return (sample);
}
/*************************************************************************************************************/
/*函数原型:bit void function I_send(unsigned char I_data);
*  功能:    向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答则返回1(TRUE),否则返回0(FALSE)。*
/*************************************************************************************************************/
bit I_sendA(unsigned char  I_data)
{
    aba = I_data;
    FMSDAA = abita7;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = abita6;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = abita5;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = abita4;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = abita3;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = abita2;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = abita1;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = abita0;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
    FMSDAA = HIGH;I_delayA();
    return(~I_clockA());
}
/********************************************************************/
/*函数原型:unsigned char function I_receive(void);                          *
*功能:    从I2C总线接收8位数据,并将接收到8位数据作为一个字节返回,*
*不回送应答信号ACK。主函数在调用本函数之前应保证FMSDAA信号线个于浮置状 *
*态,即使8051的P1.7脚置1.                                           */
/********************************************************************/
unsigned char I_receiveA(void)
{
    FMSCLA = HIGH;I_delaylA();abita7 = FMSDAA;FMSCLA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();abita6 = FMSDAA;FMSCLA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();abita5 = FMSDAA;FMSCLA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();abita4 = FMSDAA;FMSCLA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();abita3 = FMSDAA;FMSCLA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();abita2 = FMSDAA;FMSCLA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();abita1 = FMSDAA;FMSCLA = LOW;I_delayA();
    FMSCLA = HIGH;I_delaylA();abita0 = FMSDAA;FMSCLA = LOW;I_delayA();
    return (aba);
}
/******************************************************************/
/******************************************************************/
/*函数原型:void function I_ack(void);                            *
  功能:    向I2C总线发送一个应答案信号ACK,一般用于连续数据读取时.*/
/******************************************************************/
/*void function I_Ack(void)
{
    FMSDAA = LOW;
    I_clock();
    FMSDAA = HIGH;
}  */
/****************************************************************************
*    函数原型: bit function E_address(unsigned char Address);
*    功    能: 向f24C16写入器件地址和一个指定的字节地址。
*****************************************************************************/
void E_addressA( unsigned char Device_Address,unsigned char Address )
{
    I_startA() ;
    I_sendA( Device_Address&0xfe );
    I_sendA( Address );
}
/*********************************************************************************************************
** 函数名称: EepromReadByte
** 功能描述: 从指定的地址读出一个字节数据
** 输 入:   address,bytenumber
** 输 出:   所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 EepromReadByteA (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_initA();
    E_addressA( device_address,data_address );
    I_startA();
    I_sendA(device_address);
    a = I_receiveA();
    I_stopA();
    return(a);
}
/*********************************************************************************************************
** 函数名称: EepromReadWord
** 功能描述: 从指定的地址读出一个字节数据
** 输 入:   address,bytenumber
** 输 出:   所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint16 EepromReadWordA (uint16 address)
{
    unsigned int a;
    unsigned char b,c;
    b =  EepromReadByteA(address);
    c =  EepromReadByteA(address+1);
    a=b;
    a=a<<8;
    a=a|c;
    return(a);
}
/*********************************************************************************************************
** 函数名称: EepromWriteByte
** 功能描述: 在指定的地址写入指定的字节
** 输 入:   address,temp
** 输 出:   无
** 全局变量: 
** 调用模块: SM_Send
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteByteA(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_initA();
    E_addressA( device_address,data_address );
    I_sendA(temp);
    I_stopA();
 }
/*********************************************************************************************************
** 函数名称: EepromWriteWord
** 功能描述: 在指定的地址写入指定的字节
** 输 入:   address,temp16
** 输 出:   无
** 全局变量: 
** 调用模块: SM_Send
** 注  意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteWordA(uint16 address ,uint16 pata_data)
{
    uint8 high_byte,low_byte;
    high_byte =(uint8)( pata_data>>8);
    EepromWriteByteA(address,high_byte);
    low_byte =(uint8)( pata_data&0xff);
    EepromWriteByteA( address+1, low_byte);
}

⌨️ 快捷键说明

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