新聞中心

        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 下一頁

        關鍵詞: 實驗 液晶顯示

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 镇巴县| 安图县| 渑池县| 唐海县| 全椒县| 乌拉特中旗| 岱山县| 莱芜市| 谢通门县| 榆树市| 固镇县| 奇台县| 西盟| 育儿| 赞皇县| 鞍山市| 秦皇岛市| 南康市| 丹东市| 清苑县| 汉沽区| 和硕县| 开远市| 汝州市| 陵川县| 祁连县| 延津县| 双城市| 玛纳斯县| 六枝特区| 望城县| 曲麻莱县| 正阳县| 延长县| 灌南县| 达州市| 芒康县| 邢台市| 舒兰市| 洪洞县| 蒙阴县|