<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> 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]);
         }
        }

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮