<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          AVR 單片機(jī)學(xué)習(xí)筆記–LCD1602模塊

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


          六、電路圖

          本文引用地址:http://www.ex-cimer.com/article/201611/323868.htm

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

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

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

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

          七、完整代碼。

          // 代碼功能:驅(qū)動(dòng)LCD1602顯示屏
          // 平臺(tái):DB-51 Ver2.1開(kāi)發(fā)板
          // 控制芯片:ATmega16A
          //時(shí)鐘:片內(nèi)時(shí)鐘
          // 設(shè)計(jì)者: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 由于只是寫(xiě)操作,所以R/W直接接地即可。

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

          /**************************************************
          設(shè)計(jì)者: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
          返回值:無(wú)返回值,函數(shù)里面會(huì)更改寄存器值
          例子:My_SetBit((unsigned char*)&PORTB, 2, 1); 將PORTB寄存器中的第2位置1
          函數(shù)描述:
          修改指定寄存器中的指定位,不影響其他位。
          **************************************************/
          /*** 第二版本 ***/
          voidMy_SetBit(unsignedchar*Date,unsignedcharWei,unsignedcharms)
          {
          (((ms) == (0)) ? (*Date &= ~(0x1<}

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

          /* 寫(xiě)入指定命令 由于是寫(xiě)操作 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ù)建立時(shí)間要 >40ns
          My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 1);// E使能,命令已經(jīng)準(zhǔn)備好,通知1602讀取命令(IO口狀態(tài))
          delay_50us_1602(8);// E高電平保持時(shí)間要 >150ns,讓1602有時(shí)間讀取完整
          My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 0);// E置0,不允許1602讀取數(shù)據(jù)(IO口狀態(tài))可能改變。
          delay_50us_1602(2);// 根據(jù)時(shí)序圖,讓數(shù)據(jù)再保持一小段時(shí)間 >10ns
          }
          /* 將指定數(shù)據(jù)寫(xiě)入顯示屏由于是寫(xiě)操作 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ù)建立時(shí)間要 >40ns
          My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 1);// E使能,命令已經(jīng)準(zhǔn)備好,通知1602讀取命令(IO口狀態(tài))
          delay_50us_1602(8);// E高電平保持時(shí)間要 >150ns,讓1602有時(shí)間讀取完整
          My_SetBit((unsignedchar*)&_1602_CMDIO, _1602_CMDIO_E, 0);// E置0,不允許1602讀取數(shù)據(jù)(IO口狀態(tài))可能改變。
          delay_50us_1602(2);// 根據(jù)時(shí)序圖,讓數(shù)據(jù)再保持一小段時(shí)間 >10ns// 根據(jù)時(shí)序圖,讓數(shù)據(jù)保持一小段時(shí)間
          }

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

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

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

          // 1602 初始化
          lcd_init_1602();

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

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

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

          /*寫(xiě)完這個(gè)函數(shù)后,靈光一現(xiàn)!擦,被誤導(dǎo)了!霖鋒老師和郭天祥老師是不是都寫(xiě)懵
          了,搞那么復(fù)雜,靠 一個(gè) 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);
          }
          */


          上一頁(yè) 1 2 下一頁(yè)

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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();