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

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

        LCD12864驅動程序-51單片機

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年09月01日   【字體:

         /****************************************************************************/

        /*                                                                          */
        /*                Copyright (c) 2012, pcwebmaster                           */
        /*                     All rights reserved.                                 */
        /*                                                                          */
        /*      Email:pcwebmaste@163.com                                            */
        /*                                                                          */
        /****************************************************************************/
        /****************************************************************************/
        /* 文件名:LCD12864.c                                                       */
        /* 版  本:Version 1.0                                                      */
        /* 描  述:實現液晶和單片機的通訊協議,根據計算機發給的命令進行人機交互     */
        /* 作  者:pcwebmaste                                                       */
        /* 函  數:                                                                 */
        /*         LCD12864_init                                                    */
        /*         LCD12864WriteCommand                                             */
        /*         LCD12864WriteByte                                                */
        /*         LCD12864_init                                                    */
        /*         LCD12864SetXY                                                    */
        /*         LCD12864PrintfString                                             */
        /* 歷史記錄:                                                               */
        /*  pcwebmaste          2008-07-10     Creat Inital version. (Version 1.0)  */
        /*    模塊化 2012-06-02     Creat Inital version. (Version 2.0) */
        /****************************************************************************/
        #include "12864.h"
         
        #define LOW         0
        #define HIGH        1
         
        sbit wela    =  P2^6;
        sbit dula    =  P2^7;
        #define LCD12864_RS(x)     {if((x))P3 |=  1<<LCD12864_RS_PIN;\
                                    else   P3 &=~(1<<LCD12864_RS_PIN);}//寄存器選擇輸入
         
        #define LCD12864_RW(x)     {if((x))P3 |=  1<<LCD12864_RW_PIN;\
                                    else   P3 &=~(1<<LCD12864_RW_PIN);}//液晶讀/寫控制
         
        #define LCD12864_EN(x)     {if((x))P3 |=  1<<LCD12864_EN_PIN;\
                                    else   P3 &=~(1<<LCD12864_EN_PIN);}//液晶使能控制
         
        #define LCD12864_MD(x)     {if((x))P3 |=  1<<LCD12864_MD_PIN;\
                                    else   P3 &=~(1<<LCD12864_MD_PIN);}//串/并方式控制
         
        #define LCDWELA(x)     {if((x))P2 |=  1<<6; else   P2 &=~(1<<6);}
         
        #define LCDDULA(x)     {if((x))P2 |=  1<<7; else   P2 &=~(1<<7);}
         
        #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
         
        /*********************************************/
        /*            */
        /* 主程序                   */
        /*                                           */
        /*********************************************
        void  main()
        {
         DelayNOP();                 //延時
            wela=LOW;
         dula=LOW;
            LCD12864_init();            //初始化LCD            
         
         LCD12864PrintfString(0,1,dis1);
         LCD12864PrintfString(1,0,dis2);
         LCD12864PrintfString(2,0,dis3);
         LCD12864PrintfString(3,1,dis4);
            while(1);
        }
        /********************************************
        *函數名稱:LCD12864_init
        *輸    入:無
        *輸    出:lcd_busy    為1時,忙,等待。
            lcd-busy    為0時,閑,可寫指令與數據
        *說    明:LCD12864LCD檢查忙狀態
        /*******************************************/
        bit LCD1286_busy()
         {                         
            bit result;
            LCD12864_RS(LOW);
            LCD12864_RW(HIGH);
            LCD12864_EN(HIGH);
            DelayNOP();
            result = (bit)(LCD12864_PORT&0x80);
            LCD12864_EN(LOW);
            return(result);
         }
        /********************************************
        *函數名稱:LCD12864WriteCommand
        *輸    入:ucCmd 要寫入的命令
        *輸    出:無
        *說    明:LCD12864 寫命令
            RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
        ********************************************/
        void LCD12864WriteCommand(unsigned char ucCmd)
        {                         
           while(LCD1286_busy());
            LCD12864_RS(LOW);
            LCD12864_RW(LOW);
            LCD12864_EN(LOW);
            _nop_();
            _nop_();
            LCD12864_PORT = ucCmd;
            DelayNOP();
            LCD12864_EN(HIGH);
            DelayNOP();
            LCD12864_EN(LOW); 
        }
         
        /********************************************
        *函數名稱:LCD12864WriteByte
        *輸    入:ucByte 要寫入的字節
        *輸    出:無
        *說    明:LCD12864 寫字節
            RS=H,RW=L,E=高脈沖,D0-D7=數據。
        ********************************************/
        void LCD12864WriteByte(unsigned char ucByte)
        {                         
           while(LCD1286_busy());
            LCD12864_RS(HIGH);
            LCD12864_RW(LOW);
            LCD12864_EN(LOW);
            LCD12864_PORT = ucByte;
            DelayNOP();
            LCD12864_EN(HIGH);
            DelayNOP();
            LCD12864_EN(LOW);
        }
        /********************************************
        *函數名稱:LCD12864_init
        *輸    入:無
        *輸    出:無
        *說    明:LCD12864LCD初始化設定
        /*******************************************/
        void LCD12864_init()
        {
            LCD12864_MD(HIGH);            //并口方式   
            LCD12864WriteCommand(0x34);      //擴充指令操作
            LCD12864WriteCommand(0x30);      //基本指令操作
            LCD12864WriteCommand(0x0C);      //顯示開,關光標
            LCD12864WriteCommand(0x01);      //清除LCD的顯示內容
        }
        /********************************************
        *函數名稱:LCD12864SetXY
        *輸    入:x 橫坐標 y 縱坐標
        *輸    出:無
        *說    明:LCD12864 設置坐標
        ********************************************/
        void LCD12864SetXY(unsigned char X,unsigned char Y)
        {                         
           if (X==0)
             {X=0x80;}
           else if (X==1)
             {X=0x90;}
           else if (X==2)
             {X=0x88;}
           else if (X==3)
             {X=0x98;}
           LCD12864WriteCommand(X+Y);     //顯示地址
        }
        /********************************************
        *函數名稱:LCD12864SetXY
        *輸    入:x 橫坐標 y 縱坐標
        *輸    出:無
        *說    明:LCD12864 設置坐標
        為什么這樣寫不行呢?
        ********************************************
        void LCD12864SetXY(unsigned char x,unsigned char y)
        {
           switch(y)
             {
          case 1:
                {
                     LCD12864WriteCommand(0x80+x);
                }
                break;
         
          case 2:
                {
                     LCD12864WriteCommand(0x90+x);
                }
                break;
         
          case 3:
                {
                     LCD12864WriteCommand(0x88+x);
                }
                break;
         
          case 4:
                {
                     LCD12864WriteCommand(0x98+x);
                }
                break;
         
          default:break;
             }
        //  LCD12864WriteCommand(x+y);     //顯示地址
        }
        /********************************************
        *函數名稱:LCD12864PrintfString
        *輸    入:x 橫坐標 y 縱坐標 s字符串
        *輸    出:無
        *說    明:LCD12864 打印字符串
        ********************************************/
        void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s)
        {
          LCD12864SetXY(x,y);    //設置顯示坐標
         
             while(s && *s)
             {
                LCD12864WriteByte(*s);   //顯示逐個字符
                s++;       
             }
        }
         
         
         
        /****************************************************************************/
        /*                                                                          */
        /*                Copyright (c) 2012, pcwebmaster                           */
        /*                     All rights reserved.                                 */
        /*                                                                          */
        /*      Email:pcwebmaste@163.com                                            */
        /*                                                                          */
        /****************************************************************************/
        /****************************************************************************/
        /* 文件名:LCD12864.c                                                       */
        /* 版  本:Version 1.0                                                      */
        /* 描  述:實現液晶和單片機的通訊協議,根據計算機發給的命令進行人機交互     */
        /* 作  者:pcwebmaste                                                       */
        /* 函  數:                                                                 */
        /*         LCD12864_init                                                    */
        /*         LCD12864WriteCommand                                             */
        /*         LCD12864WriteByte                                                */
        /*         LCD12864_init                                                    */
        /*         LCD12864SetXY                                                    */
        /*         LCD12864PrintfString                                             */
        /* 歷史記錄:                                                               */
        /*  pcwebmaste          2008-07-10     Creat Inital version. (Version 1.0)  */
        /*    模塊化 2012-06-02     Creat Inital version. (Version 2.0) */
        /****************************************************************************/
         
        #ifndef __12864_H__
        #define __12864_H__
         
        #include <reg52.h>
        #include <intrins.h>
         
        #define LCD12864_PORT  P0  //數據口
        #define LCD12864_RS_PIN   5
        #define LCD12864_RW_PIN   6
        #define LCD12864_EN_PIN   4
        #define LCD12864_MD_PIN   7
         
        unsigned char code dis1[] = {"中國昌樂是寶石"};
        unsigned char code dis2[] = {"之都,西瓜之鄉!"};
        unsigned char code dis3[] = {"中國昌樂寶石城"};
        unsigned char code dis4[] = {"人民歡迎您!"};
        /********************************************
        *函數名稱:LCD12864_init
        *輸    入:無
        *輸    出:lcd_busy    為1時,忙,等待。
            lcd-busy    為0時,閑,可寫指令與數據
        *說    明:LCD12864LCD檢查忙狀態
        /*******************************************/
        bit LCD1286_busy();
        /********************************************
        *函數名稱:LCD12864WriteCommand
        *輸    入:ucCmd 要寫入的命令
        *輸    出:無
        *說    明:LCD12864 寫命令
            RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
        ********************************************/
        void LCD12864WriteCommand(unsigned char ucCmd);
         
        /********************************************
        *函數名稱:LCD12864WriteByte
        *輸    入:ucByte 要寫入的字節
        *輸    出:無
        *說    明:LCD12864 寫字節
            RS=H,RW=L,E=高脈沖,D0-D7=數據。
        ********************************************/
        void LCD12864WriteByte(unsigned char ucByte);
        /********************************************
        *函數名稱:LCD12864_init
        *輸    入:無
        *輸    出:無
        *說    明:LCD12864LCD初始化設定
        /*******************************************/
        void LCD12864_init();
        /********************************************
        *函數名稱:LCD12864SetXY
        *輸    入:x 橫坐標 y 縱坐標
        *輸    出:無
        *說    明:LCD12864 設置坐標
        ********************************************/
        void LCD12864SetXY(unsigned char X,unsigned char Y);
        /********************************************
        *函數名稱:LCD12864PrintfString
        *輸    入:x 橫坐標 y 縱坐標 s字符串
        *輸    出:無
        *說    明:LCD12864 打印字符串
        ********************************************/
        void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s);
         
        void LCD12864PrintfData(unsigned char x,unsigned char y,unsigned char DData);
        /********************************************
        *函數名稱:LCD12864PrintfNum
        *輸    入:add ge shi bai
        *輸    出:無
        *說    明:此函數不好寫成通用函數,在連續地址里
           連續寫數字半角顯示。根據情況修改
        ********************************************/
        void LCD12864PrintfNum(unsigned char add,unsigned char ge,unsigned char shi,unsigned char bai)
        {
         LCD12864WriteCommand(add);
         LCD12864WriteByte(bai+0x30);
         LCD12864WriteByte(shi+0x30);
         LCD12864WriteByte(ge+0x30);
        }
         
         
        #endif
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮