分享

LCD1602模版+24C02模版+main(附波形图)(C51)

 快乐读书法 2015-11-16









 

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多