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

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

        LCD1602液晶顯示帶漢字的萬年歷程序(51單片機)

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年10月24日   【字體:

        #include "reg51.h"
        #define uint unsigned int
        #define uchar unsigned char
        #define port P0
        uchar table[]="I love you!";
        uchar table1[]="Shang Hong Rui!";
        uchar table2[]="LI ZHEN WEI!" ; 
        uchar table3[]="> > > > > > > > "; 
        uchar num;
        sbit rs=P2^0;
        sbit rw=P2^1;
        sbit e=P2^2;
        /********************************************
           1ms 為基本單位的延時函數
        ********************************************/
        void delay(uint z)
        {
          uint x,y;
          for(x=z;x>0;x--)
            for(y=110;y>0;y--);
        }
        /********************************************
           讀取lcd1602狀態
        ********************************************/
        read()
        {
          uchar temp ;
          port=0xff;
          rs=0;
          rw=1;
          e=1;
          temp=port;
          e=0;
          return temp;
        }
        /********************************************
           檢測lcd是否忙碌         小卒整天沒事
        ********************************************/
        void busy()
        {
          uchar temp;
          do
            {
           temp=read();
         }
           
          while((temp&0x80)==0x80);
        }
        /********************************************
           向 lcd 里寫命令
        ********************************************/
        void write_com(uchar com)
        {
          busy();
          //delay(2);
          port=com;
          //busy();
          rs=0;
          rw=0;
          e=1;
          e=0;
        }/********************************************
           向 lcd 里寫數據
        ********************************************/
        void write_data(uchar dat)
        {
          busy();
          //delay(2);
          port=dat;
          //busy();
          rs=1;
          rw=0;
          e=1;
          e=0;
        }
        /********************************************
           初始化lcd
        ********************************************/
        void init()
        {
         write_com(0x06) ;//顯示地址遞增,即寫一個數據后,顯示位置右移一位
         write_com(0x0e) ;//開顯示,有光標,光標不閃
         write_com(0x38) ;//8位數據,雙列,5*7字形
         write_com(0x01) ;//清屏
        }
        /**********************************************
           主程序 實現顯示
        ***********************************************/
        main()
        {
         init();
         write_com(0x80+0x02);
         for(num=0;num<11;num++)
         {
            write_data(table[num]);
         delay(150);
         }
         //busy();
         write_com(0x80+0x40);
         for(num=0;num<15;num++)
         {
            write_data(table1[num]);
         delay(150);
         }
         write_com(0x01); //清屏
         write_com(0x80+0x15);
         for(num=0;num<12;num++)
         {
            write_data(table2[num]);
         delay(5);
         }
         for(num=0;num<20;num++)
         {
            //write_com(0x1c) ; //顯示地址遞增,即寫一個數據后,顯示位置右移一位 整屏向左移動
         write_com(0x18) ; //顯示地址遞增,即寫一個數據后,顯示位置右移一位 整屏向右移動
         delay(120);
         }
         //busy();
         delay(50);
         write_com(0x01); //清屏     
         write_com(0x80+0x54);
         for(num=0;num<16;num++)
         {
            write_data(table3[num]);
         delay(5);
         }
         
         for(num=0;num<20;num++)
         {
            //write_com(0x1c) ; //顯示地址遞增,即寫一個數據后,顯示位置右移一位 整屏向左移動
         write_com(0x18) ; //顯示地址遞增,即寫一個數據后,顯示位置右移一位 整屏向右移動
         delay(120);
         }
         delay(50);
         write_com(0x01); //清屏
         write_com(0x80+0x15);
         for(num=0;num<12;num++)
         {
            write_data(table2[num]);
         delay(5);
         }
         write_com(0x80+0x54);
         for(num=0;num<16;num++)
         {
            write_data(table3[num]);
         delay(5);
         }
         
         for(num=0;num<19;num++)
         {
            write_com(0x1c) ; //顯示地址遞增,即寫一個數據后,顯示位置右移一位 整屏向左移動
         //write_com(0x18) ; //顯示地址遞增,即寫一個數據后,顯示位置右移一位 整屏向右移動
         delay(120);
         }
          while(1);
        }
         
        /*0000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000*/
        #include "reg51.h"
        #define uchar unsigned char
        #define uint unsigend int
        #define port P0
        uchar table[]="0123456789";
        uchar miaog=0,miaos=1,feng=1,fens=1,shig=1,shis=1;
        sbit rs=P2^0;
        sbit rw=P2^1;
        sbit e=P2^2;
        /***********************************
          ***00000  5*7  -> 0xff
          *****0** /5*8     0x40
          *****0**    0x40  ----> I
          *****0**    0x40  ---->
          *****0**    0x40
          *****0**    0x40
          ***00000    0x1f
          添加自己的自定義字符
        ***********************************/
        code uchar ziku[]=
        {
        0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //漢字“日”
        0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //漢字“月”
        0x01,0x02,0x03,0x05,0x09,0x03,0x00,0x00, //漢字“年”左半部
        0x00,0x00,0x1e,0x08,0x08,0x1e,0x08,0x08  //漢字“年”右半部
        };
        /*******************************
           讀取lcd1602狀態  
        *******************************/
        uchar lcd_readcom()
        {
          uchar temp;
          e=0;
          port=0xff;
          rs=0;
          rw=1;
          e=1;
          temp=port;
          e=0;
          return temp;
        }
        /***************************************
           檢測 lcd 是否忙碌         小卒整天沒事
        ***************************************/
        check_busy()
        {
           uchar temp;
           do{
           temp=lcd_readcom();
             }while((temp&0x80)==0x80);
        }
        /*****************************************
              向lcd里寫命令
        *****************************************/
        void lcd_writecom(uchar dat)
        {
        check_busy();
         e=0;
        port=dat;
         rs=0;
         rw=0;
         e=1;
         e=0;
        }
        /***************************************
           讀取lcd對應地址數據
        *****************************************/
        uchar lcd_readdat()
        {
          uchar temp;
          check_busy();
          e=0;
          port=0xff;
          rs=1;
          rw=1;
          e=1;
          temp=port;
          e=0;
          return temp;
        }
        /****************************************
               向lcd里寫數據
        ****************************************/
        void lcd_writedat(uchar dat)
        {
        check_busy();
         e=0;
        port=dat;
         rs=1;
         rw=0;
         e=1;
         e=0;
        }
        /****************************************
             向lcd寫字符串
        *****************************************/
        void lcd_gets(char *dat)
        {
         while(*dat!=0)
         {
         
         lcd_writedat(*dat);
         dat++;
         }
        }
        /*****************************************
              確定要寫的位子即x y 坐標
        ******************************************/
        void lcd_xy(uchar x,uchar y)
        {
         switch(y)
         {
          case 0:lcd_writecom(0x80+x);break;//第一行第X個位置
          case 1:lcd_writecom(0xc0+x);break;//0xc0==0x80+0x50 第二行第X個位置
          case 2:lcd_writecom(0x94+x);break;//
          case 3:lcd_writecom(0xd4+x);break;//4*20
         }
        }
        /****************************************************
         單行顯示才有5*10  其他5*8 MODE=1 5*8  MODE=0 5*10
        ****************************************************/
        add_custom_word(uchar *dat,uchar len,uchar mode)
         {
          uchar n,m;
          for(n=0;n<len;n++)
            {
          if(mode)
          {
           lcd_writecom(0x40+8*n);
            for(m=0;m<8;m++)
               {
            lcd_writedat(*dat);
             dat++;
            }
           }
           else
            {
            lcd_writecom(0x40+10*n);
            for(m=0;m<10;m++)
               {
            lcd_writedat(*dat);
             dat++;
            }
           }
         }
         }
        /********************************************
           初始化lcd
        ********************************************/
        void lcd_init()
        {
         lcd_writecom(0x01) ;//清屏
         lcd_writecom(0x03) ;
         lcd_writecom(0x3c) ;
         lcd_writecom(0x40) ;
         lcd_writecom(0x0c) ;
          add_custom_word(ziku,4,1); //初始化自定義字符
        }
        /********************************************
           1ms 為基本單位的延時函數
        ********************************************/
        void delay(uchar z)
        {
          uchar x,y,a;
          for(x=z;x>0;x--)
            for(y=110;y>0;y--)
           for(a=1;a>0;a--) ;
        }
        /**********************************************
           主程序 實現顯示
        ***********************************************/
        main()
        {
         lcd_init();
         
         //lcd_xy(0,0);
         //lcd_gets("  I LOVE YOU");
         //lcd_xy(0,1);
         //lcd_gets("Shang Hong Rui");
         lcd_xy(2,0) ;
         lcd_gets("2011");
         lcd_xy(6,0) ;
         lcd_writedat(2);
         lcd_xy(7,0);
         lcd_writedat(3);
         lcd_xy(8,0) ;
         lcd_gets("03");
         lcd_xy(10,0);
         lcd_writedat(1);
         lcd_xy(11,0) ;
         lcd_gets("06");
         lcd_xy(13,0);
         lcd_writedat(0);
         
         lcd_xy(3,1) ;
         lcd_gets("0");
         lcd_xy(4,1) ;
         lcd_gets("0");
         lcd_xy(5,1) ;
         lcd_gets(":");
         lcd_xy(6,1) ;
         lcd_gets("0");
         lcd_xy(7,1) ;
         lcd_gets("0");
         lcd_xy(8,1) ;
         lcd_gets(":");
         lcd_xy(9,1) ;
         lcd_gets("0");
         lcd_xy(10,1) ;
         lcd_gets("0");
         while(1)
         {
         
          //for(m=0;m<10;m++)
          lcd_xy(10,1);
          lcd_writedat(table[miaog]); //秒個位
          delay(1000);
          miaog++;
         
          if(miaog==10)
          {
            miaog=0;
         lcd_xy(9,1);
            lcd_writedat(table[miaos]);  //秒十位
         miaos++;
         if(miaos==6)
         {                     
          
           miaos=0;
           lcd_xy(7,1);
           lcd_writedat(table[feng]); //分個位
           feng++;
           if(feng==10)
            {
              feng=0;
           lcd_xy(6,1);
           lcd_writedat(table[fens]);  //分十位
           fens++;
           if(fens==6)
            {
             fens=0;
           lcd_xy(4,1);
           lcd_writedat(table[shig]);  //時個位
           shig++;
           if(shig==10)
            {
              shig=0;
              lcd_xy(3,1);
              lcd_writedat(table[shis]); //時十位
              shis++;
              if(shis==6)
               {
              shis=0;
            }
            
            }
            }
            }
         }
          }
        }
         
         //lcd_xy(0,0);
         //lcd_writedat(0);//自定義字符使用,0表示第一個字 ,1表示第二個字,依此類推
         //lcd_xy(15,0);
         //lcd_writedat(3); //自定義字符使用 
         
        }
         
        第二段程序為借用別人的,呵呵

         

         

         

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