我正在做一个需要在LCD屏幕上显示ADC值的项目。我对编码不太了解,因为我是STM32IDE新手。本质上,我使用的是(0-25V)电压传感器和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);
}发布于 2022-08-20 11:58:39
如果HD44780_PrintStr()打印一个字符串,则必须生成float值voltage的字符串表示形式。
然后,需要将游标设置为前缀字符串的末尾(第6列),并打印字符串表示形式。输出末尾的尾随空格将擦除以前任何较长的输出中的数字。
假设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);
}如果需要整数部分中的前导零(固定的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 ) https://stackoverflow.com/questions/73425178
复制相似问题