DIY一个简单的LCD驱动程序框架!
今天,我看到了由哥哥Xiao Yao分享的一篇文章:[体系结构]如何在嵌入式编程中对代码结构进行分层,提到了高内聚,低耦合,软件分层等概念。
以前,一个小伙伴在后台留下了一条消息,告诉我分享这样的文章,所以今天就在这里!废话不多,讲太多理论是没有道理的。
这些规则的本质是基于与面向对象设计模式有关的一些理论。
设计模式是一组易于使用的前辈,他们发现了一些规则并在实践中进行了总结。
框架,让我们直接运送干货,坚硬的肝脏!以Cubs提供的SPI OLED驱动程序为例。
我们将对原始开发套件中的LCD驱动器进行一些简单的转换。
然后根据需求设计以下驱动程序模型框架,分为三个部分:模型,驱动程序和设备。
考虑到过于详细的内容,一开始并不会使其变得特别复杂,不利于理解,因此我们构建了以下框架思维导图:1. LCD驱动程序框架数据结构框架提供哪些功能?这就是我的操作方式,非常简单:这是将驱动程序框架与驱动程序连接的能力,而& lcd_driver获得的是在驱动程序文件中定义的已分配结构lcd_driver。
这样,当我在另一个地方时,请在本地定义LCD_Driver_Model的变量,然后将此变量与驱动器结构连接,以便您可以使用此变量来操作驱动器结构中的接口。
2. LCD驱动器数据结构LCD驱动器数据结构要做的是提供一个用于操作LCD驱动器功能的接口。
该接口的设计与硬件无关。
如上一节所述,驱动程序框架取决于驱动程序接口。
在这种情况下,我们需要在驱动程序接口中实现该方法。
在相应的方法中,我们需要调用与LCD设备相关的接口来操作LCD设备。
以下是对应的实现接口:3. LCD设备数据结构LCD设备需要做的是将该数据结构中的功能功能与实际的LCD驱动器接口相连。
例如,让我们看一下LCD_Init接口的实现。
这是实际调用LCD的实际硬件操作:4.使用方法int main(void){/用户代码开始1 * / LCD_Driver_Model LCD_Driver_Model LCD_Ascii_Show_Para ascii_para [] = {80 100,240-80,“红色”,黑色,红色,32},{80、100、240-80,“绿色”,黑色,绿色,32},{80、100、240-80,“蓝色”,黑色,蓝色,32},LCD_Fill_Para fill_para [] = {ascii_para [0] .x,ascii_para [0] .max_width,ascii_para [0] .y,ascii_para [0] .y + 32},ascii_para [0] .y + 32},{ascii_para [0] .x,ascii_para [0] .max_width,ascii_para [0] .y,ascii_para [0] .y + 32},{ascii_para [0]。
1] .x,ascii_para [1] .max_width,ascii_para [1] .y,ascii_para [1] .y + 32},{ascii_para [2] .x,ascii_para [2] .max_width,ascii_para [2] .y ,ascii_para [2] .y + 32},}; / *用户代码结尾1 * / MCU配置------------------------ ---------------- --------------- * / / *重置所有外设,初始化Flash接口和Systick。
* / HAL_Init(); / *用户代码开始Init * /用户代码结束Init * / s时钟* / SystemClock_Config(); / *用户代码开始SysInit * /用户代码开始SysInit * /用户代码开始SysInit * /用户代码开始SysInit * / *初始化所有已配置的外设* / MX_GPIO_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); MX_SPI2_Init(); MX_SPI2_Init();在初始化该串行代码* / USER / CODE_BEGIN * /之后打印* /以防止该串行端口* / *的延迟(200); / *注册驱动程序模型* / Register_Driver_Model(& lcd_model); / *调用LCD初始化* / lcd_model.lcd_driver-> lcd_init(); / *调用LCD以显示ASCII码字符串* / cid_lcd_showr-lcd_model.ilcd_show-&gt ; ascii_para [0]); / *用户代码结尾2 * / / *无限循环* /用户代码开始时* /用户代码同时(1)用户代码/用户代码/结束WH / *用户代码/结束*循环调用LCD以显示ASCII代码字符串* / for(int i = 0; i llcd_model.lcd_driver-> lcd_fill(fill_para [i]); lcd_fill(fill_para [i]); ci ci_d_lcd_as_lcd_as_id_lcd_as_id_lci}}}}}}用户代码END 3 * /},我们已经完成了LCD驱动器的最简单的分层设计,当然,将来我们的软件框架需要继续变得更加强大,以便将来我们可以使用任何LCD,我们都可以设计一套固定的模板这样,并根据实际业务需求定义和设计适当的接口,将来,如果您更改项目或使用相同的LCD,这将非常简单!5.想一想,我之前基于以下内容开放了一个气体检测仪项目TencentOS tiny。
您可以继续对该项目进行优化和改进吗?本节中的代码已与代码同步