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

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

        AT89C51 of 1602LCD of program

        作者:于春雨   來源:本站原創   點擊數:  更新時間:2014年03月27日   【字體:

         /*******************************************************************
         AT89C51單片機驅動128x64液晶顯示C語言
        ****************************************************************/
        #include<AT89x51.h>
        #define uchar unsigned char
        /*****************************************
        電路連接
        P1------DB0~DB7
        P2.0------RS
        P2.1------RW
        P2.2------E
        *****************************************/
        #define LCD_DB P1
        #define uchar unsigned char
        #define uint unsigned int
        sbit LCD_RS=P2^0;
        sbit LCD_RW=P2^1;
        sbit LCD_E=P2^2;
        sbit cs1=P2^6;
        sbit cs2=P2^7;
         uchar code kk[] = {
              //"陜",
              0xFE,0x82,0x1A,0xE6,0x4C,0x74,0x44,0xFF,
              0x64,0x5C,0x46,0x44,0x0F,0x00,0x01,0x08,
              0x08,0x04,0x03,0x00,0x01,0x02,0x04,0x08};
         uchar code xi[]={//"西",
              0x02,0xFA,0x0A,0x8A,0x7E,0x0A,0x0A,0xFE,
              0x8A,0x8A,0xFB,0x02,0x00,0x0F,0x05,0x04,
              0x04,0x04,0x04,0x04,0x04,0x04,0x0F,0x00};
         uchar code dian[]={//"電",
           0x00,0xFC,0x24,0x24,0x24,0xFF,0x24,0x24,
              0x24,0xFE,0x04,0x00,0x00,0x01,0x01,0x01,
              0x01,0x07,0x09,0x09,0x09,0x09,0x08,0x0E};
        uchar code zi[]={//"子",
              0x00,0x20,0x21,0x21,0x21,0x21,0xF9,0x25,
              0x23,0x21,0x30,0x20,0x00,0x00,0x00,0x04,
              0x08,0x08,0x0F,0x00,0x00,0x00,0x00,0x00};
        uchar code ke[]={//"科",
              0x8A,0x4A,0xFF,0x29,0x49,0x08,0x22,0xCC,
              0x80,0xFF,0x40,0x40,0x01,0x00,0x0F,0x00,
              0x00,0x01,0x01,0x00,0x00,0x0F,0x00,0x00};
        uchar code ji[]={//"技",
              0x48,0x48,0xFF,0x28,0x28,0x64,0xA4,0x3F,
              0xA4,0x64,0x26,0x04,0x04,0x08,0x07,0x08,
              0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x08};
        uchar code xue[]={ //"學",
              0x20,0x18,0x29,0x2E,0x28,0xA9,0xAE,0x68,
              0x2C,0x0B,0x98,0x08,0x01,0x01,0x01,0x01,
              0x05,0x09,0x0F,0x01,0x01,0x01,0x01,0x01};
        uchar code yuan[]={//"院",
              0xFE,0x02,0x1A,0xE6,0x48,0x54,0xD4,0x55,
              0xD6,0x54,0x54,0x4C,0x0F,0x01,0x02,0x09,
              0x08,0x04,0x03,0x00,0x07,0x08,0x08,0x0E};
        uchar code yu[]={//"余",
              0x20,0x50,0x48,0x54,0x52,0xF1,0x52,0xD4,
              0x48,0x50,0x60,0x20,0x08,0x04,0x02,0x05,
              0x08,0x0F,0x00,0x00,0x01,0x02,0x04,0x08};
        uchar code lao[]={//"老",
              0x10,0x14,0x14,0x94,0x94,0x5F,0x34,0x9C,
              0x94,0x12,0x18,0x10,0x02,0x02,0x01,0x00,
              0x07,0x09,0x09,0x08,0x08,0x08,0x0E,0x00};
        uchar code shi[]={//"師",
              0x00,0xFC,0x00,0xFF,0x00,0xFA,0x0A,0x0A,
              0xFE,0x0A,0x0B,0xFA,0x00,0x09,0x04,0x03,
              0x00,0x03,0x00,0x00,0x0F,0x00,0x02,0x03};
        /******定義函數****************/
        void  LCD_init(void);//聲明初始化函數
        void  LCD_write_command(uchar command);//寫指令函數
        void  LCD_write_data(uchar dat);//寫數據函數
        void  LCD_disp_char(uchar x,uchar y,uchar dat);//在某個屏幕位置上顯示一
        //個字符,X(0-16),y(1-2)
        //void  LCD_check_busy(void);//檢查忙函數。我沒用到此函數,因為通過率極低。
        void  delay(uint n);//延時函數
        //********************************
        //*******初始化函數***************
        void  LCD_init(void)
        {
        LCD_write_command(0x38);//設置8位格式,2行,5x7
        LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
        LCD_write_command(0x06);//設定輸入方式,增量不移位--------------
        LCD_write_command(0x01);//清除屏幕顯示----------------
        delay(100);//實踐證明,我的LCD1602上,用for 循環200 次就能可靠完成清屏指令。
        }
        //********************************
        //********寫指令函數***********設置先向1602寫入的數據為地址*
        void   LCD_write_command(uchar dat)
        {
        LCD_DB=dat;
        LCD_RS=0;//指令
        LCD_RW=0;//寫入
        LCD_E=1;//允許
        LCD_E=0;//產生下降沿
        delay(1);//實踐證明,我的LCD1602 上,用for 循環1 次就能完成普通寫指令。
        }
        //*******************************
        //********再寫數據函數*****向1602中寫入數據********
        void   LCD_write_data(uchar dat)
        {
            LCD_RS=1; //RS置1    (運算后P5=xxx1 xxxx,即RS=1其他位狀態不變)
            LCD_RW=0; //RW清0   (運算后P5=xx0x xxxx, 即RW=0其他位狀態不變)
            LCD_E=1; //使能E清0   (運算后P5=xxxx 0xxx, 即E=0其他位狀態不變)
            P1  =  dat;  //送數據到P2OUT準備輸出進入1602,等E下降沿來即可進入1602.
            LCD_E=1;  //使能E置1,P5OUT= xxxx xxxx+0000 1000=xxxx1xxx,E=1.
            delay(10);
            LCD_E=0; //使能E清0,這樣E從1變0,產生一個下降,寫入命令到1602。
        }

        //*******顯示一個字符函數*********
        void LCD_disp_char(uchar x,uchar y,uchar dat)
        {
         if(y>=64)
          {
          y=y-1;
          }
         LCD_write_command(0x40|y);
         delay(10);
         LCD_write_command(0xb8|x);
         LCD_write_data(dat);
        }
        //********************************
        /*******檢查忙函數*************
        voidLCD_check_busy()      
         //實踐證明,在我的LCD1602 上,檢查忙指令通
        過率極低,以至于不能正常使用LCD。因此我沒有再用檢查忙函數。而使
        do//用了延時的方法,延時還是非常好用的。我試了一下,用//
        {LCD_E=0;                     //for 循環作延時,普通指令只要1次循就可完成。清屏指令
        LCD_RS=0;                  //要用200次循環便能完成。
        LCD_RW=1;
        LCD_DB=0xff;
        LCD_E=1;
        while(LCD_DB^7==1);

        ******************************/
        //********延時函數***************
        void delay(uint n)
        { uint i;
        uchar j;
        for(i=n;i>0;i--)
        for(j=0;j<2;j++); //在這個延時循環函數中我只做了2次循環,
        } //實踐證明我的LCD1602 上普
        //通的指令只需1次循環就能可靠完成。
        //*******************************
        //*********主函數*****************
        void main(void)
        {
        while(1)
        {
         uint i;
         LCD_init();
         while(1)
         {  
            for (i=0;i<12;i++)//陜字上半部
           {
            cs1=1;
         cs2=0;
            LCD_disp_char(0,i+36+4,kk[i]);//加36是顯示起始位置左移,因為一個漢字的寬度為12
             delay(500);
          }
            for (i=12;i<24;i++)//陜字下半部
         {
            cs1=1;
         cs2=0;
            LCD_disp_char(1,i+24+4,kk[i]);
             delay(500);
          }
          for (i=0;i<12;i++)//西上
         {
            cs1=1;
         cs2=0;
            LCD_disp_char(0,i+48+4,xi[i]);
             delay(500);
          }
              for (i=12;i<24;i++)//西下
         {
            cs1=1;
         cs2=0;
            LCD_disp_char(1,i+36+4,xi[i]);
             delay(500);
          }
               for (i=0;i<12;i++)//電上
         {  
            cs1=0;
         cs2=1;  
            LCD_disp_char(0,i,~dian[i]);
             delay(500);
          }
               for (i=12;i<24;i++)//電下
         {
            cs1=0;
         cs2=1;
            LCD_disp_char(1,i-12,~dian[i]);
             delay(500);
          }
               for (i=0;i<12;i++)//子上
         {
            cs1=0;
         cs2=1;
            LCD_disp_char(0,i+12,~zi[i]);
             delay(500);
          }
          for (i=12;i<24;i++)//子下
         {
            cs1=0;
         cs2=1;
            LCD_disp_char(1,i,~zi[i]);
             delay(500);
          }
           /**************************************/
            for (i=0;i<12;i++)//ke上
         {
            
            LCD_disp_char(0,i+24,~ke[i]);
             delay(500);
          }
            for (i=12;i<24;i++)//ke下
         {
            LCD_disp_char(1,i+12,~ke[i]);
             delay(500);
          }
          for (i=0;i<12;i++)//ji上
         {
            cs1=1;
         cs2=0;
            LCD_disp_char(3,i+48+4,ji[i]);
             delay(500);
          }
              for (i=12;i<24;i++)//ji下
         {
            LCD_disp_char(4,i+36+4,ji[i]);
             delay(500);
          }
               for (i=0;i<12;i++)//xue上
         {
            cs1=0;
         cs2=1;  
            LCD_disp_char(3,i+24-24,~xue[i]);
             delay(500);
          }
               for (i=12;i<24;i++)//xue下
         {
            LCD_disp_char(4,i+12-24,~xue[i]);
             delay(500);
          }
        for (i=0;i<12;i++)//yuan上
         {
            cs1=0;
         cs2=1;
            LCD_disp_char(3,i+36-24,yuan[i]);
             delay(500);
          }
          for (i=12;i<24;i++)//下
         {
            LCD_disp_char(4,i+24-24,yuan[i]);
             delay(500);
          }
        for (i=0;i<12;i++)//yu上
         {
            cs1=1;
         cs2=0;
            LCD_disp_char(6,i+48+4,~yu[i]);
             delay(500);
          }
          for (i=12;i<24;i++)//yu下
         {
            LCD_disp_char(7,i-12+48+4,~yu[i]);
             delay(500);
          }
          for (i=0;i<12;i++)//老上
         {
            cs1=0;
         cs2=1;
            LCD_disp_char(6,i,~lao[i]);
             delay(500);
          }
          for (i=12;i<24;i++)//老下
         {
            LCD_disp_char(7,i-12,~lao[i]);
             delay(500);
          }
          for (i=0;i<12;i++)//shi上
         {
            cs1=0;
         cs2=1;
            LCD_disp_char(6,i+24-12,~shi[i]);
             delay(500);
          }
          for (i=12;i<24;i++)//shi下
         {
            LCD_disp_char(7,i-12+24-12,~shi[i]);
             delay(500);
          }
            LCD_write_command(0x01);
            delay(10000);
           }
        }
        }

        關閉窗口

        相關文章

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