新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機驅動1602液晶(4線串行)

        51單片機驅動1602液晶(4線串行)

        作者: 時間:2016-11-30 來源:網絡 收藏
        /*單片機I/O口使單片機資源的重要組成部分,也是用來擴展外圍設備的必選資源,盡可能以更少的I/O口實現更多的功能是單片機工程師追求的目標,現在的一些串行器件也為這一目標的實現添加了更多的可能性,比如I2C總線,MAXIM力推的1-WIRE等等,都可以以很少的I/O口實現更多的功能,當然這是以降低一定的速度為代價的。

        廢話少說,進入正題。

        本文引用地址:http://www.104case.com/article/201611/323796.htm

        顯示器件多見的是LED數碼管,LCD液晶屏等。一般的數碼管成本低廉,在顯示內容要求不多的時候適用;LCD液晶屏以更多的顯示空間得到了許多人的愛好,不過成本上要高的多(市場價在20元左右),本文以LCD1602為例說明如何驅動液晶屏。

        LCD1602外接的控制接口有RS,R/W,E;數據接口為DB7--DB0。總共有11跟線與單片機的I/O口連接,若使用標準的51單片機,至少占用了一個端口再加上另一個端口的部分I/O口。這再很多應用場合是不大可取的。所以很有必要減少連接數。從其數據手冊上介紹的4線連接方式可以達到只使用7個I/O口即可滿足要求,其中為3個控制口RS,R/W,E和數據口的DB7--DB4;寫入數據或指令的順序是先寫高半個字節,再寫低半個字節。


        其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分別接RS,R/W,E;

        下面給出驅動源程序*/


        #include
        #include "intrins.h"

        #define uint unsigned int
        #define uchar unsigned char

        #define TRUE 1
        #define FALSE 0
        #define nop _nop_()


        #define PtData P0 //定義連接口線,
        #define PtContr P3
        sbit RS="PtContr"^0;
        sbit RW="PtContr"^1;
        sbit E="PtContr"^2;

        void InitialLcd();
        void WriteLcdInstr(uchar);
        void WriteLcdData(uchar);
        void CheckLcdBusy();
        uchar HexToDdram(uchar);

        void Delay(unsigned int);


        main()
        {Delay(1000);

        InitialLcd();

        WriteLcdInstr(0x80);
        WriteLcdData(e);
        WriteLcdData(l);
        WriteLcdData(k);
        WriteLcdData(e);
        WriteLcdData(l);
        WriteLcdData(i);
        WriteLcdData(k);
        WriteLcdData(e);

        WriteLcdInstr(0xc0);
        WriteLcdData(L);
        WriteLcdData(C);
        WriteLcdData(D);
        WriteLcdData(1);
        WriteLcdData(6);
        WriteLcdData(0);
        WriteLcdData(2);

        while(1)
        {

        WriteLcdInstr(0x0f);
        Delay(30000);
        WriteLcdInstr(0x08);
        Delay(40000);
        }

        }

        //----------------LCD1602函數---------------------//
        //---初始化
        void InitialLcd()
        {Delay(600);//延時應大于15ms,不同的晶振使需要修改,本程序再6M下調試通過
        RS=0;
        RW=0;nop;
        E=0;nop;

        E=1;nop;
        PtData=0x20;//
        nop;
        E=0;
        Delay(200);//延時應大于4.1ms

        E=1;nop;
        PtData=0x20;//
        nop;
        E=0;
        Delay(5);//延時應大于100us

        E=1;nop;
        PtData=0x20;//
        nop;
        E=0;//設置4位操作;

        WriteLcdInstr(0x01);//清屏
        WriteLcdInstr(0x28);//設置4位操作,1行顯示,5x8
        WriteLcdInstr(0x02);//光標歸位
        WriteLcdInstr(0x06);//AC自動加1,畫面不動
        WriteLcdInstr(0x0f);//0x0f:光標閃爍開;

        }
        //---寫指令
        void WriteLcdInstr(uchar Temp)
        {CheckLcdBusy();
        RS=0;
        RW=0;
        E=0;nop;
        E=1;nop;
        PtData=Temp;
        nop;
        E=0;nop;
        E=1;nop;
        PtData=(Temp<<4);
        nop;
        E=0;nop;
        }


        //---寫數據
        void WriteLcdData(uchar Temp)
        {
        CheckLcdBusy();
        RS=1;
        RW=0;
        E=0;nop;
        E=1;nop;
        PtData=Temp;
        nop;
        E=0;nop;
        E=1;nop;
        PtData=(Temp<<4);
        nop;
        E=0;nop;
        }


        //---查忙
        void CheckLcdBusy()
        {uchar Temp,t;
        PtData=0xff;

        RW=1;
        RS=0;nop;
        E=0;nop;
        do
        {nop;
        E=1;nop;
        Temp=PtData;
        nop;nop;nop;
        E=0;nop;nop;

        E=1;nop;
        t=PtData;
        nop;nop;nop;
        E=0;nop;nop;

        Temp&=0x80;
        }while(Temp==0x80);
        }


        //---delay
        void Delay(unsigned int N)
        {unsigned int i;
        for(i=0;i}



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 顺平县| 河北区| 万年县| 马边| 富顺县| 呼伦贝尔市| 涞源县| 武汉市| 青州市| 东兰县| 嘉鱼县| 泗水县| 山东省| 漠河县| 凤城市| 阿拉尔市| 昭通市| 赞皇县| 红河县| 灵璧县| 陇西县| 远安县| 抚宁县| 双峰县| 黎城县| 临潭县| 浠水县| 宜良县| 赤峰市| 乐清市| 涪陵区| 礼泉县| 翼城县| 太和县| 都江堰市| 石景山区| 台安县| 沧州市| 三江| 青海省| 丘北县|