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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3130|回復(fù): 3
收起左側(cè)

LCD1602點(diǎn)不亮,單片機(jī)P0處是倒著接的,逆序函數(shù)也不行 求分析

[復(fù)制鏈接]
ID:508266 發(fā)表于 2019-5-2 19:40 | 顯示全部樓層 |閱讀模式
在做一個(gè)關(guān)于門禁的項(xiàng)目的時(shí)候發(fā)現(xiàn)LCD1602點(diǎn)不亮,因?yàn)樽约旱淖龅陌遄雍烷_發(fā)板不一樣P0處是倒著接的,所以用了一個(gè)逆序函數(shù),但還是不行。原函數(shù)(不存在逆序函數(shù))的可以在開發(fā)板上顯示。不存在接觸不良問題,電位10K和4.7k都試過了。請大家?guī)臀铱纯闯绦蛴袥]有問題,謝謝啦。

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

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

  15. #define LCD1602_DB P0        //LCD1602數(shù)據(jù)總線

  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;//數(shù)碼管位選段選用于關(guān)閉數(shù)碼管顯示

  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. *函數(shù)名稱:Read_Busy
  37. *函數(shù)功能:判斷1602液晶忙,并等待
  38. =================================================*/
  39. void Read_Busy()
  40. {
  41.         uchar busy;
  42.         LCD1602_DB = 0xff;//復(fù)位數(shù)據(jù)總線
  43.         LCD1602_RS = 0;          //拉低RS
  44.         LCD1602_RW = 1;          //拉高RW讀
  45.         do
  46.         {
  47.                 LCD1602_EN = 1;//使能EN
  48.                 busy = swapbit(LCD1602_DB);//讀回?cái)?shù)據(jù)
  49.                 LCD1602_EN = 0;         //拉低使能以便于下一次產(chǎn)生上升沿
  50.         }while(busy); //判斷狀態(tài)字BIT7位是否為1,為1則表示忙,程序等待
  51. }
  52. /*=================================================
  53. *函數(shù)名稱:LCD1602_Write_Cmd
  54. *函數(shù)功能:寫LCD1602命令
  55. *調(diào)用: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操作時(shí)序情況1602課件下中文使用說明基本操作時(shí)序章節(jié)
  63.         LCD1602_DB = swapbit(cmd);//寫入命令
  64.         LCD1602_EN = 1;         //拉高使能端 數(shù)據(jù)被傳輸?shù)絃CD1602內(nèi)
  65.         LCD1602_EN = 0;         //拉低使能以便于下一次產(chǎn)生上升沿
  66. }
  67. /*=================================================
  68. *函數(shù)名稱:LCD1602_Write_Dat
  69. *函數(shù)功能:寫LCD1602數(shù)據(jù)
  70. *調(diào)用:Read_Busy();
  71. *輸入:dat:需要寫入的數(shù)據(jù)
  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. *函數(shù)名稱:LCD1602_Dis_OneChar
  84. *函數(shù)功能:在指定位置顯示一個(gè)字符
  85. *調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        
  86. *輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行)
  87.                 dat:需要顯示的數(shù)據(jù)以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. *函數(shù)名稱:LCD1602_Dis_Str
  100. *函數(shù)功能:在指定位置顯示字符串
  101. *調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
  102. *輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值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. *函數(shù)名稱:Init_LCD1602
  117. *函數(shù)功能:1602初始化
  118. *調(diào)用:        LCD1602_Write_Cmd();
  119. =================================================*/
  120. void Init_LCD1602()
  121. {
  122.         LCD1602_Write_Cmd(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  123.         LCD1602_Write_Cmd(0x0c); //開顯示
  124.         LCD1602_Write_Cmd(0x06); //讀寫一字節(jié)后地址指針加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;//關(guān)閉數(shù)碼管顯示
  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); //顯示一個(gè)黑方格  請查表
  138.         while(1);
  139. }
復(fù)制代碼

IMG_20190502_192746.jpg
6B2M9GOF9RP30ENP[R1PGVA.png
OV8D48STACZ9X$3IJ1H2BTD.png
回復(fù)

使用道具 舉報(bào)

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

搞不定切斷線路用飛線方式解決
回復(fù)

使用道具 舉報(bào)

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


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

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

  15. #define LCD1602_DB P0        //LCD1602數(shù)據(jù)總線

  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;//數(shù)碼管位選段選用于關(guān)閉數(shù)碼管顯示

  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. *函數(shù)名稱:Read_Busy
  38. *函數(shù)功能:判斷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;//復(fù)位數(shù)據(jù)總線
  55.         LCD1602_RS = 0;          //拉低RS
  56.         LCD1602_RW = 1;          //拉高RW讀
  57.         do
  58.         {
  59.                 LCD1602_EN = 1;//使能EN
  60.                 busy = swapbit(LCD1602_DB);//讀回?cái)?shù)據(jù)
  61.                 LCD1602_EN = 0;         //拉低使能以便于下一次產(chǎn)生上升沿
  62.         }while(busy); //判斷狀態(tài)字BIT7位是否為1,為1則表示忙,程序等待
  63. }*/
  64. /*=================================================
  65. *函數(shù)名稱:LCD1602_Write_Cmd
  66. *函數(shù)功能:寫LCD1602命令
  67. *調(diào)用: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操作時(shí)序情況1602課件下中文使用說明基本操作時(shí)序章節(jié)
  76.         LCD1602_DB = swapbit(cmd);//寫入命令
  77.         LCD1602_EN = 1;         //拉高使能端 數(shù)據(jù)被傳輸?shù)絃CD1602內(nèi)
  78.         LCD1602_EN = 0;         //拉低使能以便于下一次產(chǎn)生上升沿
  79. }
  80. /*=================================================
  81. *函數(shù)名稱:LCD1602_Write_Dat
  82. *函數(shù)功能:寫LCD1602數(shù)據(jù)
  83. *調(diào)用:Read_Busy();
  84. *輸入:dat:需要寫入的數(shù)據(jù)
  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. *函數(shù)名稱:LCD1602_Dis_OneChar
  98. *函數(shù)功能:在指定位置顯示一個(gè)字符
  99. *調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        
  100. *輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行)
  101.                 dat:需要顯示的數(shù)據(jù)以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. *函數(shù)名稱:LCD1602_Dis_Str
  114. *函數(shù)功能:在指定位置顯示字符串
  115. *調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
  116. *輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值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. *函數(shù)名稱:Init_LCD1602
  131. *函數(shù)功能:1602初始化
  132. *調(diào)用:    LCD1602_Write_Cmd();
  133. =================================================*/
  134. void Init_LCD1602()
  135. {
  136.         LCD1602_Write_Cmd(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  137.         LCD1602_Write_Cmd(0x0c); //開顯示
  138.         LCD1602_Write_Cmd(0x06); //讀寫一字節(jié)后地址指針加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;//關(guān)閉數(shù)碼管顯示
  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); //顯示一個(gè)黑方格  請查表
  152.         while(1);
  153. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产99免费 | 日韩精品一区二区三区中文在线 | 97超碰在线免费 | 97av视频在线 | 91视频大全 | 国产精品久久久久久久久久三级 | 亚洲视频免费 | 久久综合激情 | 91av精品| 精品不卡 | 中文字幕日韩欧美 | 久久久性色精品国产免费观看 | av天天操 | 91精品国产91久久久久久丝袜 | 岛国在线免费观看 | 亚洲精品www | 亚洲综合大片69999 | 午夜免费视频 | 日本精品一区二区三区视频 | 日本字幕在线观看 | 日本不卡一区二区三区在线观看 | 日本成人三级电影 | 蜜桃视频在线观看免费视频网站www | аⅴ资源新版在线天堂 | 成人av一区二区亚洲精 | 久久精品一区二区 | 91色在线视频 | 精品亚洲一区二区三区四区五区 | 五月天天丁香婷婷在线中 | 成人国产在线视频 | 国产美女黄色片 | 婷婷综合在线 | 丁香婷婷综合激情五月色 | 日日干夜夜草 | 黄网站色大毛片 | 成人毛片网站 | 国产精品久久久久久久久久久免费看 | 黄色欧美| 色综合久久久 | 国产乱码精品一区二区三区中文 | 亚洲久草视频 |