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

📄 fm24c04.c

📁 HT1621液晶控制测试
💻 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 + -