久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

作者:佚名   來源:本站原創   點擊數:  更新時間: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;  //數據線

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

關閉窗口
主站蜘蛛池模板: 欧美v日韩v | 欧美成人免费电影 | 亚洲一二三区免费 | 国产精品久久久久久婷婷天堂 | 日韩精品一区二区三区中文在线 | 亚洲精品亚洲人成人网 | 久久91av| 在线免费观看毛片 | japanhdxxxx裸体 | 欧美五月婷婷 | 成人免费观看网站 | 国产伊人久久久 | 北条麻妃99精品青青久久 | 日本综合在线观看 | 日韩欧美一区在线 | 婷婷色在线 | 在线观看免费av网 | 国产第二页 | 福利一区二区在线 | 国产成人自拍一区 | 亚洲一区二区三区在线视频 | 日韩美女在线看免费观看 | 精品国产第一区二区三区 | 精品一区二区三区在线观看 | 男人天堂午夜 | 黄色一级电影免费观看 | 日本一区不卡 | 色婷婷精品久久二区二区蜜臂av | 一区二区三区av夏目彩春 | 91久久久久久 | 综合九九 | 亚洲精品一区二区在线观看 | 一级高清 | 亚洲视频中文字幕 | 国产一区| 81精品国产乱码久久久久久 | 久久久精品一区二区三区 | 国产一级在线观看 | 欧美日韩视频在线播放 | 欧美黑人激情 | 亚洲精品一区二区三区蜜桃久 |