[英]Displaying ADC values in LCD1602 using STM32
我正在做一个需要在 LCD 屏幕上显示 ADC 值的项目。 我对编码不太了解,因为我是 STM32IDE 的新手。 本质上,我使用的是 (0–25 v) 电压传感器和 STM32F103C8T6(蓝色药丸)。 我必须使用 LCD 来显示值。 有没有人对此有任何见解或知道如何帮助我?
HAL_ADC_Start(&hadc1);
HD44780_Init(2);
HD44780_Clear();
HD44780_SetCursor(0,0);
HD44780_PrintStr("Vol = ");
while (1)
{
HAL_ADC_PollForConversion(&hadc1,1000);
readValue = HAL_ADC_GetValue(&hadc1);
voltage =(float)readValue/4095*16.5;
HAL_Delay(100);
}
鉴于HD44780_PrintStr()
打印一个字符串,您必须生成一个表示float
值voltage
的字符串。
然后您需要将 cursor 设置为前缀字符串的末尾(第 6 列),并打印字符串表示。 output 末尾的尾随空格将删除以前更长的 output 中的数字。
假设HD44780_SetCursor()
的参数顺序为row, column
:
for(;;)
{
HAL_ADC_PollForConversion(&hadc1,1000);
readValue = HAL_ADC_GetValue(&hadc1);
voltage =(float)readValue/4095*16.5 ;
char vstr[16] ;
sprintf( vstr, "%.2f ", voltage ) ;
HD44780_SetCursor(0,6);
HD44780_PrintStr( vstr ) ;
HAL_Delay(100);
}
如果您想要 integer 部分中的前导零(固定的 2 位宽度); 这有点复杂:
unsigned wholev = (int)voltage ;
unsigned fractv = (int)((voltage - wholev) * 100.0f + 0.5f) ;
char vstr[16] ;
sprintf( vstr, "%02u.%02u", wholev, fractv ) ;
HD44780_SetCursor(0,6);
HD44780_PrintStr( vstr ) ;
但在这种情况下,您不需要尾随空格来删除以前的数字,因为字符串始终是固定宽度"xx.yy"
。 如果可以从sprintf
格式化程序中省略浮点支持,那么代码也可能会变得更小。
除了浮点格式化程序添加大量代码并可能增加堆栈使用量外,请记住您的 MCU 缺乏硬件浮点支持,因此浮点操作既会添加代码又会相当慢。 在简单的应用程序中这可能无关紧要,但通常您应该避免(并且知道如何避免)嵌入式代码中的浮点操作,尤其是在没有 FPU 的情况下 - 即使有 FPU,也有理由避免它用于琐碎的用途,例如在任何情况下都是如此。
浮点代码可以简单地删除,如下所示:
unsigned millivolts = readValue * 16500u / 4095u ;
unsigned wholev = millivolts / 1000u ;
unsigned fractv = ((millivolts + 5u) % 1000) / 10u ;
sprintf( vstr, "%02u.%02u", wholev, fractv ) ;
HD44780_SetCursor(0,6);
HD44780_PrintStr( vstr )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.