<object id="k0taz"><form id="k0taz"></form></object>
<pre id="k0taz"></pre>
      1. <table id="k0taz"></table>
        <bdo id="k0taz"><center id="k0taz"></center></bdo>
        <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>
        專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        帶字符型12864單片機顯示程序

        作者:佚名   來源:不詳   點擊數:  更新時間:2014年08月17日   【字體:

         

         
         
        //帶字符型12864單片機顯示程序
         
         
         
        #include<reg52.h>
        #include <math.h>
         
         
         
        void lcd_init(void);
        void clr_lcd(void);
        void send_com(unsigned char cmd);
        void send_data(unsigned char dat);
        void chek_busy(void);
        void set_xy(unsigned char xpos,unsigned char ypos);
        void print(unsigned char x,unsigned char y,char* str);
        void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k);
         
        unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//歡迎
         
         
        #define DATA       P2
        #define CONTROL P1
        #define E    2           //并行的使能信號        sbit E   = P0^7
        #define RW   1          //并行的讀寫信號         sbit RW = P0^6
        #define RS   0         //并行的指令數據選擇信號 sbit RS = P0^5  
        #define PSB 3         //并/串行接口選擇         sbit PSB = P0^4
         
        12864 LCD分為字符型和點陣型,字符型即內帶中文字庫的有PSB串并選擇引腳。
        #define RST 5         //復位低電平有效         sbit RST = P0^3
        #define SETB(x,y) (x|=(1<<y))
        #define CLRB(x,y) (x&=(~(1<<y)))
        #define CHKB(x,y) (x&(1<<y))
         
         
        /測忙碌/
        //測忙碌子程序
        //RS=0,RW=1,E=H,D0-D7=狀態字
        void chek_busy(void)
        { unsigned char temp1;//狀態信息(判斷是否忙)
           CLRB(CONTROL,RS);    // RS = 0;
           SETB(CONTROL,RW);    // RW = 1;
           SETB(CONTROL,E);    // E = 1;
           do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);
           SETB(CONTROL,E);   // E = 1;
           DATA=0xFF;
        }
        /寫命令/
        //寫命令子程序
        void send_com(unsigned char cmd)
        {
        chek_busy();
        CLRB(CONTROL,RS); //RS = 0;
        CLRB(CONTROL,RW); //RW = 0;
        DATA = cmd;
        SETB(CONTROL,E); //E = 1;
        CLRB(CONTROL,E); //E = 0;
        }
        /寫數據/
        //寫數據子程序
        void send_data(unsigned char dat)
        {
        chek_busy();
        SETB(CONTROL,RS); //RS = 1;
        CLRB(CONTROL,RW); //RW = 0;
        DATA = dat;
        SETB(CONTROL,E); //E = 1;
        CLRB(CONTROL,E); //E = 0;
        }
        /初始化/
        //復位、通訊方式選擇
        void lcd_init(void)
        {
            SETB(CONTROL,RST);//復位RST=1
            SETB(CONTROL,PSB);       //通訊方式為并口PSB = 1
              //send_com(0x34);//34H--擴充指令操作
        send_com(0x30);//功能設置,一次送8位數據,基本指令集
        send_com(0x0C);//0000,1100 整體顯示,游標off,游標位置off
        send_com(0x01);//0000,0001 清DDRAM
        send_com(0x02);//0000,0010 DDRAM地址歸位
        send_com(0x80);//1000,0000 設定DDRAM 7位地址000,0000到地址計數器AC
        }
         
        //          設置顯示位置    xpos(1~16),tpos(1~4)
        void set_xy(unsigned char xpos,unsigned char ypos)
        {
        switch(ypos)
        {
           case 1:
            send_com(0X80|xpos);break;
           case 2:
            send_com(0X90|xpos);break;
           case 3:
            send_com(0X88|xpos);break;
           case 4:
            send_com(0X98|xpos);break;
           default:break;
        }
        }
        //          在指定位置顯示字符串
        void print(unsigned char x,unsigned char y,char* str)
        {
            unsigned char lcd_temp;
            set_xy(x,y);
            lcd_temp=*str;
            while(lcd_temp != 0x00)
            {
                send_data(lcd_temp);
                lcd_temp=*(++str);
            }
        }
         
        //寫字符串
         
        //寫字符串子程序
        //xpos1取0~7共八列,ypos1取0~3共四行。
            void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k)
        { unsigned char n;
             switch (ypos)
            { case 1: xpos |= 0x80;break;         //第一行
              case 2: xpos |= 0x90;break;         //第二行
              case 3: xpos |= 0x88;break;         //第三行
              case 4: xpos |= 0x98;break;         //第四行
              default: break;
             }
              send_com(xpos);     //此處的Xpos已轉換為LCM的顯示寄存器實際地址
              for(n=0;n < k;n++)
             {
              send_data(str[n]);//顯示漢字時注意碼值,連續兩個碼表示一個漢字
              }
           }
         
        //清屏
        void clr_lcd(void)
        {
           send_com(0x01);
           //send_com(0x34);
           //send_com(0x30);
        }
         
        //主函數
         
        void main ()
        {
        lcd_init();     //設定液晶工作方式
        printstr(1,1,buf,4);
        print(5,1,"光臨");
        print(0,3," NATHAN_ZHANG");
        while(1) { }
        }
         
        關閉窗口
        欧美国产伦久久久久_亚洲爽爽一区二区三区_一色屋精品视频在线观看免费_久久伊人成色777综合网
        <object id="k0taz"><form id="k0taz"></form></object>
        <pre id="k0taz"></pre>
          1. <table id="k0taz"></table>
            <bdo id="k0taz"><center id="k0taz"></center></bdo>
            <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>