在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > LCD1602,LCD1640液晶4位總線模式編程成功

            LCD1602,LCD1640液晶4位總線模式編程成功

            作者: 時間:2012-10-27 來源:網(wǎng)絡 收藏
            //由于的IO不夠用,必須省出IO口,迫不得已,又根據(jù)大量資料對程序進行了修改
            //得到如下能夠成功運行的程序。本程序在STC89C51RC@12MHz 4位下通過data image CM1640液晶模塊
            //yusung W-1602A液晶模塊,廣州捷勝 1602A V1.0模塊的測試,均可正常寫入。

            #include reg51.h>
            sbit rs=P3^5;//指令數(shù)據(jù)選擇
            sbit rw=P2^7;//讀寫選擇
            sbit clk=P3^4;//使能脈沖
            unsigned char code Logo_text1[]="[China O Soft!] ";//文字數(shù)組
            unsigned char code Logo_text2[]="Soldering iron. ";//文字數(shù)組
            unsigned char code Logo_text3[]={'V','o','l','t',':','2','0','V',' ','S','e','t','3','0','0',0xdf};//文字數(shù)組
            unsigned char code Logo_text4[]={'P','o','w','e','r',':','2','0','W',' ','C','T','2','9','5',0xdf};//文字數(shù)組
            unsigned char m;//輔助尋址指針變量
            sbit clear = P3^2;//清屏按鈕
            sbit key1 = P3^4;//寫第一行按鈕
            sbit key2 = P3^5;//寫第二行按鈕
            sbit key3 = P3^6;//顯示模式變更測試按鈕

            void delay2ms()//2064周期延時
            {
            unsigned char temP0;
            while(--temp1);
            while(--temp1);
            while(--temp1);
            while(--temp1);
            }

            void delay()
            {
            unsigned char temp1,temp2;
            temp1=50;
            while(--temp1)
            while(--temp2);
            }

            void check_busy()//忙檢測
            {
            unsigned char busy;//臨時字節(jié)
            do
            {
            rs=0;//選擇寄存器
            rw=1;//讀取
            clk=1;//LCD將數(shù)據(jù)放到總線
            busy=P0;//讀入總線數(shù)據(jù)
            clk=0;//關閉總線
            busy=busy0x80;//保留最高位
            }while(busy);//判斷是否為忙
            }

            void instructions(unsigned char INS)//寫指令函數(shù)
            {
            check_busy();//寫之前檢測忙
            rs=0;//選擇指令寄存器
            rw=0;//寫操作
            clk=1;//準備下降沿
            P0=INS;//數(shù)據(jù)放到總線上
            clk=0;//下降沿,數(shù)據(jù)寫入LCD

            clk=1;//準備下降沿
            P0=INS4;//數(shù)據(jù)放到總線上
            clk=0;//下降沿,數(shù)據(jù)寫入LCD
            }


            void write_data(unsigned char dat)//寫數(shù)據(jù)函數(shù)
            {
            check_busy();//寫之前檢測忙
            rs=1;//選擇數(shù)據(jù)寄存器
            rw=0;//寫操作
            clk=1;//準備下降沿
            P0=dat;//數(shù)據(jù)放到總線上
            clk=0;//下降沿,數(shù)據(jù)寫入LCD

            clk=1;//準備下降沿
            P0=dat4;//數(shù)據(jù)放到總線上
            clk=0;//下降沿,數(shù)據(jù)寫入LCD
            }
            void lcd_clear()//清除顯示函數(shù)
            {
            instructions(0x01);//清除顯示
            delay2ms();//清屏后,按手冊至少應延時1.53ms
            }
            void set_4bit_mode()
            {
            check_busy();//寫之前檢測忙
            rs=0;//選擇指令寄存器
            rw=0;//寫操作
            clk=1;//準備下降沿
            P0=0x2f;//4位總線控制字
            clk=0;//下降沿,數(shù)據(jù)寫入LCD
            }
            void lcd_init()
            {
            rw=0;//寫操作
            set_4bit_mode();//設置成4位.
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            instructions(0x0f);//設置輸入模式為8位數(shù)據(jù)總線,光標增量移動,顯示不移位
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            instructions(0x06);//開顯示,關閉光標,不閃爍
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            lcd_clear();//調用清屏函數(shù)

            instructions(0x80+0x00);//寫入顯示緩沖區(qū)起始地址為1行1列
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            for(m=0;m16;m++)//將預先定義好的字符連續(xù)發(fā)送到LCD
            {
            write_data(Logo_text1);//通過輔助變量查詢數(shù)組并寫入LCD
            delay();
            }

            instructions(0x80+0x40);//寫入顯示緩沖區(qū)起始地址為2行1列
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            for(m=0;m16;m++)//將預先定義好的字符連續(xù)發(fā)送到LCD
            {
            write_data(Logo_text2);//通過輔助變量查詢數(shù)組并寫入LCD
            delay();
            }
            }

            void main()
            {
            lcd_init();//LCD初始化
            while(1)
            {
            if(!key1)//判斷按鍵是否按下
            {
            instructions(0x80+0x10);//寫入顯示緩沖區(qū)起始地址為1行1列
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            for(m=0;m16;m++)//將預先定義好的字符連續(xù)發(fā)送到LCD
            {
            write_data(Logo_text3);//通過輔助變量查詢數(shù)組并寫入LCD
            }
            }
            if(!key2)//判斷按鍵是否按下
            {
            instructions(0x80+0x50);//寫入顯示緩沖區(qū)起始地址為2行1列
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            for(m=0;m16;m++)//將預先定義好的字符連續(xù)發(fā)送到LCD
            {
            write_data(Logo_text4);//通過輔助變量查詢數(shù)組并寫入LCD
            }
            }
            if(!clear)//判斷按鍵是否按下
            {
            lcd_clear();//調用清屏函數(shù)
            }
            if(!key3)//判斷按鍵是否按下
            {
            instructions(0x0c);//改變顯示模式
            delay2ms();//按手冊應至少延時39us,但由于執(zhí)行次數(shù)不多,統(tǒng)一使用2ms延時
            }
            }
            }


            評論


            相關推薦

            技術專區(qū)

            關閉