• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

    作者: 時(shí)間:2012-10-27 來源:網(wǎng)絡(luò) 收藏
    //由于的IO不夠用,必須省出IO口,迫不得已,又根據(jù)大量資料對程序進(jìn)行了修改
    //得到如下能夠成功運(yùn)行的程序。本程序在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!] ";//文字?jǐn)?shù)組
    unsigned char code Logo_text2[]="Soldering iron. ";//文字?jǐn)?shù)組
    unsigned char code Logo_text3[]={'V','o','l','t',':','2','0','V',' ','S','e','t','3','0','0',0xdf};//文字?jǐn)?shù)組
    unsigned char code Logo_text4[]={'P','o','w','e','r',':','2','0','W',' ','C','T','2','9','5',0xdf};//文字?jǐn)?shù)組
    unsigned char m;//輔助尋址指針變量
    sbit clear = P3^2;//清屏按鈕
    sbit key1 = P3^4;//寫第一行按鈕
    sbit key2 = P3^5;//寫第二行按鈕
    sbit key3 = P3^6;//顯示模式變更測試按鈕

    void delay2ms()//2064周期延時(shí)
    {
    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;//臨時(shí)字節(jié)
    do
    {
    rs=0;//選擇寄存器
    rw=1;//讀取
    clk=1;//LCD將數(shù)據(jù)放到總線
    busy=P0;//讀入總線數(shù)據(jù)
    clk=0;//關(guān)閉總線
    busy=busy0x80;//保留最高位
    }while(busy);//判斷是否為忙
    }

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

    clk=1;//準(zhǔn)備下降沿
    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;//準(zhǔn)備下降沿
    P0=dat;//數(shù)據(jù)放到總線上
    clk=0;//下降沿,數(shù)據(jù)寫入LCD

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

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

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


    關(guān)鍵詞: LCD1602 LCD1640 總線模式 2051

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 六盘水市| 崇文区| 渭南市| 德化县| 陈巴尔虎旗| 桐庐县| 三台县| 屏边| 沭阳县| 松江区| 临海市| 绍兴市| 弋阳县| 阿鲁科尔沁旗| 龙里县| 平和县| 开化县| 兴海县| 龙门县| 准格尔旗| 托克托县| 淮阳县| 高清| 固始县| 增城市| 海南省| 从江县| 遵义县| 肇源县| 铁力市| 赤城县| 镇安县| 安仁县| 池州市| 涞源县| 海丰县| 鸡西市| 邮箱| 石家庄市| 通州市| 佳木斯市|