新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > AVR 單片機學習筆記–LCD1602模塊

        AVR 單片機學習筆記–LCD1602模塊

        作者: 時間:2016-11-30 來源:網(wǎng)絡(luò) 收藏


        六、電路圖

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

        由于只是寫操作,所以R/W直接接地即可。

        PORTA接1602的8位數(shù)據(jù)引腳

        PORTD5接1602的RS引腳 區(qū)分數(shù)據(jù)或命令:H數(shù)據(jù),L命令

        PORTD4接1602的E引腳 高脈沖使能,使能脈寬最小150ns

        七、完整代碼。

        // 代碼功能:驅(qū)動LCD1602顯示屏
        // 平臺:DB-51 Ver2.1開發(fā)板
        // 控制芯片:ATmega16A
        //時鐘:片內(nèi)時鐘
        // 設(shè)計者:L、QQ:1007566569
        //2013-8-10
        //*************************************** 包含必備文件 *******************************************************
        #ifndef _STRING_H
        #include "string.h"
        #endif

        #ifndef uchar
        #define uchar unsigned char
        #endif

        #ifndef uint
        #define uintunsigned int
        #endif

        //*************************************** 移植必須修改 *******************************************************

        // 共占用 PORTA一組IO 、PORTD中第4、5 IO 由于只是寫操作,所以R/W直接接地即可。

        #define _1602_DATA PORTA // 接1602的8位數(shù)據(jù)引腳
        #define _1602_CMDIO PORTD // 控制線所對應的IO口
        #define _1602_CMDIO_RS5 // 接1602的RS引腳 區(qū)分數(shù)據(jù)或命令:H數(shù)據(jù),L命令
        #define _1602_CMDIO_E 4 // 接1602的E引腳 高脈沖使能,使能脈寬最小150ns

        /**************************************************
        設(shè)計者:L、QQ:1007566569
        函數(shù):自定義函數(shù) void My_SetBit(unsigned char *Date, unsigned char Wei, unsigned char ms)
        參數(shù):Date:寄存器地址 Wei:更改指定位 ms:若為1則將指定位置1 若為0則將指定位置0
        返回值:無返回值,函數(shù)里面會更改寄存器值
        例子:My_SetBit((unsigned char*)&PORTB, 2, 1); 將PORTB寄存器中的第2位置1
        函數(shù)描述:
        修改指定寄存器中的指定位,不影響其他位。
        **************************************************/
        /*** 第二版本 ***/
        voidMy_SetBit(unsignedchar*Date,unsignedcharWei,unsignedcharms)
        {
        (((ms) == (0)) ? (*Date &= ~(0x1<}

        /* 延時函數(shù) */
        voiddelay_50us_1602(unsignedintx)
        {
        unsignedchary;
        for(;x>0;x--)
        for(y=19;y>0;y--);
        }

        /* 寫入指定命令 由于是寫操作 R/W 可以直接接地保持低電平即可*/
        voidlcdwrcom_1602(unsignedcharcdat)
        {
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 0);// E置0,即將改變數(shù)據(jù)。不允許1602讀取數(shù)據(jù)(IO口狀態(tài))
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_RS, 0);// RS拉低 表示是命令
        _1602_DATA = cdat;// 將命令送至與1602的8位數(shù)據(jù)口相連接的IO口
        delay_50us_1602(4);// 數(shù)據(jù)建立時間要 >40ns
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 1);// E使能,命令已經(jīng)準備好,通知1602讀取命令(IO口狀態(tài))
        delay_50us_1602(8);// E高電平保持時間要 >150ns,讓1602有時間讀取完整
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 0);// E置0,不允許1602讀取數(shù)據(jù)(IO口狀態(tài))可能改變。
        delay_50us_1602(2);// 根據(jù)時序圖,讓數(shù)據(jù)再保持一小段時間 >10ns
        }
        /* 將指定數(shù)據(jù)寫入顯示屏由于是寫操作 R/W 可以直接接地保持低電平即可*/
        voidlcdwrdata_1602(unsignedchardat)
        {
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 0);// E置0,即將改變數(shù)據(jù)。不允許1602讀取數(shù)據(jù)(IO口狀態(tài))
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_RS, 1);// RS拉高 表示是數(shù)據(jù)
        _1602_DATA = dat;// 將命令送至與1602的8位數(shù)據(jù)口相連接的IO口
        delay_50us_1602(4);// 數(shù)據(jù)建立時間要 >40ns
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 1);// E使能,命令已經(jīng)準備好,通知1602讀取命令(IO口狀態(tài))
        delay_50us_1602(8);// E高電平保持時間要 >150ns,讓1602有時間讀取完整
        My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 0);// E置0,不允許1602讀取數(shù)據(jù)(IO口狀態(tài))可能改變。
        delay_50us_1602(2);// 根據(jù)時序圖,讓數(shù)據(jù)再保持一小段時間 >10ns// 根據(jù)時序圖,讓數(shù)據(jù)保持一小段時間
        }

        /* 初始化 1602 */
        voidlcd_init_1602()
        {// 具體含義請參考 1602官方使用手冊
        lcdwrcom_1602(0x38);//0x38設(shè)置顯示模式為:16X2 顯示,5X7 點陣,8 位數(shù)據(jù)接口
        lcdwrcom_1602(0x0C);//打開顯示光標閃爍
        lcdwrcom_1602(0x06);//顯示光標移動設(shè)置
        lcdwrcom_1602(0x01);//顯示清屏
        }

        /* 綜合函數(shù) API*/
        /* 參數(shù):Show_1602(第一行顯示的數(shù)據(jù), 第二行顯示的數(shù)據(jù), 每個字符顯示的時間)*/
        voidShow_1602(unsignedcharText_1[],unsignedcharText_2[],unsignedintTime)
        {
        unsignedcharn;
        unsignedintTmp;
        unsignedcharTmpA, TmpC, TmpD;

        // 備份IO口原來的配置以備復原,避免影響其他模塊代碼
        TmpA = DDRA;
        TmpC = DDRC;
        TmpD = DDRD;
        // 端口初始化
        DDRA = 0xFF;
        DDRC = 0xC0;
        DDRD = 0x30;

        // 1602 初始化
        lcd_init_1602();

        lcdwrcom_1602(0x80+0x00);// 設(shè)置要顯示(寫入)的位置 0x80-0x8F 第一行的位置
        Tmp = strlen(Text_1);
        if(Tmp)
        {
        for(n=0; n{
        lcdwrdata_1602(Text_1[n]);// 一個字節(jié)一個字節(jié)寫入
        delay_50us_1602(Time);// 延時指定時間 可以達到一個字符一個字符慢慢依次顯示的效果
        }
        }

        lcdwrcom_1602(0x80+0x40);// 設(shè)置要顯示(寫入)的位置 0xC0-0xCF 第二行的位置
        Tmp = strlen(Text_2);
        if(Tmp)
        {
        for(n=0; n{
        lcdwrdata_1602(Text_2[n]);// 一個字節(jié)一個字節(jié)寫入
        delay_50us_1602(Time);// 延時指定時間 可以達到一個字符一個字符慢慢依次顯示的效果
        }
        }

        // 恢復端口原來的設(shè)置避免影響其他模塊的使用。
        DDRA = TmpA;
        DDRC = TmpC;
        DDRD = TmpD;
        }

        /*寫完這個函數(shù)后,靈光一現(xiàn)!擦,被誤導了!霖鋒老師和郭天祥老師是不是都寫懵
        了,搞那么復雜,靠 一個 sprintf 就能搞定。
        void Show_1602_Int(unsigned int Shuzi, unsigned int Time)
        {
        unsigned char Tdate[]="0123456789";
        char Text[33] = {0};
        unsigned int Tmp;
        unsigned int Weishu = 10;
        char Textlen = 0;

        // 判斷位數(shù) ↓
        if(Shuzi < 10 )// 如果是一位數(shù) 則不必拆分 直接引用
        {
        Text[Textlen] = Tdate[Shuzi];
        Show_1602_Char(Text, "", Time);
        return ;
        }

        while(1)// 如果是兩位數(shù)以上 則先判斷幾位
        {
        if(Shuzi>=Weishu && Shuzibreak;
        Weishu*=10;
        }
        // 判斷位數(shù) ↑

        // 將每一位拆分翻譯 ↓
        for(Textlen=0; Weishu; Textlen++)
        {
        Tmp = Shuzi/Weishu;
        Text[Textlen] = Tdate[Tmp];
        Shuzi = Shuzi % Weishu;
        Weishu /= 10;
        }
        // 將每一位拆分翻譯 ↑

        Show_1602_Char(Text, "", Time);
        }
        */


        上一頁 1 2 下一頁

        關(guān)鍵詞: AVR單片機LCD1602模

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 漳州市| 潮州市| 辽宁省| 东辽县| 涞源县| 镇赉县| 惠州市| 进贤县| 鲁甸县| 莫力| 景德镇市| 渭南市| 潍坊市| 田林县| 伊宁县| 礼泉县| 军事| 曲水县| 大同县| 二连浩特市| 吴堡县| 铁力市| 沽源县| 阿坝| 德令哈市| 达孜县| 余庆县| 南雄市| 句容市| 葵青区| 高州市| 朝阳市| 丁青县| 闸北区| 礼泉县| 尤溪县| 易门县| 许昌县| 志丹县| 锡林浩特市| 桑日县|