工科小石头 2023-07-08 23:08 采纳率: 40%
浏览 32

为什么这样写代码LCD1602显示的时间不会持续更新

为什么这样写代码LCD1602显示的时间不会持续更新?
代码如下:
LCD1602库文件是江协科技提供的。

#include <REGX52.H>
#include<LCD1602.h>
#include<intrins.h>
#include<string.h>
 
 
void main()
{
    unsigned char i;
    while(1)
    {
        LCD_Init();
        LCD_ShowString(1,1,__DATE__);//第一行从第一列开始写入实时日期
        LCD_ShowString(2,1,__TIME__);//第二行从第二列开始写入实时时间
        for(i=0;i<1000;i++)
        {
            LCD_Delay();
        }
    }
}


以下是LCD1602库文件部分函数

void LCD_Init()
{
    LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
    LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
    LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
    LCD_WriteCommand(0x01);//光标复位,清屏
}
/**
  * @brief  LCD1602延时函数,12MHz调用可延时1ms
  * @param  无
  * @retval 无
  */
void LCD_Delay()
{
    unsigned char i, j;

    i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
}
/**
  * @brief  LCD1602写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
    LCD_RS=1;
    LCD_RW=0;
    LCD_DataPort=Data;
    LCD_EN=1;
    LCD_Delay();
    LCD_EN=0;
    LCD_Delay();
}

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
    if(Line==1)
    {
        LCD_WriteCommand(0x80|(Column-1));
    }
    else if(Line==2)
    {
        LCD_WriteCommand(0x80|(Column-1+0x40));
    }
}
/**
  * @brief  在LCD1602指定位置开始显示所给字符串
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
    unsigned char i;
    LCD_SetCursor(Line,Column);
    for(i=0;String[i]!='\0';i++)
    {
        LCD_WriteData(String[i]);
    }
}

```

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-09 08:19
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 看下这篇博客,也许你就懂了,链接:单片机中级项目2丨LCD1602滚动显示
    • 除此之外, 这篇博客: 【51单片机】(四)LCD1602调试工具中的 一.了解LCD1602和它的调试函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      LCD1602指的是这个东西:
      在这里插入图片描述
      这玩意需要我们自己插到电路板上去:插上以后,数码管就不能工作了。
      在这里插入图片描述

      LCD1602调试工具常用的调试函数是有这些:在这里插入图片描述
      LCD1602这些调试函数有现成的:
      【注:以下调试函数非本人编写,但是是网络共享资源,转载次数较多,因此不标明转载来源】

      (1) LCD1602.h:

      #ifndef __LCD1602_H__
      #define __LCD1602_H__
      
      //用户调用函数:
      void LCD_Init();
      void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
      void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
      void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
      void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
      void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
      void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
      
      #endif
      

      (2) LCD1602.c:

      #include <REGX52.H>
      
      //引脚配置:
      sbit LCD_RS=P2^6;
      sbit LCD_RW=P2^5;
      sbit LCD_EN=P2^7;
      #define LCD_DataPort P0
      
      //函数定义:
      /**
        * @brief  LCD1602延时函数,12MHz调用可延时1ms
        * @param  无
        * @retval 无
        */
      void LCD_Delay()
      {
      	unsigned char i, j;
      
      	i = 2;
      	j = 239;
      	do
      	{
      		while (--j);
      	} while (--i);
      }
      
      /**
        * @brief  LCD1602写命令
        * @param  Command 要写入的命令
        * @retval 无
        */
      void LCD_WriteCommand(unsigned char Command)
      {
      	LCD_RS=0;
      	LCD_RW=0;
      	LCD_DataPort=Command;
      	LCD_EN=1;
      	LCD_Delay();
      	LCD_EN=0;
      	LCD_Delay();
      }
      
      /**
        * @brief  LCD1602写数据
        * @param  Data 要写入的数据
        * @retval 无
        */
      void LCD_WriteData(unsigned char Data)
      {
      	LCD_RS=1;
      	LCD_RW=0;
      	LCD_DataPort=Data;
      	LCD_EN=1;
      	LCD_Delay();
      	LCD_EN=0;
      	LCD_Delay();
      }
      
      /**
        * @brief  LCD1602设置光标位置
        * @param  Line 行位置,范围:1~2
        * @param  Column 列位置,范围:1~16
        * @retval 无
        */
      void LCD_SetCursor(unsigned char Line,unsigned char Column)
      {
      	if(Line==1)
      	{
      		LCD_WriteCommand(0x80|(Column-1));
      	}
      	else if(Line==2)
      	{
      		LCD_WriteCommand(0x80|(Column-1+0x40));
      	}
      }
      
      /**
        * @brief  LCD1602初始化函数
        * @param  无
        * @retval 无
        */
      void LCD_Init()
      {
      	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
      	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
      	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
      	LCD_WriteCommand(0x01);//光标复位,清屏
      }
      
      /**
        * @brief  在LCD1602指定位置上显示一个字符
        * @param  Line 行位置,范围:1~2
        * @param  Column 列位置,范围:1~16
        * @param  Char 要显示的字符
        * @retval 无
        */
      void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
      {
      	LCD_SetCursor(Line,Column);
      	LCD_WriteData(Char);
      }
      
      /**
        * @brief  在LCD1602指定位置开始显示所给字符串
        * @param  Line 起始行位置,范围:1~2
        * @param  Column 起始列位置,范围:1~16
        * @param  String 要显示的字符串
        * @retval 无
        */
      void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
      {
      	unsigned char i;
      	LCD_SetCursor(Line,Column);
      	for(i=0;String[i]!='\0';i++)
      	{
      		LCD_WriteData(String[i]);
      	}
      }
      
      /**
        * @brief  返回值=X的Y次方
        */
      int LCD_Pow(int X,int Y)
      {
      	unsigned char i;
      	int Result=1;
      	for(i=0;i<Y;i++)
      	{
      		Result*=X;
      	}
      	return Result;
      }
      
      /**
        * @brief  在LCD1602指定位置开始显示所给数字
        * @param  Line 起始行位置,范围:1~2
        * @param  Column 起始列位置,范围:1~16
        * @param  Number 要显示的数字,范围:0~65535
        * @param  Length 要显示数字的长度,范围:1~5
        * @retval 无
        */
      void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
      {
      	unsigned char i;
      	LCD_SetCursor(Line,Column);
      	for(i=Length;i>0;i--)
      	{
      		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
      	}
      }
      
      /**
        * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
        * @param  Line 起始行位置,范围:1~2
        * @param  Column 起始列位置,范围:1~16
        * @param  Number 要显示的数字,范围:-32768~32767
        * @param  Length 要显示数字的长度,范围:1~5
        * @retval 无
        */
      void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
      {
      	unsigned char i;
      	unsigned int Number1;
      	LCD_SetCursor(Line,Column);
      	if(Number>=0)
      	{
      		LCD_WriteData('+');
      		Number1=Number;
      	}
      	else
      	{
      		LCD_WriteData('-');
      		Number1=-Number;
      	}
      	for(i=Length;i>0;i--)
      	{
      		LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
      	}
      }
      
      /**
        * @brief  在LCD1602指定位置开始以十六进制显示所给数字
        * @param  Line 起始行位置,范围:1~2
        * @param  Column 起始列位置,范围:1~16
        * @param  Number 要显示的数字,范围:0~0xFFFF
        * @param  Length 要显示数字的长度,范围:1~4
        * @retval 无
        */
      void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
      {
      	unsigned char i,SingleNumber;
      	LCD_SetCursor(Line,Column);
      	for(i=Length;i>0;i--)
      	{
      		SingleNumber=Number/LCD_Pow(16,i-1)%16;
      		if(SingleNumber<10)
      		{
      			LCD_WriteData(SingleNumber+'0');
      		}
      		else
      		{
      			LCD_WriteData(SingleNumber-10+'A');
      		}
      	}
      }
      
      /**
        * @brief  在LCD1602指定位置开始以二进制显示所给数字
        * @param  Line 起始行位置,范围:1~2
        * @param  Column 起始列位置,范围:1~16
        * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
        * @param  Length 要显示数字的长度,范围:1~16
        * @retval 无
        */
      void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
      {
      	unsigned char i;
      	LCD_SetCursor(Line,Column);
      	for(i=Length;i>0;i--)
      	{
      		LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
      	}
      }
      
      

    • 您还可以看一下 朱有鹏老师的LCD1602和12864显示器-第1季第17部分课程中的 1.17.5.LCD1602控制器的低层时序2小节, 巩固相关知识点

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 7月8日