系列文章目录
面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计
面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体
面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程
怎么抽象出结构体
在面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计中概述了面向对象的方法写单片机程序是实现程序高内聚、低耦合的方法,在 JAVA 编程中是将其封装成类来实现高内聚的,而在单片机的编程中就是将其抽象成结构体了,那么该如何抽象出对应的结构体呢 ?? 本文将记录如何抽象出结构体。
1、将子系统抽象为结构体分析
本文以输入子系统为示例,记录如何抽象出结构体,下图是示例。如果有比较大的工程时,该如何写程序呢,使用面向对象的编程思想去写程序,增加了系统的可读性、可扩展性、可移植性,在对程序进行分层处理增加程序的兼容性。
如何抽象输入的结构体,使这个结构体支持多个输入方式呢 ? 接下来一起来看一下
要抽象出合适的结构体,就要找他们的属性和功能;其中属性可以定义为变量;功能可以定义为函数指针。
按键、鼠标、触摸屏这三种输入方式的属性和功能如下:
- 按键 :判断哪个按键、按下、松开
- 鼠标 : x,y 方向上的位移,左键、右键、中键、滚轮
- 触摸屏 : x,y 方向上的位移,按下、松开
- 这三种类型的初始化,各自按下、松开实现的功能
- 产生数据的保存
以上这些都是我们在构建结构体时要考虑的因素,以下是基于上述因素抽象的结构体:
2、输入系统结构体
先定义输入的类型:
typedef enum
{
INPUT_EVENT_TYPE_KEY; //按键
INPUT_EVENT_TYPE_MOUSE; //鼠标
INPUT_EVENT_TYPE_TOUCH; //触摸屏
}INPUT_EVENT_TYPE;
在本输入系统中,定义了三个结构体,分别是:输入事件(属性),输入设备的函数(功能),存储输入事件的环形缓冲区。
来看具体结构体:
typedef struct IntputEvent{
TIME_T time; //定义时间类型,可以用来检测,按键单击、双击、长按、短按等。
INPUT_EVENT_TYPE iType; //定义类型
int iX; //定义 x 方向
int iY; //定义 y 方向
int iKey; //定义按键,可以是,左键、右键、中键等
int iPressure; //定义压力,判断按键按下、松开
}IntputEvent, *p_IntputEvent;
typedef struct InputDevice{
char * name; // 类型名字
int (*GetInputEvent)(p_IntputEvent pIntputEvent); //struct IntputEvent * 类型
int (*DeviceInit)(void); //初始化函数
int (*DeviceExit)(void); //函数
struct InputDevice * p_next; //指向下一个的地址,没错,这个结构体就是链表中的节点
}InputDevice, * p_InputDevice;
// struct InputDevice 结构体是链表节点,将所有类型的设备串起来,形成一个链表,放在子系统中,可以快速定位,更能便利的添加删除设备
typedef struct
{
IntputEvent buffer[BUFFER_SIZE]; //环形缓冲区空间存储输入事件,可以宏定义 BUFFER_SIZE 的大小
volatile unsigned int p_W; //写地址
volatile unsigned int p_R; //读地址
}
以上就是输入子系统抽象出的结构体,可以兼容按键、鼠标、触摸屏等设备,以上结构体每句都进行了注释说明。
小结
本文主要讲述单片机程序的面向对象的编程思想中,针对如何抽象出对象设备的结构体,关于程序的分层以及数据产生流程问题,请持续关注本专栏。
学习百问网资源总结笔记。
本专栏文章:
面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计
面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体
面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程