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

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

        基于51單片機之LCD1602實驗例程

        作者:未知   來源:CaKen的空間   點擊數:  更新時間:2014年08月17日   【字體:

         **************************  Copyright(C)CaKe  *****************************************

        ========================================================================================
        ==============**文件名    : main.c              ==============
        ==============**作者      : CaKen              ==============
        ==============**版本號    : V1.0               ==============
        ==============**時間      : 2014.08.12               ==============
        ==============**功能描述  : 1602液晶屏實驗測試          ==============
        ========================================================================================
        ****************************************************************************************
         
        #include <reg52.h>
        #include <intrins.h>
        #define uchar unsigned char     //宏定義
        #define uint unsigned int     //宏定義
         
         
        uchar code Table1[]="CaKen-2245286160";
        uchar code Table2[]="                ";
         
         
        sbit  LCD1602_RS=P2^4;      //數據命令端口
        sbit  LCD1602_RW=P2^5;      //讀寫端口.我們在這里只寫
        sbit  LCD1602_EN=P2^6;      //使能端口
         
        *****************************************************************************************
        函數名:延時函數
        調  用:delayms();
        參  數:
        返回值:
        結  果:
        備  注:
        *****************************************************************************************
         
        void delayms(unsigned int ms)   
        {
              unsigned int i , j;          
            for(i = 0; i < ms; i++)
                 for(j = 0; j < 110; j++);
        }
         
         
        *****************************************************************************************
        函數名:寫指令
        調  用:Write_com();
        參  數:
        返回值:
        結  果:
        備  注:
        *****************************************************************************************
        void Write_com(uchar com)
         {
           LCD1602_RS=0;               //寫指令時RS=L
           LCD1602_EN=0;              
           P0=com;              //給端口送指令
           delayms(5);                 
           LCD1602_EN=1;               //使能端高電平有效  
           delayms(5);      
           LCD1602_EN=0;     
         }
         
        *****************************************************************************************
        函數名:寫數據
        調  用:Write_Date();
        參  數:
        返回值:
        結  果:
        備  注:
        *****************************************************************************************
         void Write_Date(uchar Date)
         {
           LCD1602_RS=1;                //寫數據時RS=L
           LCD1602_EN=0;                
           P0=Date;            //給端口送數據
           delayms(5);                   
           LCD1602_EN=1;                //使能端高電平有效  
           delayms(5);
           LCD1602_EN=0;    
         }
         
        *****************************************************************************************
        函數名:LCD1602初始化
        調  用:LCD1602_Init();
        參  數:
        返回值:
        結  果:
        備  注:
        *****************************************************************************************
        void LCD1602_Init()
         {
           unsigned char num; 
           LCD1602_RW=0;                 //寫信號拉低
           LCD1602_EN=0;                 //使能端拉低
           Write_com(0x38);           //開顯示
           Write_com(0x0c);              //開顯示不顯示光標
           Write_com(0x06);              //每寫一個地址和光標加一 
           Write_com(0x01);           //顯示清零
         
           Write_com(0x80);              //第一行的初始地址為0x80
           for(num=0;num<16;num++)       //循環的數字要看上面的占多少個字符
             {
               Write_Date(Table1[num]);  //多了和少了都不會對的。
            delayms(5);
             }
         
             Write_com(0x80+0x40);       //第二行初始地址為0x80+0x40
             for(num=0;num<16;num++)
              {
                 Write_Date(Table2[num]);
              delayms(5);
              }
         }
        *****************************************************************************************
        函數名:主函數
        調  用:
        參  數:
        返回值:
        結  果:
        備  注:
        ***************************************************************************************** 
        void main(void)
        {  
             unsigned char n;
             LCD1602_Init();
         
           while(1)
         {
              Write_com (0x80+0x40+6);   //第二行第六個格開始顯示
           Write_Date(0x30+n/100);    delayms(5);
           Write_Date(0x30+n0/10); delayms(5);
           Write_Date(0x30+n);     delayms(5);
             delayms(100);
         }      
        }
         
         
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        下面是一個提高版的程序:
         
        **************************  Copyright(C) CaKe  ****************************************
        ========================================================================================
        ==============**文件名    : main.c              ==============
        ==============**作者      : CaKen              ==============
        ==============**版本號    : V1.0               ==============
        ==============**時間      : 2014.08.17               ==============
        ==============**功能描述  : LCD1602實驗測試          ==============
        ========================================================================================
        ****************************************************************************************

        #include <reg52.h>     //包含單片機寄存器的頭文件
        #include <intrins.h>   //包含_nop_()函數定義的頭文件

        sbit RS=P2^0;            //寄存器選擇位,將RS位定義為P2.0引腳
        sbit RW=P2^1;            //讀寫選擇位,將RW位定義為P2.1引腳
        sbit EN=P2^2;            //使能信號位,將E位定義為P2.2引腳

        sbit BF=P0^7;            //忙碌標志位,,將BF位定義為P0.7引腳

        unsigned char code string[ ]= {"abcdefghihklabc"};
        unsigned char code string1[ ]={"QUICK STUDY MCU"};
        unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定義字符℃
         

        void delay1ms()
        {
             unsigned char i,j; 
           for(i=0;i<10;i++)
            for(j=0;j<33;j++);  
         }

         void delay(unsigned int n)
         {
            unsigned int i;
         for(i=0;i
         delay1ms();
         }

         bit BusyTest(void)
          {
             bit result;
          RS=0;         //根據規定,RS為低電平,RW為高電平時,可以讀狀態
             RW=1;
             EN=1;          //E=1,才允許讀寫
             _nop_();      //空操作
             _nop_();
             _nop_();
             _nop_();      //空操作四個機器周期,給硬件反應時間 
             result=BF;    //將忙碌標志電平賦給result
          EN=0;
             return result;
          }

        void Write_com (unsigned char dictate)
        {  
            while(BusyTest()==1);    //如果忙就等待
          RS=0;                   //根據規定,RS和R/W同時為低電平時,可以寫入指令
          RW=0;  
          EN=0;                    //E置低電平(寫指令時,
                                     // 就是讓E從0到1發生正跳變,所以應先置"0"
          _nop_();
          _nop_();                //空操作兩個機器周期,給硬件反應時間
          P0=dictate;             //將數據送入P0口,即寫入指令或地址
          _nop_();
          _nop_();
          _nop_();
          _nop_();                //空操作四個機器周期,給硬件反應時間
          EN=1;                    //E置高電平
          _nop_();
          _nop_();
          _nop_();
          _nop_();                //空操作四個機器周期,給硬件反應時間
          EN=0;                   //當E由高電平跳變成低電平時,液晶模塊開始執行命令
         }

         void WriteAddress(unsigned char x)
         {
             Write_com(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x" 
         }

         void WriteData(unsigned char y)
         {
            while(BusyTest()==1); 
           RS=1;              //RS為高電平,RW為低電平時,可以寫入數據
           RW=0;
           EN=0;               //E置低電平(寫指令時,,
                                 // 就是讓E從0到1發生正跳變,所以應先置"0"
           P0=y;              //將數據送入P0口,即將數據寫入液晶模塊
           _nop_();
           _nop_();
            _nop_();
              _nop_();           //空操作四個機器周期,給硬件反應時間
           EN=1;               //E置高電平
           _nop_();
           _nop_();
           _nop_();
           _nop_();           //空操作四個機器周期,給硬件反應時間
           EN=0;               //當E由高電平跳變成低電平時,液晶模塊開始執行命令
         }

        void LCD1602_Init(void)
        {
            delay(15);             //延時15ms,首次寫指令時應給LCD一段較長的反應時間
            Write_com(0x38);       //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
         delay(5);
         Write_com(0x38);
         delay(5);      //延時5ms
         Write_com(0x38);       //3次寫 設置模式
         delay(5);
         Write_com(0x0F);       //顯示模式設置:顯示開,有光標,光標閃爍
         delay(5);
         Write_com(0x06);       //顯示模式設置:光標右移,字符不移
         delay(5);            
         Write_com(0x01);       //清屏幕指令,將以前的顯示內容清除
         delay(5);
         }


        void main(void)           
         {
          unsigned char i=0,j;
          LCD1602_Init();                       //調用LCD初始化函數 
          delay(10);
          while(1)
            {


           Write_com(0x01);                   //清顯示:清屏幕指令
           delay(5);
           WriteAddress(0x00);                // 設置顯示位置為第一行的第1個字
           delay(5);

           while(string[i] != '\0')           //'\0'是數組結束標志
           {                 // 顯示字符 abcdefghihklabc
            WriteData(string[i]);
            i++;
            delay(100);
           }

            WriteAddress(0x40);         // 設置顯示位置為第二行的第1個字
                 i = 0;
            while(string[i] != '\0')          //'\0'是數組結束標志
             {               // 顯示字符 QUICK STUDY MCU
           WriteData(string1[i]);
           i++;
           delay(100);
          } 
             //while(1);

         

          delay(1000); 
                                //右側移位進來
          Write_com(0x01);               //清顯示:清屏幕指令
          delay(5);
          WriteAddress(0x10);            // 設置顯示位置為第一行的第1個字
          delay(5);
            i = 0;
          while(string[i] != '\0')       //'\0'是數組結束標志
           {             // 顯示字符  abcdefghihklabc
           WriteData(string[i]);
           i++; 
           }
           
           WriteAddress(0x50);        // 設置顯示位置為第二行的第1個字
                 i = 0;
          while(string[i] != '\0')       //'\0'是數組結束標志
            {             // 顯示字符 QUICK STUDY MCU
           WriteData(string1[i]);
           i++;
            }
           
          for(j=0;j<16;j++ )
            {
            Write_com(0x18);         //左移指令
            for(i=0;i<10;i++)
                  delay(30);   
            }    
           //while(1);

         

                 delay(1000);
           Write_com(0x08);          //關閉顯示
           //while(1);    
                 delay(3000);           //延時  維持顯示一段時間
           Write_com(0x0c);          //開顯示   
               //while(1);
                 delay(3000);              //延時  維持顯示一段時間


           Write_com(0x0f);       //開光標
           // while(1);
                 delay(1000);           //延時  維持顯示一段時間

           for(j=0;j<16;j++ )
           {
            Write_com(0x1c);      //右移 移出
            for(i=0;i<10;i++)
                  delay(30);      
           }
           //while(1);


               Write_com(0x40);          //設定CGRAM地址
           delay(5);
           for(j=0;j<8;j++ )
           {
            WriteData(User[j]);  //寫入自定義圖形 ℃
           }
              WriteAddress(0x05);      //設定屏幕上的顯示位置
            delay(5);
              WriteData(0x00);      //從CGRAM里取出自定義圖形顯示
              while(1); 
          }    
        }
         
         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮