久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3130|回復: 3
收起左側

LCD1602點不亮,單片機P0處是倒著接的,逆序函數也不行 求分析

[復制鏈接]
ID:508266 發表于 2019-5-2 19:40 | 顯示全部樓層 |閱讀模式
在做一個關于門禁的項目的時候發現LCD1602點不亮,因為自己的做的板子和開發板不一樣P0處是倒著接的,所以用了一個逆序函數,但還是不行。原函數(不存在逆序函數)的可以在開發板上顯示。不存在接觸不良問題,電位10K和4.7k都試過了。請大家幫我看看程序有沒有問題,謝謝啦。

單片機源程序如下:
  1. /*********************************************************************************
  2. * 【外部晶振】: 11.0592mhz        
  3. * 【主控芯片】: STC89C52
  4. * 【編譯環境】: Keil μVisio3        
  5. * 【程序功能】: LCD1602顯示                                                                                   
  6. * 【使用說明】: 正確接上LCD1602液晶并調節好對比度
  7. *  說明:免費開源,不提供源代碼分析.
  8. **********************************************************************************/
  9. #include <reg52.h>

  10. /*=================================================
  11. *自定義數據類型
  12. =================================================*/
  13. typedef unsigned char uchar;
  14. typedef unsigned int uint;

  15. #define LCD1602_DB P0        //LCD1602數據總線

  16. <font color="#ff0000">sbit LCD1602_RS = P2^5;         //RS端
  17. sbit LCD1602_RW = P2^6;         //RW端
  18. sbit LCD1602_EN = P2^7;         //EN端</font>
  19. //sbit DU = P2^6;//
  20. //sbit WE = P2^7;//數碼管位選段選用于關閉數碼管顯示

  21. unsigned char swapbit(unsigned char udata)                //<font color="#ff0000">逆位顯示</font>
  22. {
  23.   unsigned char ii,tmp=0;
  24.   for(ii=0;ii<8;ii++)
  25.   {
  26.     tmp<<=1;
  27.     if(udata&0x01)
  28.     {
  29.       tmp|=0x01;
  30.     }
  31.     udata>>=1;
  32.   }
  33.   return tmp;
  34. }


  35. /*=================================================
  36. *函數名稱:Read_Busy
  37. *函數功能:判斷1602液晶忙,并等待
  38. =================================================*/
  39. void Read_Busy()
  40. {
  41.         uchar busy;
  42.         LCD1602_DB = 0xff;//復位數據總線
  43.         LCD1602_RS = 0;          //拉低RS
  44.         LCD1602_RW = 1;          //拉高RW讀
  45.         do
  46.         {
  47.                 LCD1602_EN = 1;//使能EN
  48.                 busy = swapbit(LCD1602_DB);//讀回數據
  49.                 LCD1602_EN = 0;         //拉低使能以便于下一次產生上升沿
  50.         }while(busy); //判斷狀態字BIT7位是否為1,為1則表示忙,程序等待
  51. }
  52. /*=================================================
  53. *函數名稱:LCD1602_Write_Cmd
  54. *函數功能:寫LCD1602命令
  55. *調用:Read_Busy();
  56. *輸入:cmd:要寫的命令
  57. =================================================*/
  58. void LCD1602_Write_Cmd(uchar cmd)
  59. {
  60.         Read_Busy();         //判斷忙,忙則等待
  61.         LCD1602_RS = 0;
  62.         LCD1602_RW = 0;        //拉低RS、RW操作時序情況1602課件下中文使用說明基本操作時序章節
  63.         LCD1602_DB = swapbit(cmd);//寫入命令
  64.         LCD1602_EN = 1;         //拉高使能端 數據被傳輸到LCD1602內
  65.         LCD1602_EN = 0;         //拉低使能以便于下一次產生上升沿
  66. }
  67. /*=================================================
  68. *函數名稱:LCD1602_Write_Dat
  69. *函數功能:寫LCD1602數據
  70. *調用:Read_Busy();
  71. *輸入:dat:需要寫入的數據
  72. =================================================*/
  73. void LCD1602_Write_Dat(uchar dat)
  74. {
  75.         Read_Busy();
  76.         LCD1602_RS = 1;
  77.         LCD1602_RW = 0;
  78.         LCD1602_DB = swapbit(dat);
  79.         LCD1602_EN = 1;
  80.         LCD1602_EN = 0;
  81. }
  82. /*=================================================
  83. *函數名稱:LCD1602_Dis_OneChar
  84. *函數功能:在指定位置顯示一個字符
  85. *調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        
  86. *輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
  87.                 dat:需要顯示的數據以ASCLL形式顯示
  88. =================================================*/
  89. /*
  90. void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
  91. {
  92.         if(y)        x |= 0x40;
  93.         x |= 0x80;
  94.         LCD1602_Write_Cmd(x);
  95.         LCD1602_Write_Dat(dat);               
  96. }
  97. */
  98. /*=================================================
  99. *函數名稱:LCD1602_Dis_Str
  100. *函數功能:在指定位置顯示字符串
  101. *調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
  102. *輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
  103.                 *str:需要顯示的字符串
  104. =================================================*/
  105. void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
  106. {
  107.         if(y) x |= 0x40;
  108.         x |= 0x80;
  109.         LCD1602_Write_Cmd(x);
  110.         while(*str != '\0')
  111.         {
  112.                 LCD1602_Write_Dat(*str++);
  113.         }
  114. }
  115. /*=================================================
  116. *函數名稱:Init_LCD1602
  117. *函數功能:1602初始化
  118. *調用:        LCD1602_Write_Cmd();
  119. =================================================*/
  120. void Init_LCD1602()
  121. {
  122.         LCD1602_Write_Cmd(0x38); //設置16*2顯示,5*7點陣,8位數據接口
  123.         LCD1602_Write_Cmd(0x0c); //開顯示
  124.         LCD1602_Write_Cmd(0x06); //讀寫一字節后地址指針加1
  125.         LCD1602_Write_Cmd(0x01); //清除顯示
  126. }

  127. void main()
  128. {
  129. //        int n;
  130.         uchar TestStr[] = {"welcome!"};
  131.         uchar str[] = {"LCD1602 display"};
  132.         //DU = 0;
  133.         //WE = 0;//關閉數碼管顯示
  134.         Init_LCD1602();//1602初始化
  135.         LCD1602_Dis_Str(0, 0, &TestStr[0]);        //顯示字符串
  136.         LCD1602_Dis_Str(0, 1, &str[0]);        //顯示字符串
  137. //        LCD1602_Dis_OneChar(15, 1, 0xff); //顯示一個黑方格  請查表
  138.         while(1);
  139. }
復制代碼

IMG_20190502_192746.jpg
6B2M9GOF9RP30ENP[R1PGVA.png
OV8D48STACZ9X$3IJ1H2BTD.png
回復

使用道具 舉報

ID:96682 發表于 2019-5-2 22:45 | 顯示全部樓層
把 LCD1602 倒過來 PCB 布線不是與單片機端口對應了么,把簡單的問題復雜化。

搞不定切斷線路用飛線方式解決
回復

使用道具 舉報

ID:213173 發表于 2019-5-3 07:07 | 顯示全部樓層
樓主的問題不在逆序函數,在于判忙函數,修改一下就好了。注:仿真不完全代表實際電路有效!
無標題.jpg


  1. /*********************************************************************************
  2. * 【外部晶振】: 11.0592mhz        
  3. * 【主控芯片】: STC89C52
  4. * 【編譯環境】: Keil μVisio3        
  5. * 【程序功能】: LCD1602顯示                                                                                   
  6. * 【使用說明】: 正確接上LCD1602液晶并調節好對比度
  7. *  說明:免費開源,不提供源代碼分析.
  8. **********************************************************************************/
  9. #include <reg52.h>

  10. /*=================================================
  11. *自定義數據類型
  12. =================================================*/
  13. typedef unsigned char uchar;
  14. typedef unsigned int uint;

  15. #define LCD1602_DB P0        //LCD1602數據總線

  16. //<font color="#ff0000">
  17. sbit LCD1602_RS = P2^5;         //RS端
  18. sbit LCD1602_RW = P2^6;         //RW端
  19. sbit LCD1602_EN = P2^7;         //EN端</font>
  20. //sbit DU = P2^6;//
  21. //sbit WE = P2^7;//數碼管位選段選用于關閉數碼管顯示

  22. unsigned char swapbit(unsigned char udata)  //<font color="#ff0000">逆位顯示</font>
  23. {
  24.   unsigned char ii,tmp=0;
  25.   for(ii=0;ii<8;ii++)
  26.   {
  27.     tmp<<=1;
  28.     if(udata&0x01)
  29.     {
  30.       tmp|=0x01;
  31.     }
  32.     udata>>=1;
  33.   }
  34.   return tmp;
  35. }
  36. /*=================================================
  37. *函數名稱:Read_Busy
  38. *函數功能:判斷1602液晶忙,并等待
  39. =================================================*/
  40. bit Read_Busy()
  41. {
  42.         unsigned char LCD_Status;
  43.         LCD1602_RS = 0;
  44.         LCD1602_RW = 1;
  45.         LCD1602_EN = 1;
  46.         LCD_Status = swapbit(LCD1602_DB);
  47.         LCD1602_EN = 0;
  48.         return LCD_Status;
  49. }
  50. /*
  51. void Read_Busy()
  52. {
  53.         uchar busy;
  54.         LCD1602_DB = 0xff;//復位數據總線
  55.         LCD1602_RS = 0;          //拉低RS
  56.         LCD1602_RW = 1;          //拉高RW讀
  57.         do
  58.         {
  59.                 LCD1602_EN = 1;//使能EN
  60.                 busy = swapbit(LCD1602_DB);//讀回數據
  61.                 LCD1602_EN = 0;         //拉低使能以便于下一次產生上升沿
  62.         }while(busy); //判斷狀態字BIT7位是否為1,為1則表示忙,程序等待
  63. }*/
  64. /*=================================================
  65. *函數名稱:LCD1602_Write_Cmd
  66. *函數功能:寫LCD1602命令
  67. *調用:Read_Busy();
  68. *輸入:cmd:要寫的命令
  69. =================================================*/
  70. void LCD1602_Write_Cmd(uchar cmd)
  71. {
  72. //        Read_Busy();         //判斷忙,忙則等待
  73.         while((Read_Busy()&0x80)==0x80);//判忙
  74.         LCD1602_RS = 0;
  75.         LCD1602_RW = 0;        //拉低RS、RW操作時序情況1602課件下中文使用說明基本操作時序章節
  76.         LCD1602_DB = swapbit(cmd);//寫入命令
  77.         LCD1602_EN = 1;         //拉高使能端 數據被傳輸到LCD1602內
  78.         LCD1602_EN = 0;         //拉低使能以便于下一次產生上升沿
  79. }
  80. /*=================================================
  81. *函數名稱:LCD1602_Write_Dat
  82. *函數功能:寫LCD1602數據
  83. *調用:Read_Busy();
  84. *輸入:dat:需要寫入的數據
  85. =================================================*/
  86. void LCD1602_Write_Dat(uchar dat)
  87. {
  88. //        Read_Busy();
  89.         while((Read_Busy()&0x80)==0x80);//判忙
  90.         LCD1602_RS = 1;
  91.         LCD1602_RW = 0;
  92.         LCD1602_DB = swapbit(dat);
  93.         LCD1602_EN = 1;
  94.         LCD1602_EN = 0;
  95. }
  96. /*=================================================
  97. *函數名稱:LCD1602_Dis_OneChar
  98. *函數功能:在指定位置顯示一個字符
  99. *調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        
  100. *輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
  101.                 dat:需要顯示的數據以ASCLL形式顯示
  102. =================================================*/
  103. /*
  104. void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
  105. {
  106.         if(y)        x |= 0x40;
  107.         x |= 0x80;
  108.         LCD1602_Write_Cmd(x);
  109.         LCD1602_Write_Dat(dat);
  110. }
  111. */
  112. /*=================================================
  113. *函數名稱:LCD1602_Dis_Str
  114. *函數功能:在指定位置顯示字符串
  115. *調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
  116. *輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
  117.                 *str:需要顯示的字符串
  118. =================================================*/
  119. void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
  120. {
  121.         if(y) x |= 0x40;
  122.         x |= 0x80;
  123.         LCD1602_Write_Cmd(x);
  124.         while(*str != '\0')
  125.         {
  126.                 LCD1602_Write_Dat(*str++);
  127.         }
  128. }
  129. /*=================================================
  130. *函數名稱:Init_LCD1602
  131. *函數功能:1602初始化
  132. *調用:    LCD1602_Write_Cmd();
  133. =================================================*/
  134. void Init_LCD1602()
  135. {
  136.         LCD1602_Write_Cmd(0x38); //設置16*2顯示,5*7點陣,8位數據接口
  137.         LCD1602_Write_Cmd(0x0c); //開顯示
  138.         LCD1602_Write_Cmd(0x06); //讀寫一字節后地址指針加1
  139.         LCD1602_Write_Cmd(0x01); //清除顯示
  140. }

  141. void main()
  142. {
  143. // int n;
  144.         uchar TestStr[] = {"welcome!"};
  145.         uchar str[] = {"LCD1602 display"};
  146.         //DU = 0;
  147.         //WE = 0;//關閉數碼管顯示
  148.         Init_LCD1602();//1602初始化
  149.         LCD1602_Dis_Str(0, 0,TestStr);    //顯示字符串
  150.         LCD1602_Dis_Str(0, 1,str);        //顯示字符串
  151. //        LCD1602_Dis_OneChar(15, 1, 0xff); //顯示一個黑方格  請查表
  152.         while(1);
  153. }
復制代碼



回復

使用道具 舉報

ID:293387 發表于 2019-5-3 14:28 | 顯示全部樓層
你的P0口是否接有拉電阻。
1ad5ad6eddc451da7124d17db6fd5266d1163252.jpg
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 影音先锋中文字幕在线观看 | 久久91 | 亚洲视频在线看 | 天天天天操 | 精品三级| 久久久久国产精品一区三寸 | www国产亚洲精品久久网站 | a久久| 国产亚洲精品精品国产亚洲综合 | 精品久久国产视频 | 国产精品视频一二三 | 亚洲一区欧美 | 一级免费毛片 | 成人在线精品视频 | 欧美成ee人免费视频 | 91精品国产色综合久久 | 亚洲欧美日韩在线不卡 | a久久| 亚洲精品福利在线 | julia中文字幕久久一区二区 | 美国av片在线观看 | 在线视频一区二区三区 | 成人不卡视频 | 久久99国产精品 | 毛片在线看片 | 国产区在线视频 | 久久91精品久久久久久9鸭 | 欧美精品一区二区三区在线播放 | 成人在线视频免费观看 | 色综合久久天天综合网 | 国产乱码精品一区二三赶尸艳谈 | cao视频| 另类亚洲视频 | 成年人在线视频 | 四虎成人免费视频 | 91精品国产综合久久婷婷香蕉 | 国产成人免费在线 | 欧美a在线 | 久久久久久综合 | 亚洲国产成人精品女人久久久 | 亚洲视频一区在线观看 |