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

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

        單片機寫LCD1602液晶程序源碼

        作者:寒竹子   來源:本站原創   點擊數:  更新時間:2014年03月18日   【字體:

        本程序的pdf格式的原理圖下載: http://www.thefapper.com/f/ks51.pdf 

        /***********寫1602液晶**************/
        /**
        *功能:寫1602液晶
        *時間:二〇一四年三月十五日 08:59:26
        *作者:寒竹子
        **/

        #include <reg52.h>
        #include <intrins.h>

        typedef unsigned int uint;
        typedef unsigned char uchar;

        //LCD1602
        sbit LCD1602_RS = P1^0;
        sbit LCD1602_RW = P1^1;
        sbit LCD1602_EN = P1^5;

        void LCD1602_Wait();
        void writeCmd_LCD1602(uchar cmd);
        void writeData_LCD1602(uchar dat);
        void LCD1602_Init();
        void writeString_LCD1602(uchar * pstr);
        void LCD1602_ShowStr(uchar x, uchar y, uchar * pstr);

        void main()
        {
        LCD1602_Init();

        /*
        writeCmd_LCD1602(0x00 | 0x80);
        writeData_LCD1602('C');

        writeString_LCD1602("Hanzhuzi");
        */
        LCD1602_ShowStr(0, 0, "han zhu ying xue");
        LCD1602_ShowStr(0, 1, "QQ:1754410821");
        while (1);
        }

        //LCD1602判忙準備
        void LCD1602_Wait()
        {
        uchar sta = 0;//讀取液晶當前狀態
        P0 = 0xFF;//讀取狀態時必須把總線拉高才能正確的讀取其狀態!否則寫入有時不成功。!
        LCD1602_RS = 0;
        LCD1602_RW = 1;

        do
        {
        LCD1602_EN = 1;
        sta = P0;//讀取狀態
        LCD1602_EN = 0;//避免液晶輸出數據影響到總線P0上的其他器件
        } while (sta & 0x80);//檢測第七位是否為1,若為1繼續等待直到0為止
        }

        //LCD1602寫命令
        void writeCmd_LCD1602(uchar cmd)
        {
        //在進行讀寫數據之前要進行液晶忙碌等待
        LCD1602_Wait();

        LCD1602_RS = 0;
        LCD1602_RW = 0;
        LCD1602_EN = 0;
        P0 = cmd;
        LCD1602_EN = 1;//高脈沖送入命令
        LCD1602_EN = 0;//避免液晶輸出數據影響其他的器件
        }

        //LCD1602寫數據
        void writeData_LCD1602(uchar dat)
        {
        LCD1602_Wait();

        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_EN = 0;
        P0 = dat;//送入數據
        LCD1602_EN = 1;//高脈沖
        LCD1602_EN = 0;//避免液晶輸出數據影響到其他器件
        }

        //LCD1602初始化
        void LCD1602_Init()
        {
        writeCmd_LCD1602(0x38);//5*7點陣,16*2顯示
        writeCmd_LCD1602(0x0C);//開顯示,不顯示光標
        writeCmd_LCD1602(0x06);//數據指針++,光標++
        writeCmd_LCD1602(0x01);//清屏
        }

        //LCD1602寫String
        void writeString_LCD1602(uchar * pstr)
        {
        while (*pstr)
        {
        writeData_LCD1602(*pstr++);
        }
        }

        //LCD1602按地址寫
        void LCD1602_ShowStr(uchar x, uchar y, uchar * pstr)
        {
        uchar addr = 0;
        //判斷RAM地址
        if (y == 0) //LCD1602的左上角地址是 (0, 0)
        {
        addr = (0x00 + x);//確定x坐標,x為偏移量
        }
        else
        {
        addr = (0x40 + x);//第二行
        }

        //寫入地址
        writeCmd_LCD1602(addr | 0x80);//地址是從0x80H開始的

        //寫入數據
        while (*pstr != '\0')
        {
        writeData_LCD1602(*pstr++);
        }
        }
         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮