首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将数字的最后一个数字转换为字符并在LCD上显示?

如何将数字的最后一个数字转换为字符并在LCD上显示?
EN

Stack Overflow用户
提问于 2021-08-20 11:14:57
回答 2查看 136关注 0票数 1

我最近买了一个STM8单片机,它有内置的LCD_GLASS_DisplayString("STRING")函数。

该函数的问题是,正如您在下面看到的,我不能直接在其上显示一个整数:

代码语言:javascript
运行
复制
void LCD_GLASS_DisplayString(uint8_t* ptr)
{
  uint8_t i = 0x01;

    LCD_GLASS_Clear();
  /* Send the string character by character on lCD */
  while ((*ptr != 0) & (i < 8))
  {
    /* Display one character on LCD */
    LCD_GLASS_WriteChar(ptr, FALSE, FALSE, i);

    /* Point on the next character */
    ptr++;

    /* Increment the character counter */
    i++;
  }
}

如何修改它,以便直接发送整数?而且,我不确定我是否可以使用任何库,所以只使用纯C就会有所帮助。

我在想这样的事,但没有用:

代码语言:javascript
运行
复制
void LCD_GLASS_DisplayINT(uint16_t integer)
{
  uint8_t i = 0x01;

    LCD_GLASS_Clear();
  /* Send the string character by character on lCD */
  while ((integer != 0) & (i < 8))
  {
    /* Display one number on LCD */
    LCD_GLASS_WriteChar("0" + integer%10, FALSE, FALSE, i);

    /* Point on the next number*/
    integer=integer/10;

    /* Increment the character counter */
    i++;
  }
}

知道怎么让它工作吗?我需要创建一个函数来显示整数,或者在将它们发送到LCD之前将它们转换成字符串。代码是纯C的,因为我现在正在编程的是纯驱动程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-20 11:17:15

您离"0" + integer%10不远--但是您需要把它当作一个字符-- '0' + integer%10 --并且您需要将LCD_GLASS_WriteChar一个指针传递给这个字符。

这样做的一种方法是:

代码语言:javascript
运行
复制
char* digits = "0123456789";
LCD_GLASS_WriteChar(&digits[integer % 10], FALSE, FALSE, i);

另外,循环条件- while ((integer != 0) & (i < 8))不应该使用按位和(&),而是使用逻辑和(&&)。

代码语言:javascript
运行
复制
while ((integer != 0) && (i < 8))
票数 2
EN

Stack Overflow用户

发布于 2021-08-20 13:47:05

您需要将数字存储在缓冲区中,以获得从左到右的顺序。在微控制器上,您可能希望在.bss中分配该缓冲区,这样它就不会占用堆栈。使用static来实现这一点。对于16位数,最多有5位+空项,因此:

代码语言:javascript
运行
复制
static char buf[5+1] = {0};

转换本质上是您编写的代码,只是将'0'"0"混为一谈

代码语言:javascript
运行
复制
for(uint8_t i=0; i<5; i++)
{
  buf[5-i-1] = val%10 + '0';
  val/=10;
}

请注意,这段代码总是将项目buf[5]保持不变,并在那里留下一个零零终止符。

在标准C中完成测试代码,显然,您的定制液晶显示例程会丢弃puts

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdint.h>

void display_int (uint16_t val)
{
  static char buf[5+1] = {0};
  char* p;
  
  for(uint8_t i=0; i<5; i++)
  {
    buf[5-i-1] = val%10 + '0';
    val/=10;
  }
  
  // trim leading zeroes
  for(p=buf; *p!='\0'; p++)
  {
    if(*p!='0' ||    // stop looking at first non zero or 
       p[1]=='\0')   // in case there is only one zero character
      break;
  }
  
  puts(p); // use whatever string printing routine you got
}

int main (void)
{
  display_int(0);
  display_int(5);
  display_int(666);
  display_int(12345);
}

STM8上的部门非常昂贵。如果没有必要,我们可以通过不填充整个缓冲区来对代码进行一些优化。这为我们节省了几个DIV调用。优化版本,更快但更难阅读:

代码语言:javascript
运行
复制
void display_int (uint16_t val)
{
  static char buf[5+1] = {0};
  char* p;
  char* start;
  
  for(uint8_t i=0;;i++)
  {
    buf[5-i-1] = val%10 + '0';
    val/=10;
    if(val==0)
    {
      start = &buf[5-i-1];
      break;
    }
  }
  
  // trim leading zeroes
  for(p=start; *p!='\0'; p++)
  {
    if(*p!='0' ||    // stop looking at first non zero or 
       p[1]=='\0')   // in case there is only one zero character
      break;
  }
  puts(p); // use whatever string printing routine you got
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68861333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档