<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

      單片機c51驅動1602A液晶屏的驅動實驗

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2011/5/14
      所需硬件:   1.單片機實驗開發板A
                  2.杜邦頭插線
                  3.16x2液晶顯示字符模塊
                  4.STC89C51RC單片機
      所需軟件:   1. Keil C51 V8.08或Keil_uv3 綠色版本
                  2.STC單片機ISP下載編程軟件


              1602A液晶屏連接圖
      C語言源程序
      /******************************************************************
      ** 1602A液晶屏驅動程序
      ** 晶 振  頻 率:11.0592M
      ** 線路->單片機實驗開發板A
      ******************************************************************/
          #include  
          #define uchar unsigned char
          #define uint unsigned int

          sbit LCM_E=P3^5;  //定義接口
          sbit LCM_RW=P3^6;
          sbit LCM_RS=P3^7;

          #define LCM_Data P1//數據接口

          void LCM_WriteData(uchar WDLCM);
          void LCM_WriteCommand(uchar WCLCM,BuysC);
          uchar LCM_ReadData(void);
          uchar LCM_ReadStatus(void);
          void LCM_Init(void);
          void DisplayOneChar(uchar X, uchar Y, uchar DData);
          void DisplayListChar(uchar X, uchar Y, uchar code *DData);
          void Delay5Ms(void);
          void Delay400Ms(void);

          uchar code uctech[] = {"1602A"};
          uchar code net[] = {"www.52c51.com"};

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

              DisplayListChar(6, 1, uctech);   
              DisplayListChar(0, 0, net);
              LCM_ReadData();//測試用句無意義
              LCM_Data=255;
              while(1);
          }

      /****************************1602A寫數據函數**************************/
      /*函數原型:void LCM_WriteData(uchar WDLCM)
      /*函數功能:1602A寫數據
      /*輸入參數:要寫入的數據
      /*輸出參數:無
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          void LCM_WriteData(uchar WDLCM)
          {
              LCM_ReadStatus(); //檢測忙
              LCM_Data = WDLCM;
              LCM_RS = 1;
              LCM_RW = 0;
              LCM_E = 0; //若晶振速度太高可以在這后加小的延時
              LCM_E = 0; //延時
              LCM_E = 1;
          }

      /****************************1602A寫指令函數**************************/
      /*函數原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
      /*函數功能:1602A寫指令
      /*輸入參數:要寫入的指令
      /*輸出參數:無
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          void LCM_WriteCommand(uchar WCLCM,BuysC) //BuysC為0時忽略忙檢測
          {
              if (BuysC) LCM_ReadStatus(); //根據需要檢測忙
              LCM_Data = WCLCM;
              LCM_RS = 0;
              LCM_RW = 0;
              LCM_E = 0;
              LCM_E = 0;
              LCM_E = 1;
          }

      /****************************1602A讀數據函數**************************/
      /*函數原型:uchar LCM_ReadData(void)
      /*函數功能:1602A讀數據
      /*輸入參數:無
      /*輸出參數:1602A返回的數據
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          uchar LCM_ReadData(void)
          {
              LCM_RS = 1;
              LCM_RW = 1;
              LCM_E = 0;
              LCM_E = 0;
              LCM_E = 1;
              return(LCM_Data);
          }

      /****************************1602A讀狀態函數**************************/
      /*函數原型:uchar LCM_ReadData(void)
      /*函數功能:1602A讀狀態
      /*輸入參數:無
      /*輸出參數:1602A返回的狀態
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          uchar LCM_ReadStatus(void)
          {
              LCM_Data = 0xFF;
              LCM_RS = 0;
              LCM_RW = 1;
              LCM_E = 0;
              LCM_E = 0;
              LCM_E = 1;
              while (LCM_Data & 0x80); //檢測忙信號
              return(LCM_Data);
          }

      /****************************1602A初始化函數**************************/
      /*函數原型:void LCM_Init(void)
      /*函數功能:1602A初始化
      /*輸入參數:無
      /*輸出參數:無
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          void LCM_Init(void)
          {
              LCM_Data = 0;
              LCM_WriteCommand(0x38,0); //三次顯示模式設置,不檢測忙信號
              Delay5Ms();
              LCM_WriteCommand(0x38,0);
              Delay5Ms();
              LCM_WriteCommand(0x38,0);
              Delay5Ms();

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

      /******************1602A按指定位置顯示一個字符函數**********************/
      /*函數原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
      /*函數功能:1602A按指定位置顯示一個字符
      /*輸入參數:X坐標 Y坐標 要顯示的字符
      /*輸出參數:無
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          void DisplayOneChar(uchar X, uchar Y, uchar DData)
          {
              Y &= 0x1;
              X &= 0xF; //限制X不能大于15,Y不能大于1
              if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
              X |= 0x80; // 算出指令碼
              LCM_WriteCommand(X, 0); //這里不檢測忙信號,發送地址碼
              LCM_WriteData(DData);
          }

      /*******************1602A按指定位置顯示一串字符函數*********************/
      /*函數原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
      /*函數功能:1602A按指定位置顯示一個字符
      /*輸入參數:X坐標 Y坐標 要顯示字符串的首地址
      /*輸出參數:無
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          void DisplayListChar(uchar X, uchar Y, uchar code *DData)
          {
              uchar 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)
      /*函數功能:5ms延時
      /*輸入參數:無
      /*輸出參數:無
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
          void Delay5Ms(void)
          {
              unsigned int TempCyc = 5552;
              while(TempCyc--);
          }

      /********************400ms延時延時函數************************/
      /*函數原型:void Delay400Ms(void)
      /*函數功能:400ms延時延時
      /*輸入參數:無
      /*輸出參數:無
      /*調用模塊:
      /*建立時間:2005/11/14
      /*作者:站長
      /**********************************************************************/
      void Delay400Ms(void)
      {
      uchar TempCycA = 5;
      unsigned int TempCycB;
      while(TempCycA--)
      {
         TempCycB=7269;
         while(TempCycB--);
      };
      }
      keil工程文件打包下載yejing_c.rar

      匯編語言源程序
      /******************************************************************
      ** 1602A液晶屏驅動程序
      ** 晶 振  頻 率:11.0592M
      ** 線路->單片機實驗開發板A
      ******************************************************************/

                  LCM_RS EQU P3.7  ;//定義接口
                  LCM_RW EQU P3.6
                  LCM_E EQU P3.5

                  LCM_Data EQU P1  ;數據接口

                  ORG 0000H   ;從0000H處開始
                  SJMP MAIN   ;跳轉到MAIN處

                  ORG 0030H   ;主程序從0030H處開始
      MAIN:       MOV SP,#70H   ;堆棧指針指向70H
                  LCALL INITIAL   ;調用啟動LCM子程序進行初始化
                  LCALL CLS   ;調用清除LCM子程序
                  MOV A,#80H   ;向A送立即數80H設定顯示地址為第一行第一列
                  LCALL WRITE_COM  ;調用寫指令到LCM子程序
                  MOV DPTR,#LINE1  ;將第一行字符串的啟始地址送如DPTR中
                  LCALL DISP   ;調用顯示字符串到LCM子程序
                  MOV A,#0C0H   ;向A送立即數0C0H設定顯示地址為第二行第一列
                  LCALL WRITE_COM  ;調用寫指令到LCM子程序
                  MOV DPTR,#LINE2  ;將第二行字符串的啟始地址送如DPTR中
                  LCALL DISP   ;調用顯示字符串到LCM子程序
                  SJMP $   ;程序動態停機

      LINE1:      DB " www.52c51.com ",00H ;第一行字符串
      LINE2:      DB "   1602A   ",00H ;第二行字符串

      INITIAL:    MOV A,#38H   ;啟動LCM子程序
                  LCALL WRITE_COM
                  MOV A,#0EH
                  LCALL WRITE_COM
                  MOV A,#06H
                  LCALL WRITE_COM
                  RET

      CHECK_BUSY: PUSH ACC   ;查詢忙碌信號子程序
      BUSY_LOOP:  CLR LCM_E
                  SETB LCM_RW
                  CLR LCM_RS
                  SETB LCM_E
                  MOV A,LCM_Data
                  CLR LCM_E
                  JB ACC.7,BUSY_LOOP
                  POP ACC
                  LCALL DEL
                  RET

      WRITE_COM:  LCALL CHECK_BUSY;寫指令到LCM子程序
                  CLR LCM_E
                  CLR LCM_RS
                  CLR LCM_RW
                  SETB LCM_E
                  MOV LCM_Data,A
                  CLR LCM_E
                  RET

      WRITE_DATA: LCALL CHECK_BUSY ;寫數據到LCM子程序
                  CLR LCM_E
                  SETB LCM_RS
                  CLR LCM_RW
                  SETB LCM_E
                  MOV LCM_Data,A
                  CLR LCM_E
                  RET

      CLS:        MOV A,#01H  ;清除LCM子程序
                  LCALL WRITE_COM
                  RET

      DEL:        MOV R6,#5   ;2.7ms延時子程序
      D1:         MOV R7,#248
                  DJNZ R7,$
                  DJNZ R6,D1
                  RET

      DISP:       PUSH ACC   ;將A的內容壓棧
      DISP_LOOP:  CLR A   ;A清零
                  MOVC A,@A+DPTR  ;查表將字符串內容送入A
                  JZ END_DISP  ;若查到的內容為0則終止查表
                  LCALL WRITE_DATA  ;調用寫數據到LCM子程序
                  INC DPTR   ;DPTR加1指向下一個對象
                  SJMP DISP_LOOP  ;跳轉到DISP_LOOP循環執行
      END_DISP:   POP ACC   ;彈出壓棧內容至A
                  RET

                  END    ;程序結束
      keil工程文件打包下載 yejing_asm.rar
      Tags:單片機驅動,1602液晶屏  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 91在线亚洲综合在线| 伊人色综合久久天天| 一本色道久久88亚洲综合| 伊人久久综合无码成人网| 久久久久久青草大香综合精品| 狠狠做深爱婷婷久久综合一区| 国产综合在线观看视频| 久久综合久久性久99毛片| 亚洲人成综合在线播放| 天天综合天天看夜夜添狠狠玩| 亚洲中文字幕无码久久综合网| 天天影视色香欲性综合网网站| 青青草原综合久久大伊人精品| 久久狠狠色狠狠色综合| 一本色道久久综合一区| 狠狠色噜狠狠狠狠色综合久 | 久久综合五月丁香久久激情| 久久99国产综合精品| 狠狠色丁香婷婷综合尤物| 综合久久久久久中文字幕| 久久久久青草线蕉综合超碰| 美腿丝袜亚洲综合| 丁香伊人五月综合激激激| 伊人色综合久久天天网| 国产成人人综合亚洲欧美丁香花| 久久综合香蕉国产蜜臀AV| 久久综合给合综合久久| 国产精品国产色综合色| 97久久天天综合色天天综合色hd | 亚洲综合免费视频| 久久久久久综合网天天| 亚洲综合激情九月婷婷| 亚洲av一综合av一区| 97色伦图片97综合影院久久| 久久综合久久自在自线精品自 | 五月天激情综合网| 久久99国产综合精品女同| 久久婷婷午色综合夜啪| 日日狠狠久久偷偷色综合免费 | 亚洲国产综合在线| 伊人色综合久久天天|