16th蓝桥杯嵌入式——模拟程序设计

通过网盘分享的文件:analog01
链接: https://pan.baidu.com/s/1DyBapsHbtObA1nKxjfEULQ?pwd=rvq9 提取码: rvq9

备战第16届蓝桥杯嵌入式

STM32G431RBT6,CubeMX hal库   

一.LCD界面“*”与密码的转换思路

        之前的模拟题需要展示变幻的字符串时,大多是使用指针数组,通过内部变量的索引变化实现不同的指向,结果用%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结尾的字符串,
//而这里每个指针指向的是一个单字节的数据,不是字符串
	

 更多的代码思路在置顶的链接里,有注释。有更好的思路欢迎交流

16th蓝桥杯嵌入式——模拟程序设计_第1张图片16th蓝桥杯嵌入式——模拟程序设计_第2张图片16th蓝桥杯嵌入式——模拟程序设计_第3张图片

你可能感兴趣的:(单片机,stm32,蓝桥杯,c语言)