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]);
}
}