• 專注電子技術學習與研究
    當前位置:單片機教程網 >> 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); //自定義字符使用 
     
    }
     
    第二段程序為借用別人的,呵呵

     

     

     

    關閉窗口
    亚洲一区二区制服在线|在绩专区欧美自拍日韩|青春娱乐网97超碰人人射|在线观看国产网址你懂的