通过网盘分享的文件:analog01
链接: https://pan.baidu.com/s/1DyBapsHbtObA1nKxjfEULQ?pwd=rvq9 提取码: rvq9
备战第16届蓝桥杯嵌入式
STM32G431RBT6,CubeMX hal库
之前的模拟题需要展示变幻的字符串时,大多是使用指针数组,通过内部变量的索引变化实现不同的指向,结果用%s展示出来,如:4T.第15届蓝桥杯嵌入式模拟考试1和有关判断接受不定长字符串-CSDN博客
通过条件的判断,改变flagp0,实现三个字符串的显示
void lcd_show(void)
{
char *p0[]={"S","R","L"};
if(flag==0)
{
adc_value();
sprintf(lcd, " DATA ");//20个字符一行
LCD_DisplayStringLine(Line2,(uint8_t *)lcd);
sprintf(lcd, " ");
LCD_DisplayStringLine(Line3,(uint8_t *)lcd);
sprintf(lcd, " N:%s ",p0[flagp0]);
LCD_DisplayStringLine(Line4,(uint8_t *)lcd);
sprintf(lcd, " D:%.1f ",Dis);
LCD_DisplayStringLine(Line5,(uint8_t *)lcd);
}
else
{
sprintf(lcd, " ");//偏离导航界面
LCD_DisplayStringLine(Line2,(uint8_t *)lcd);
sprintf(lcd, " ");
LCD_DisplayStringLine(Line3,(uint8_t *)lcd);
sprintf(lcd, " ");
LCD_DisplayStringLine(Line4,(uint8_t *)lcd);
sprintf(lcd, " W A R N ");
LCD_DisplayStringLine(Line5,(uint8_t *)lcd);
}
}
但这次不同,显示的密码psaaword是3位1组的数字,应该用%c,而不是%s来表示。那么怎么实现“*”与数字的转化呢,向下看:
void lcd_show(void)
{
extract();
if(flag==0)
{
led(0,0);
led(1,1);
sprintf(lcd, " Lock ");//20个字符一行
LCD_DisplayStringLine(Line2,(uint8_t *)lcd);
sprintf(lcd, " ");
LCD_DisplayStringLine(Line3,(uint8_t *)lcd);
sprintf(lcd, " Pass Word ");
LCD_DisplayStringLine(Line4,(uint8_t *)lcd);
sprintf(lcd, " %c%c%c ",
current_input[0] + '0',
(count >= 1) ? (current_input[1] + '0') : '*',
(count >= 2) ? (current_input[2] + '0') : '*');
LCD_DisplayStringLine(Line5,(uint8_t *)lcd);
}
else if(flag==1)
{
led(0,0);
led(2,1);
sprintf(lcd, " Set ");
LCD_DisplayStringLine(Line2,(uint8_t *)lcd);
sprintf(lcd, " ");
LCD_DisplayStringLine(Line3,(uint8_t *)lcd);
sprintf(lcd, " Change ");
LCD_DisplayStringLine(Line4,(uint8_t *)lcd);
sprintf(lcd, " %c%c%c ",
current_input[0] + '0',
(count >= 1) ? (current_input[1] + '0') : '*',
(count >= 2) ? (current_input[2] + '0') : '*');
LCD_DisplayStringLine(Line5,(uint8_t *)lcd);
}
巧妙的利用好ASCII字符,将每个数字转换为对应的字符,并利用好三元运算符,精炼代码结构,让格式看起来赏心悦目。
错误思路:原本我的想法还是用%s来表示,
sprintf(lcd, " Lock ");//20个字符一行
LCD_DisplayStringLine(Line2,(uint8_t *)lcd);
sprintf(lcd, " ");
LCD_DisplayStringLine(Line3,(uint8_t *)lcd);
sprintf(lcd, " Pass Word ");
LCD_DisplayStringLine(Line4,(uint8_t *)lcd);
sprintf(lcd, " %s%s%s ",(char *)&p0,(char *)&p1,(char *)&p2);
LCD_DisplayStringLine(Line5,(uint8_t *)lcd);
//还是想用%s的话就得强制类型转换
//p是一个指针数组,每个元素指向p0、p1、p2的地址,但它们的类型是uint8_t,而转换为char指针
//可能存在类型不匹配的问题。例如,p[0] = (char *)&p0,这里将uint8_t的地址强制转换为char
//指针,然后在sprintf中使用%s格式化字符串,这会导致问题,因为%s期望的是以null结尾的字符串,
//而这里每个指针指向的是一个单字节的数据,不是字符串
更多的代码思路在置顶的链接里,有注释。有更好的思路欢迎交流