王昱顺 发表于 2024-3-14 11:48:04

蓝桥杯问题解决指南(如何快速制作显示界面)

比赛时,我们往往会涉及到多个界面的设计,但是如果使用每个位进行单独赋值的做法,又会造成代码的复用性不高,并且调整起来也较为困难。这里我介绍一种使用Sprintf函数进行显示的方法,可以有效处理数码管的显示问题。并且可以避免显示混乱的问题。具体的思路就是通过一个缓冲区(数组)实现数码管的刷新和显示,然后把这个数组当作字符串使用。使用sprintf对数据进行格式化后填入缓冲区,就可以实现快捷的界面显示了。在这里面,缓冲区作为中间件,使用的是固定刷新模式,防止了因为程序混乱而造成的显示错误。这里看一下这个实现框图,大家应该就明白了。
这里面,最主要的就是实现对数组内字符的解析。下面我们来一步一步的解析这些都是如何实现的。从sprintf开始,这个函数主要作用类似printf函数,不过输出对象不是调用putchar,而是输出到一个指定的字符串
例如下面这行代码:
意思就是将”hello”这个字符串给到show_buf这个数组内。此时,如果访问show_buf,则其中的内容就是字符’h’。需要注意的是,赋值的长度是字符长度+1,因为字符串默认最后一位添加一个’\0’进行标识,用作显示的时候,最好填满缓冲区,这样可以省去解析’\0’的麻烦。虽然现在已经成功把一个字符串放入了数组内,但是仍然需要对其解析后才能成功显示,不然显示的数码管可识别不了字符类型的数据。
以下这个就是我的字符解析器,原理很简单。判断需要显示的位,然后取出显示缓冲区中的字符进行解析,判断到有效范围的就对应段码表给到显示上。此时再通过中断调用以下这个解析显示函数,就可以实现字符的显示了。
此时,构建完主要的解析器以后,做起界面来也就非常简单了。假如现在有8个位的数码管需要显示,内容是A00b01CC。
我们只需要这么写
如果需要将00和01分别替换为变量a和b(变化值)只需要稍加改动

此时便可以轻松显示带有数据变化的界面了
那么,如果出现了奇怪的没有定义的数字应该如何显示?例如我想要显示H,但是解析器里面只有0~9,a~f。这其实也很简单,因为解析器可以对单个字符进行匹配,只需要多加入一行匹配H字符的判断,并且将段码表中的实际H段码关联起来即可。
至此,界面的制作只需要使用字符串就可以控制了,并且可以随意调换。相当的灵活

页: [1]
查看完整版本: 蓝桥杯问题解决指南(如何快速制作显示界面)