我正在进行一个项目,该项目要求在LCD屏幕上显示ADC值。我对编码不太了解,因为我是STM32IDE的新手。从本质上讲,我使用的是(0–25 v(电压传感器和STM32F103C8T6(蓝色药丸(。我必须用液晶显示器来显示数值。有人对此有任何见解或知道如何帮助我吗?
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
的字符串表示。
然后,您需要将光标设置到前缀字符串的末尾(第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 )