单片机之面向对象编程(一)
引言
c语言本身虽然并不具备面向对象的特性,但是我们可以通过某些技巧实现类似面向对象的特性(并不严谨)以提高代码复用性和效率。
继承
如果我们把C文件看做一个类,那么继承这个概念是比较好实现的,通过对全局变量和函数添加static修饰符可以实现public继承和private继承。

oled类需要调用spi类(底层)的方法,其中getConfig只在spi类中使用。而其它方法则可 以通过引用头文件或者extern来引用。
类的实现
回顾一下在单片机的底层开发中,比如我们要开发一个OLED的屏幕驱动,一般来说相应的流程是写一个"oled.h"、"oled.c",然后在我们的主循环中去调用。但是当我们的项目中需要使用两个相同的OLED的屏幕时,比较简单粗暴的方法是将"oled.h"、"oled.c"复制成两份"oled1.h","oled2.h"然后在具体文件中修改引脚定义等等,但是这样的代码重复性太高,一旦想要修改时四个文件都要修改很不方便。但是在C++中我们却可以通过类的实例化生成任意个数的对象。比如:
通过将oled1和oled2的数据引脚(两个oled的差异之处)分别记录保存下来然后当调用底层时去操作相应的引脚以实现同一份代码操作不同的硬件。
C++中构造方法主要作用是实例化时传入参数(主要是变量),这样可以得到不同对象。C++中对象变量和方法的分配由系统自动完成。而C中我们可以通过malloc来为我们的对象分配内存。具体构造函数的实现:
析构函数的实现:
通过对obj参数不断地将具体操作的IO口或者片内外设等参数传递到底层来实现同一个函数控制多个液晶屏:
主函数main.c中的使用方法,其中setup只会在上电后执行一遍,loop会不断循环执行:
具体效果,画面有斜线是相机拍摄原因,肉眼是没有的,可以看到两个屏幕虽然使用了不同的SPI外设(SPI2和SPI3),以及不同的rst,dc,cs引脚,但是通过同一套函数点亮了:

完整的代码:
其中gpio_xxx和spi_xxx等api是对底层的控制函数,该api框架是在stm32上开发的类Arduino框架,目前不太完善,后续会在github上开源(预告)。该文章是我的第一篇专栏,旨在分享一些我在开发中的经验。