新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 1602液晶顯示實驗

        1602液晶顯示實驗

        作者: 時間:2012-06-21 來源:網絡 收藏

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

        //讀狀態
        unsigned char ReadStatusLCM(void)
        {
        LCM_Data = 0xFF;
        LCM_RS = 0;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        while (LCM_Data Busy); //檢測忙信號
        return(LCM_Data);
        }

        void LCMInit(void) //LCM初始化
        {
        LCM_Data = 0;
        WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
        Delay5Ms();
        WriteCommandLCM(0x38,0);
        Delay5Ms();
        WriteCommandLCM(0x38,0);
        Delay5Ms();

        WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
        WriteCommandLCM(0x08,1); //關閉顯示
        WriteCommandLCM(0x01,1); //顯示清屏
        WriteCommandLCM(0x06,1); // 顯示光標移動設置
        WriteCommandLCM(0x0C,1); // 顯示開及光標設置
        }

        //按指定位置顯示一個字符
        void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
        {
        Y = 0x1;
        X = 0xF; //限制X不能大于15,Y不能大于1
        if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
        X |= 0x80; //算出指令碼
        WriteCommandLCM(X, 0); //這里不檢測忙信號,發送地址碼
        WriteDataLCM(DData);
        }

        //按指定位置顯示一串字符
        void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
        {
        unsigned char ListLength;

        ListLength = 0;
        Y = 0x1;
        X = 0xF; //限制X不能大于15,Y不能大于1
        while (DData[ListLength]>0x20) //若到達字串尾則退出
        {
        if (X = 0xF) //X坐標應小于0xF
        {
        DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
        ListLength++;
        X++;
        }
        }
        }

        //5ms延時
        void Delay5Ms(void)
        {
        unsigned int TempCyc = 5552;
        while(TempCyc--);
        }

        //400ms延時
        void Delay400Ms(void)
        {
        unsigned char TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--)
        {
        TempCycB=7269;
        while(TempCycB--);
        };
        }

        [注:AT89S51使用12M晶振]

        #define LCM_RW P2_0 //定義引腳
        #define LCM_RS P2_1
        #define LCM_E P2_2
        #define LCM_Data P1
        #define Busy 0x80 //用于檢測LCM狀態字中的Busy標識

        #include at89x51.h>

        void WriteDataLCM(unsigned char WDLCM);
        void WriteCommandLCM(unsigned char WCLCM,BuysC);
        unsigned char ReadDataLCM(void);
        unsigned char ReadStatusLCM(void);
        void LCMInit(void);
        void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
        void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
        void Delay5Ms(void);
        void Delay400Ms(void);

        unsigned char code cdle_net[] = {www.cdle.net};
        unsigned char code email[] = {pnzwzw@cdle.net};

        void main(void)
        {
        Delay400Ms(); //啟動等待,等LCM講入工作狀態
        LCMInit(); //LCM初始化
        Delay5Ms(); //延時片刻(可不要)

        DisplayListChar(0, 0, cdle_net);
        DisplayListChar(0, 1, email);
        ReadDataLCM();//測試用句無意義
        while(1);
        }

        //寫數據
        void WriteDataLCM(unsigned char WDLCM)
        {
        ReadStatusLCM(); //檢測忙
        LCM_Data = WDLCM;
        LCM_RS = 1;
        LCM_RW = 0;
        LCM_E = 0; //若晶振速度太高可以在這后加小的延時
        LCM_E = 0; //延時
        LCM_E = 1;
        }

        //寫指令
        void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
        {
        if (BuysC) ReadStatusLCM(); //根據需要檢測忙
        LCM_Data = WCLCM;
        LCM_RS = 0;
        LCM_RW = 0;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        }

        //讀數據
        unsigned char ReadDataLCM(void)
        {
        LCM_RS = 1;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        return(LCM_Data);
        }


        上一頁 1 2 下一頁

        關鍵詞: 實驗 液晶顯示

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 合肥市| 柳河县| 湘阴县| 阳泉市| 建昌县| 朔州市| 朝阳县| 堆龙德庆县| 阜新市| 江华| 江陵县| 太仓市| 陇西县| 陈巴尔虎旗| 德保县| 砚山县| 榆社县| 平泉县| 顺义区| 康保县| 清苑县| 乌审旗| 奉贤区| 平潭县| 辰溪县| 独山县| 遂溪县| 昌乐县| 金溪县| 莱西市| 扎赉特旗| 巴彦淖尔市| 宽甸| 万宁市| 乌兰察布市| 洛浦县| 柯坪县| 栾川县| 镶黄旗| 湘乡市| 谢通门县|