definition.h
#ifndef _DEFINITION_H_
#define _DEFINITION_H_
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#endif
24C02读写模块程序.h
#ifndef _24C02_H_
#define _24C02_H_
#include <reg52.h>
#include "definition.h"
//*************************引脚定义
sbit SCL=P1^6;//时钟线
sbit SDA=P1^7;//数据线
//*************************us延时
void delay_5us(uchar x);
//*************************总线初始化
void Init_24C02();
//*************************启动信号
void Start_24C02();
//*************************应答信号
void Response_24C02();
//**************************停止信号
void Stop_24C02();
//***************************写数据
void Write_Byte_24C02(uchar ddata);
//****************************读数据
uchar Read_Byte_24C02();
//*****************************在任何一个地址写一个数据
void WriteOneByte_24C02(uchar address,uchar ddata);
//*****************************在任何一个地址读取一个数据
uchar ReadOneByte_24C02(uchar address);
#endif
24C02读写模块程序.c
#include "24C02读写模块程序.h"
/******延时5us***********/
void delay_5us(uchar x)//5微妙
{
uchar i;
for(i=x;i>0;i--)
{
; ;
}
}
/********初始化函数********/
void Init_24C02()
{
SDA=1;//时钟线和数据线都置1
SCL=1;
}
/*******开始信号函数******/
void Start_24C02()
{
SDA=1;//数据线送高电平
delay_5us(1);//执行时间
SCL=1;//时钟线送高电平
delay_5us(1);
SDA=0; //数据线送低电平,在时钟线为高电平的时候产生一个下降沿作为开始信号S。
delay_5us(1);
}
/*******停止信号函数*******/
void Stop_24C02()
{
SDA=0;//先写SDA,再写SCL是为了防止SDA=1带来的干扰
delay_5us(1);
SCL=1;//时钟信号送高电平
delay_5us(1);
SDA=1;//数据信号送高电平,在时钟信号为高电平的时候产生一个上升沿作为停止信号P。
delay_5us(1);
}
/********应答信号函数*******/
void Response_24C02()
{
uchar i;
SCL=1;//时钟线送高电平
delay_5us(1);
while((SDA==1)&&(i<200))i++;//判断数据线时候存在应答信号"0",并等待一段时间。
SCL=0;//时钟线送低电平,允许数据线数据变化。
delay_5us(1);
}
/********写数据函数*********/
void Write_Byte_24C02(uchar ddata)
{
uchar i;
SCL=0;//时钟线置0,此时数据线允许变化
delay_5us(1);
for(i=0;i<8;i++)
{
ddata=ddata<<1;//将数据左移1位,最高位被移到CY
SDA=CY;//将1位数据送到数据线上。
delay_5us(1);
SCL=1;//时钟线置1,数据被写进EEPRM。
delay_5us(1);
SCL=0;//时钟线置0,数据线上的数据允许变化。
delay_5us(1);
}
SDA=1;//完成一个字节的数据写入之后,释放数据线,用来读取应答信号。
delay_5us(1);
}
/**********读数据函数***********/
uchar Read_Byte_24C02()
{
uchar i,j,k;
SCL=0;//时钟线置0,数据线信号允许变化。
delay_5us(1);
SDA=1;//数据线置1 (读数据是不会影响数据线)
delay_5us(1);
for(i=0;i<8;i++)
{
SCL=1;//时钟线置1
delay_5us(1);
j=SDA;//读取一个数据未(从高位到低位的顺序)放到j
k=(k<<1)|j;//把数据一位位地移到K中。
SCL=0;//时钟线置0,允许数据线变化。
delay_5us(1);
}
return k;//返回读取到的数据
}
/*******在任何一个地址写一个数据*************/
void WriteOneByte_24C02(uchar address,uchar ddata)
{
Start_24C02();//开始信号
Write_Byte_24C02(0xa0);//写硬件地址(地址的最后一位是0就为写数据,是1为读数据)
Response_24C02();//等待应答
Write_Byte_24C02(address);//写EEPROM的开始地址
Response_24C02();
Write_Byte_24C02(ddata);//写数据
Response_24C02();
Stop_24C02();//写数据完毕,停止写数据。
delay_5us(200);//等待一段时间(必要的!),因硬件反应比较迟钝
}
/*******在任何一个地址读取一个数据*************/
uchar ReadOneByte_24C02(uchar address)
{
uchar ddata;
Start_24C02();//开始信号
Write_Byte_24C02(0xa0);//写硬件地址,当硬件地址改变时需改此值
Response_24C02();
Write_Byte_24C02(address);//写EEPROM地址
Response_24C02();
Start_24C02();//开始信号
Write_Byte_24C02(0xa1);//写硬件地址(读数据)
Response_24C02();
ddata=Read_Byte_24C02();//把函数返回的值赋值给dat
Stop_24C02();//停止信号
return ddata;
}
LCD1602display.h
#ifndef _LCD1602DISPLAY_H_
#define _LCD1602DISPLAY_H_
#include <reg52.h>
#include <intrins.h>
#include "definition.h"
//************************LCD引脚定义
sbit LCM_RS=P2^5;
sbit LCM_RW=P2^6;
sbit LCM_E=P2^7;
//**************************延时
void delay();
//**************************初始化
void InitLCM();
//****************************读状态
uchar ReadStatusLCM();
//******************************读数据
uchar ResdDataLCM();
//***************************写指令
void WriteCommandLCM(uchar WCLCM, Busy);
//***************************写数据
void WriteDataLCM(uchar WDLCM);
//******************************显示1个字符
void DisplayOneChar(uchar X,uchar Y,uchar DData);
//******************************显示字符串
void DisplayListChar(uchar X,uchar Y,uchar code *DData);
#endif
LCD1602display.c
#include "LCD1602display.h"
//********************延时
void delay(uchar z)
{
uchar i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
//**********************LCM初始化
void InitLCM()
{
WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号
delay(1);
WriteCommandLCM(0x38,0);
delay(1);
WriteCommandLCM(0x38,0);
delay(1);
WriteCommandLCM(0x38,1);//显示模式设置:16×2显示,5×7点阵,8位数据接口
WriteCommandLCM(0x0c,1);//显示模式设置:显示开,无光标
WriteCommandLCM(0x06,1);//显示模式设置:光标右移,字符不移
WriteCommandLCM(0x01,1);//清屏幕指令,将以前的显示内容清除
}
//*********************读状态
uchar ReadStatusLCM()
{
P0 = 0x80;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 1;
while (P0 & 0x80); //检测忙信号
return(0);
}
//***********************读数据
/*uchar ResdDataLCM()
{
LCM_RS=1;
LCM_RW=1;
LCM_E=1;
} */
//**********************写指令
void WriteCommandLCM(uchar WCLCM, Busy)
{
if(Busy) ReadStatusLCM();
P0=WCLCM;
LCM_RS=0;
LCM_RW=0;
LCM_E=0;
LCM_E=1;
}
//***********************写数据
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM();
P0=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_E=0;
LCM_E=1;
}
//*************************显示字符
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
if(Y) X|=0X40;//Y=1显示第二行,Y=0显示第一行
X|=0X80;
WriteCommandLCM(X,1);//X用来选择哪一位,1是用来忙检测
WriteDataLCM(DData);//DData用来写数据
}
//**************************显示字符串
/*void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength;
ListLength=0;
while(DData[ListLength]!='\0')
{
if(X<=15)
{
DisplayOneChar( X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
}*/
main.c
#include <reg52.h>
#include "LCD1602display.h"
#include "24C02读写模块程序.h"
uchar table[]="0123456789";
void main()
{
uchar Readdata,ge,shi,bai;
InitLCM();
Init_24C02();
while(1)
{
WriteOneByte_24C02(3,123);
Readdata=ReadOneByte_24C02(3);
/*****提取个位、十位、百位*****/
ge=Readdata%10;
shi=Readdata%100/10;
bai=Readdata/100;
/*******调用LCM显示程序*******/
DisplayOneChar(0,0,table[bai]);
DisplayOneChar(1,0,table[shi]);
DisplayOneChar(2,0,table[ge]);
}
}