找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12849|回復: 10
打印 上一主題 下一主題
收起左側(cè)

STC89C52RC單片機驅(qū)動LCD1602的學習過程

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:302494 發(fā)表于 2018-8-7 16:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本人學習單片機有段時間了,前段時間在網(wǎng)上淘了一個最小系統(tǒng)板,和LCD1602A液晶顯示屏。折騰了半天不知道什么原因始終無顯示,檢查連接線沒問題, 最小系統(tǒng)板也沒問題。后來我分析可能是液晶顯示屏是壞的,于是又在網(wǎng)上淘了兩片,6元錢一片;貋硪粶y試依舊沒有顯示。問題在哪呢?把代碼發(fā)給朋友看,朋友檢查了也沒有問題,始終就是第一排黑色方塊。今天閑來沒事又拿出來擺弄,結果打開電源居然有顯示了,但是關閉電源后再開又沒有了,我就反復開關電源了一百多次依舊沒有反應,后來我想既然有一次有顯示代碼就應該沒有問題。那就是硬件了。于是花了兩個小時自己焊接了一個最小系統(tǒng)板,一次成功。由于沒有畫圖直接焊接的,現(xiàn)在把代買與大家分享。大蝦請繞行。

制作出來實物圖如下:


單片機源程序如下:
  1. #include <STC89C5xRC.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define LCD1602_DB P0
  5. sbit LCD1602_RS = P2^0;                                        //數(shù)據(jù)/命令選擇端
  6. sbit LCD1602_RW = P2^1;                                        //讀寫選擇端
  7. sbit LCD1602_EN = P2^2;                                        //使能信號

  8. void InitLcd1602();                                                //初始化液晶函數(shù)
  9. void Lcd1602Show(uchar x,uchar y,uchar *str);                                                //顯示數(shù)據(jù)函數(shù)
  10. /************************************這是主函數(shù)******************************************/
  11. void main()
  12. {
  13.         uchar str[] = "This is demo!";
  14.         InitLcd1602();                                        //初始化液晶
  15.         Lcd1602Show(2,0,str);                                //指定坐標顯示字符串
  16.         Lcd1602Show(0,1,"WeChat:6731663");        //指定坐標顯示字符串
  17.         while(1);
  18. }
  19. /***********************************LCD遇忙等待函數(shù)****************************************/
  20. void LcdWaitReady()
  21. {
  22.         uchar sta;
  23.         LCD1602_DB = 0xFF;
  24.         LCD1602_RS = 0;
  25.         LCD1602_RW = 1;
  26.         do{
  27.                 LCD1602_EN = 1;
  28.                 sta = LCD1602_DB;
  29.                 LCD1602_EN = 0;
  30.         }while(sta & 0x80);                                        //數(shù)據(jù)端口最高位一直為高電平時它會一直等待。
  31. }

  32. /***********************************液晶寫指令函數(shù)*****************************************/
  33. void LCD1602WriteCMD(uchar cmd)
  34. {
  35.         LcdWaitReady();                                                //LCD遇忙等待
  36.         LCD1602_RS = 0;
  37.         LCD1602_RW = 0;
  38.         LCD1602_DB = cmd;
  39.         LCD1602_EN = 1;                                                //使能引腳高脈沖
  40.         LCD1602_EN = 0;
  41. }
  42. /***********************************初始化液晶函數(shù)*****************************************/
  43. void InitLcd1602()
  44. {
  45.         LCD1602WriteCMD(0x38);                                //顯示模式設置:16*2顯示,5*7點陣,8位數(shù)據(jù)接口
  46.         LCD1602WriteCMD(0x0C);                                //顯示開關及光標設置:顯示開,光標關。
  47.         LCD1602WriteCMD(0x06);                                //光標+1,并且整屏不動
  48.         LCD1602WriteCMD(0x01);                                //顯示清零,所有數(shù)據(jù)清零。
  49. }
  50. /**********************************液晶當前坐標函數(shù)****************************************/
  51. void LcdSetCursor(uchar x,uchar y)
  52. {
  53.         uchar addr;
  54.         if(y==0)
  55.         {
  56.                 addr = 0x00 + x;
  57.         }
  58.         else
  59.         {
  60.                 addr = 0x40 + x;
  61.         }
  62.         LCD1602WriteCMD(addr | 0x80);                //LCD數(shù)據(jù)指針必須是0x80開頭
  63. }
  64. /***********************************液晶寫數(shù)據(jù)函數(shù)*****************************************/
  65. void LcdWriteDate(uchar dat)
  66. {
  67.         LcdWaitReady();                                        //遇忙等待
  68.         LCD1602_RS = 1;
  69.         LCD1602_RW = 0;
  70.         LCD1602_DB = dat;
  71.         LCD1602_EN = 1;                                                //使能引腳高脈沖
  72.         LCD1602_EN = 0;
  73. }
  74. /***********************************液晶顯示函數(shù)*******************************************/
  75. void Lcd1602Show(uchar x,uchar y,uchar *str)
  76. {
  77.         LcdSetCursor(x,y);                                        //LCD當前坐標函數(shù)
  78.         while(*str != '\0')                                        //字符串沒有結束時執(zhí)行
  79.         {
  80.                 LcdWriteDate(*str++);                        //傳遞完STR數(shù)據(jù)在對地址加加
  81.                
  82.         }
  83. }
復制代碼

所有資料51hei提供下載:
LCD1602-1.rar (25.52 KB, 下載次數(shù): 151)


評分

參與人數(shù) 2黑幣 +51 收起 理由
紫色月夜 + 1 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:302494 發(fā)表于 2018-8-7 16:47 | 只看該作者
自己搶個沙發(fā)。
回復

使用道具 舉報

板凳
ID:97554 發(fā)表于 2018-8-7 18:08 | 只看該作者
焊的不錯,整整齊齊啊
回復

使用道具 舉報

地板
ID:378745 發(fā)表于 2018-8-7 22:11 | 只看該作者
焊接整齊,贊。
回復

使用道具 舉報

5#
ID:384398 發(fā)表于 2018-8-8 23:08 | 只看該作者
感謝分享!!
回復

使用道具 舉報

6#
ID:390236 發(fā)表于 2018-8-31 11:07 | 只看該作者
焊接整齊
回復

使用道具 舉報

7#
ID:386381 發(fā)表于 2018-8-31 12:31 來自手機 | 只看該作者
這焊工簡直是藝術品呀
回復

使用道具 舉報

8#
ID:414818 發(fā)表于 2019-1-12 21:53 | 只看該作者
焊的挺漂亮的。
回復

使用道具 舉報

9#
ID:535558 發(fā)表于 2020-10-21 13:29 來自手機 | 只看該作者
牛啊,這焊接可以的。
回復

使用道具 舉報

10#
ID:390236 發(fā)表于 2021-6-10 08:45 | 只看該作者
這焊接可以的 就是用焊錫多了一點
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表