找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 889|回复: 4
收起左侧

求助单片机Proteus仿真LCD1602亮屏不显示字符

[复制链接]
ID:863590 发表于 2023-3-3 13:08 | 显示全部楼层 |阅读模式
求助,为什么显示屏上什么都不显示呀,代码如下

0.png

单片机源程序如下:
  1. #include <REGX52.H>

  2. //引脚配置:
  3. sbit LCD_RS=P2^6;
  4. sbit LCD_RW=P2^5;
  5. sbit LCD_EN=P2^7;
  6. #define LCD_DataPort P0

  7. //函数定义:
  8. /**
  9.   * @brief  LCD1602延时函数,12MHz调用可延时1ms
  10.   * @param  无
  11.   * @retval 无
  12.   */
  13. void LCD_Delay()
  14. {
  15.         unsigned char i, j;

  16.         i = 2;
  17.         j = 239;
  18.         do
  19.         {
  20.                 while (--j);
  21.         } while (--i);
  22. }

  23. /**
  24.   * @brief  LCD1602写命令
  25.   * @param  Command 要写入的命令
  26.   * @retval 无
  27.   */
  28. void LCD_WriteCommand(unsigned char Command)
  29. {
  30.         LCD_RS=0;
  31.         LCD_RW=0;
  32.         LCD_DataPort=Command;
  33.         LCD_EN=1;
  34.         LCD_Delay();
  35.         LCD_EN=0;
  36.         LCD_Delay();
  37. }

  38. /**
  39.   * @brief  LCD1602写数据
  40.   * @param  Data 要写入的数据
  41.   * @retval 无
  42.   */
  43. void LCD_WriteData(unsigned char Data)
  44. {
  45.         LCD_RS=1;
  46.         LCD_RW=0;
  47.         LCD_DataPort=Data;
  48.         LCD_EN=1;
  49.         LCD_Delay();
  50.         LCD_EN=0;
  51.         LCD_Delay();
  52. }

  53. /**
  54.   * @brief  LCD1602设置光标位置
  55.   * @param  Line 行位置,范围:1~2
  56.   * @param  Column 列位置,范围:1~16
  57.   * @retval 无
  58.   */
  59. void LCD_SetCursor(unsigned char Line,unsigned char Column)
  60. {
  61.         if(Line==1)
  62.         {
  63.                 LCD_WriteCommand(0x80|(Column-1));
  64.         }
  65.         else if(Line==2)
  66.         {
  67.                 LCD_WriteCommand(0x80|(Column-1+0x40));
  68.         }
  69. }

  70. /**
  71.   * @brief  LCD1602初始化函数
  72.   * @param  无
  73.   * @retval 无
  74.   */
  75. void LCD_Init()
  76. {
  77.         LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
  78.         LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
  79.         LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
  80.         LCD_WriteCommand(0x01);//光标复位,清屏
  81. }

  82. /**
  83.   * @brief  在LCD1602指定位置上显示一个字符
  84.   * @param  Line 行位置,范围:1~2
  85.   * @param  Column 列位置,范围:1~16
  86.   * @param  Char 要显示的字符
  87.   * @retval 无
  88.   */
  89. void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
  90. {
  91.         LCD_SetCursor(Line,Column);
  92.         LCD_WriteData(Char);
  93. }

  94. /**
  95.   * @brief  在LCD1602指定位置开始显示所给字符串
  96.   * @param  Line 起始行位置,范围:1~2
  97.   * @param  Column 起始列位置,范围:1~16
  98.   * @param  String 要显示的字符串
  99.   * @retval 无
  100.   */
  101. void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
  102. {
  103.         unsigned char i;
  104.         LCD_SetCursor(Line,Column);
  105.         for(i=0;String[i]!='\0';i++)
  106.         {
  107.                 LCD_WriteData(String[i]);
  108.         }
  109. }

  110. /**
  111.   * @brief  返回值=X的Y次方
  112.   */
  113. int LCD_Pow(int X,int Y)
  114. {
  115.         unsigned char i;
  116.         int Result=1;
  117.         for(i=0;i<Y;i++)
  118.         {
  119.                 Result*=X;
  120.         }
  121.         return Result;
  122. }

  123. /**
  124.   * @brief  在LCD1602指定位置开始显示所给数字
  125.   * @param  Line 起始行位置,范围:1~2
  126.   * @param  Column 起始列位置,范围:1~16
  127.   * @param  Number 要显示的数字,范围:0~65535
  128.   * @param  Length 要显示数字的长度,范围:1~5
  129.   * @retval 无
  130.   */
  131. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  132. {
  133.         unsigned char i;
  134.         LCD_SetCursor(Line,Column);
  135.         for(i=Length;i>0;i--)
  136.         {
  137.                 LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
  138.         }
  139. }

  140. /**
  141.   * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
  142.   * @param  Line 起始行位置,范围:1~2
  143.   * @param  Column 起始列位置,范围:1~16
  144.   * @param  Number 要显示的数字,范围:-32768~32767
  145.   * @param  Length 要显示数字的长度,范围:1~5
  146.   * @retval 无
  147.   */
  148. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
  149. {
  150.         unsigned char i;
  151.         unsigned int Number1;
  152.         LCD_SetCursor(Line,Column);
  153.         if(Number>=0)
  154.         {
  155.                 LCD_WriteData('+');
  156.                 Number1=Number;
  157.         }
  158.         else
  159.         {
  160.                 LCD_WriteData('-');
  161.                 Number1=-Number;
  162.         }
  163.         for(i=Length;i>0;i--)
  164.         {
  165.                 LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
  166.         }
  167. }

  168. /**
  169.   * @brief  在LCD1602指定位置开始以十六进制显示所给数字
  170.   * @param  Line 起始行位置,范围:1~2
  171.   * @param  Column 起始列位置,范围:1~16
  172.   * @param  Number 要显示的数字,范围:0~0xFFFF
  173.   * @param  Length 要显示数字的长度,范围:1~4
  174.   * @retval 无
  175.   */
  176. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  177. {
  178.         unsigned char i,SingleNumber;
  179.         LCD_SetCursor(Line,Column);
  180.         for(i=Length;i>0;i--)
  181.         {
  182.                 SingleNumber=Number/LCD_Pow(16,i-1)%16;
  183.                 if(SingleNumber<10)
  184.                 {
  185.                         LCD_WriteData(SingleNumber+'0');
  186.                 }
  187.                 else
  188.                 {
  189.                         LCD_WriteData(SingleNumber-10+'A');
  190.                 }
  191.         }
  192. }

  193. /**
  194.   * @brief  在LCD1602指定位置开始以二进制显示所给数字
  195.   * @param  Line 起始行位置,范围:1~2
  196.   * @param  Column 起始列位置,范围:1~16
  197.   * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  198.   * @param  Length 要显示数字的长度,范围:1~16
  199.   * @retval 无
  200.   */
  201. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  202. {
  203.         unsigned char i;
  204.         LCD_SetCursor(Line,Column);
  205.         for(i=Length;i>0;i--)
  206.         {
  207.                 LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
  208.         }
  209. }

  210. #include <REGX52.H>
  211. #include "LCD1602.H"

  212. void main()
  213. {
  214.         LCD_Init();
  215.         LCD_ShowChar(1,1,'A');
  216.         LCD_ShowString(1,3,"Hello");
  217.         while(1)
  218.         {
  219.                
  220.         }
  221.         
  222. }
复制代码

回复

使用道具 举报

ID:94031 发表于 2023-3-3 15:17 | 显示全部楼层
软件设置与硬件连接不一致.
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
回复

使用道具 举报

ID:1064047 发表于 2023-3-3 15:18 | 显示全部楼层
最后while(1)里面没有东西,程序在这个循环里没出来
回复

使用道具 举报

ID:863590 发表于 2023-3-3 17:14 | 显示全部楼层
xuyaqi 发表于 2023-3-3 15:17
软件设置与硬件连接不一致.
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;

哦哦哦我给看成25 26  27了,感谢
回复

使用道具 举报

ID:863590 发表于 2023-3-3 17:15 | 显示全部楼层
lixiongkuku 发表于 2023-3-3 15:18
最后while(1)里面没有东西,程序在这个循环里没出来

好嘞,已经修改可以正常显示了,感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表