📄 fm24c04.c
字号:
//=============================
#include"REG51STC.H"
#include "CMD16887.H"
#include<intrins.h>
#include "externxy.h"
#define uchar unsigned char
#define uint unsigned int
#define IIC_READ 0xa1 //定义读指令
#define IIC_WRITE 0xa0 //定义写指令
#define NOP _nop_()
//========================================
//功能:ROUTES TO PROVIDE A START SIGNAL
//*****************************************
void start(void)
{
SCL=0;SDA=1;SCL=1;SDA=0;SCL=0;
}
//=======================================
//功能:ROUTES TO PROVIDE A STOP SIGNAL
//***************************************
void stop(void)
{
SCL=0;SDA=0;SCL=1;SDA=1;SCL=0;
}
//=====================================
//功能:ROUTES TO PROVIDE ACK SINGAL
//*************************************
void ack(void)
{
SCL=0;SDA=0;SCL=1;SCL=0;
}
//======================================================
//功能:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
// OR TO PROVIDE A NO_ACK SIGNAL
//type=1等待应答信号
//type=0 产生无应答信号
//*******************************************************
void nack(uchar type)
{
SCL=0;SDA=1;SCL=1;IFACK=SDA; SCL=0;
if(type)
{
if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
{
NO_ACK=1;//用户可以加入自己的异常处理程序
//while(1);
}
else NO_ACK=0;
}
}
//=======================================================
//功能:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
//*******************************************************
uchar inbyte(void) //从IIC器件中读出数据
{
SDA=1;
SCL=1;a7=SDA;SCL=0;
SCL=1;a6=SDA;SCL=0;
SCL=1;a5=SDA;SCL=0;
SCL=1;a4=SDA;SCL=0;
SCL=1;a3=SDA;SCL=0;
SCL=1;a2=SDA;SCL=0;
SCL=1;a1=SDA;SCL=0;
SCL=1;a0=SDA;SCL=0;
return(bbyte);
}
//=======================================================
//功能:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
//*******************************************************
void outbyte(uchar outdata) //将数据写入IIC器件
{
bbyte=outdata;
SDA=a7;SCL=1;SCL=0;
SDA=a6;SCL=1;SCL=0;
SDA=a5;SCL=1;SCL=0;
SDA=a4;SCL=1;SCL=0;
SDA=a3;SCL=1;SCL=0;
SDA=a2;SCL=1;SCL=0;
SDA=a1;SCL=1;SCL=0;
SDA=a0;SCL=1;SCL=0;
}
//******************************************************************
//功能:写EEPROM 1BYTE
//******************************************************************
void writebyte(uint add,uchar wbyte) //add为写入地址,wbyte为写入数据
{
uchar temph,templ;
temph=(uchar)(add/256*2+0xa0);
templ=(uchar)(add%256);
start(); //开始信号
//outbyte(IIC_WRITE); //写命令
//nack(1); //等待应答
outbyte(temph); //写地址
nack(1); //等待应答
outbyte(templ); //写地址
nack(1);
outbyte(wbyte); //写数据
nack(1); //等待应答
stop(); //停止信号
}
//=====================================================
// 功能:读EEPROM 1BYTE
//*****************************************************
uchar readbyte (uint add) //add为读地址
{
uchar temp,temph,templ;
temph=(uchar)(add/256*2+0xa0);
templ=(uchar)(add%256);
start(); //开始信号
//outbyte(IIC_WRITE); //写命令
//nack(1); //等待应答
outbyte(temph); //写地址
nack(1); //等待应答
outbyte(templ); //写地址
nack(1);
start(); //开始信号
//outbyte(IIC_READ); //读命令
//nack(1); //等待应答
outbyte(temph+1); //写地址
nack(1); //等待应答
temp=inbyte(); //读数据
nack(0); //无应答
stop(); //停止信号
return(temp);
}
//=================================================
// 功能:连写函数
//add为读入EEPROM起始地址,ptr保存数据指针,writelen为写入数据长度
void writebyteseq(uint add,uchar *ptr,uint writelen)
{
//uchar temp;
uchar temph,templ;
uint i;
temph=(uchar)(add/256*2+0xa0);
templ=(uchar)(add%256);
start();
//outbyte(IIC_WRITE);
//nack(1);
outbyte(temph);
nack(1);
outbyte(templ);
nack(1);
for(i=0;i<writelen;i++)
{
outbyte(*(ptr+i));
nack(1);
}
stop();
}
/*******************************************************
* 功能:连读函数--read
*add为读EEPROM起始地址,ptr读出数据指针,readlen为读出数据长度
********************************************************/
void readbyteseq(uint add,uchar *ptr,uint readlen)
{
uchar temph,templ;
uint i;
temph=(uchar)(add/256*2+0xa0);
templ=(uchar)(add%256);
start();
//outbyte(IIC_WRITE);
//nack(1);
outbyte(temph);
nack(1);
outbyte(templ);
nack(1);
start();
//outbyte(IIC_READ);
//nack(1);
outbyte(temph+1);
nack(1);
for(i=0;i<readlen-1;i++)
{
*(ptr+i)=inbyte();
ack();
}
*(ptr+readlen-1)=inbyte();
nack(0);
stop();
}
/********************************************************
* 功能:EEPROM初始化程序
*********************************************************/
void eeprom_ipl(void)
{ uint i;
void *ptr;
//-----------------------------------
for(i=0;i<512;i++)
{
writebyte(i,0x00);
}
clear_worka();
clear_workb();
//----------------------------
price_a=price_b=888;//单价
residue_a=residue_b=30; //提前量
close_num_a=close_num_b=0; //提前关机量
increment_a=increment_b=23; //增量
printermode_a=printermode_b=1; //打印机模式--手动
pirnt_select_a=0;pirnt_select_b=1; //选择打印机
oil_types_a=oil_types_b=0; //油品类别
gunadd_a=1;gunadd_b=2; //枪中控号
decimal_a=2;decimal_b=2; //小数点
invoice_number=0; //发票编号
backup_sysdata(); //系统参数备份
//----------------------------------
ration_num_b=0x00; //锁机密码a
ptr=&ration_num_b;
writebyteseq(PASSSTARTADD,ptr,4);
ptr=&ration_num_b; //锁机密码b
writebyteseq(PASSSTARTADD+4,ptr,4);
//-----------------
ptr=&invoice_number;
writebyteseq(506,ptr,4);
updatea=1;
updateb=1;
accumulative_total_list_a(); //累计转换至列表a
accumulative_total_list_b(); //累计转换至列表b
}
//=======================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -