專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

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

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月10日   【字體:









 

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;  //數(shù)據(jù)線

//*************************us延時
void delay_5us(uchar x); 

//*************************總線初始化
void Init_24C02();

//*************************啟動信號
void Start_24C02();

//*************************應(yīng)答信號
void Response_24C02();

//**************************停止信號
void Stop_24C02();

//***************************寫數(shù)據(jù)
void Write_Byte_24C02(uchar ddata);

//****************************讀數(shù)據(jù)
uchar Read_Byte_24C02();

//*****************************在任何一個地址寫一個數(shù)據(jù)
void WriteOneByte_24C02(uchar address,uchar ddata);

//*****************************在任何一個地址讀取一個數(shù)據(jù)
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--)
  {
     ;  ;
  }
}

/********初始化函數(shù)********/
void Init_24C02()
{
 SDA=1;//時鐘線和數(shù)據(jù)線都置1
   SCL=1;
}

/*******開始信號函數(shù)******/
void Start_24C02()
{
    SDA=1;//數(shù)據(jù)線送高電平
    delay_5us(1);//執(zhí)行時間
    SCL=1;//時鐘線送高電平
    delay_5us(1);
    SDA=0; //數(shù)據(jù)線送低電平,在時鐘線為高電平的時候產(chǎn)生一個下降沿作為開始信號S。
    delay_5us(1);
}

/*******停止信號函數(shù)*******/
void Stop_24C02()
{
    SDA=0;//先寫SDA,再寫SCL是為了防止SDA=1帶來的干擾
 delay_5us(1);
 SCL=1;//時鐘信號送高電平
 delay_5us(1);
 SDA=1;//數(shù)據(jù)信號送高電平,在時鐘信號為高電平的時候產(chǎn)生一個上升沿作為停止信號P。
 delay_5us(1);
}

/********應(yīng)答信號函數(shù)*******/
void Response_24C02()
{
    uchar i;      
 SCL=1;//時鐘線送高電平
 delay_5us(1);
 while((SDA==1)&&(i<200))i++;//判斷數(shù)據(jù)線時候存在應(yīng)答信號"0",并等待一段時間。
 SCL=0;//時鐘線送低電平,允許數(shù)據(jù)線數(shù)據(jù)變化。
 delay_5us(1);
}

/********寫數(shù)據(jù)函數(shù)*********/
void Write_Byte_24C02(uchar ddata)
{
 uchar i;
 SCL=0;//時鐘線置0,此時數(shù)據(jù)線允許變化
 delay_5us(1);
 for(i=0;i<8;i++)
 {
  ddata=ddata<<1;//將數(shù)據(jù)左移1位,最高位被移到CY
  SDA=CY;//將1位數(shù)據(jù)送到數(shù)據(jù)線上。
  delay_5us(1);
  SCL=1;//時鐘線置1,數(shù)據(jù)被寫進EEPRM。
  delay_5us(1);
  SCL=0;//時鐘線置0,數(shù)據(jù)線上的數(shù)據(jù)允許變化。
  delay_5us(1);
 }
 SDA=1;//完成一個字節(jié)的數(shù)據(jù)寫入之后,釋放數(shù)據(jù)線,用來讀取應(yīng)答信號。
 delay_5us(1);
}

/**********讀數(shù)據(jù)函數(shù)***********/
uchar Read_Byte_24C02()
{
    uchar i,j,k;
 SCL=0;//時鐘線置0,數(shù)據(jù)線信號允許變化。
 delay_5us(1);
 SDA=1;//數(shù)據(jù)線置1 (讀數(shù)據(jù)是不會影響數(shù)據(jù)線)
 delay_5us(1);
 for(i=0;i<8;i++)
 {
  SCL=1;//時鐘線置1
  delay_5us(1);
  j=SDA;//讀取一個數(shù)據(jù)未(從高位到低位的順序)放到j(luò)
  k=(k<<1)|j;//把數(shù)據(jù)一位位地移到K中。
  SCL=0;//時鐘線置0,允許數(shù)據(jù)線變化。
  delay_5us(1);
 }
 return k;//返回讀取到的數(shù)據(jù)
}

/*******在任何一個地址寫一個數(shù)據(jù)*************/
void WriteOneByte_24C02(uchar address,uchar ddata)
{
 Start_24C02();//開始信號
 Write_Byte_24C02(0xa0);//寫硬件地址(地址的最后一位是0就為寫數(shù)據(jù),是1為讀數(shù)據(jù))
 Response_24C02();//等待應(yīng)答
 Write_Byte_24C02(address);//寫EEPROM的開始地址
 Response_24C02();
 Write_Byte_24C02(ddata);//寫數(shù)據(jù)
 Response_24C02();
 Stop_24C02();//寫數(shù)據(jù)完畢,停止寫數(shù)據(jù)。
 delay_5us(200);//等待一段時間(必要的�。�,因硬件反應(yīng)比較遲鈍
}

/*******在任何一個地址讀取一個數(shù)據(jù)*************/
uchar ReadOneByte_24C02(uchar address)
{
 uchar ddata;
 Start_24C02();//開始信號
 Write_Byte_24C02(0xa0);//寫硬件地址,當(dāng)硬件地址改變時需改此值
 Response_24C02();
 Write_Byte_24C02(address);//寫EEPROM地址
 Response_24C02();
 Start_24C02();//開始信號
 Write_Byte_24C02(0xa1);//寫硬件地址(讀數(shù)據(jù))
 Response_24C02();
 ddata=Read_Byte_24C02();//把函數(shù)返回的值賦值給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();

//****************************讀狀態(tài)
uchar ReadStatusLCM();

//******************************讀數(shù)據(jù)
uchar ResdDataLCM();

//***************************寫指令
void WriteCommandLCM(uchar WCLCM, Busy);

//***************************寫數(shù)據(jù)
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);  //三次顯示模式設(shè)置,不檢測忙信號
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);

 WriteCommandLCM(0x38,1);  //顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口
 WriteCommandLCM(0x0c,1);  //顯示模式設(shè)置:顯示開,無光標
 WriteCommandLCM(0x06,1);  //顯示模式設(shè)置:光標右移,字符不移
 WriteCommandLCM(0x01,1);  //清屏幕指令,將以前的顯示內(nèi)容清除
}

//*********************讀狀態(tài)
uchar ReadStatusLCM()
{
 P0 = 0x80;
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 1;
 while (P0 & 0x80); //檢測忙信號
 return(0);
}

//***********************讀數(shù)據(jù)
/*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;
}

//***********************寫數(shù)據(jù)
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用來寫數(shù)據(jù)
}

//**************************顯示字符串
/*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;
  /*******調(diào)用LCM顯示程序*******/
  DisplayOneChar(0,0,table[bai]);
  DisplayOneChar(1,0,table[shi]);
  DisplayOneChar(2,0,table[ge]);
 }
}

關(guān)閉窗口