模块化编程
一、 模块化定义
以硬件电路或者功能模块为单位,将程序封装成源文件.c和头文件.h(一一对应),其函数在主函数中调用即可,且不影响其它模块。
模块化编程的好处
编写模块化程序,可阅读性强,可移植性强!
我们刚开始写程序的时候通常在主函数main()中,将我们的程序全部写完。这样写不仅移植性差而且阅读性不强!程序较大时还要上下拉查看程序,很麻烦。不方便移植和调用。
二、 模块化具体实现
程序模块化的最小单位就是函数,所以我们在模块化之前,需要先把程序按照不同功能封装建立成不同的函数,先对C语言函数内容做一下回顾
函数定义:
语法:返回值类型 函数名(形参类型 形参名,形参类型 形参名……){ }
返回值类型 就是函数返回值类型(void charint char*...)
函数名 要符合C语言标识符命名规范,能通过函数名就知道函数功能
举例:LED_Init()//LED的初始化
LED3_ON() //LED3点亮
()中先写形参类型再写形参变量名,各形参之间以逗号分隔
函数声明:
直接复制函数头加分号,提前告诉编译器有这种函数的存在,其中形参变量名可不写。
函数调用:
函数在调用时,形参要以实参代替,如果是void则不写,函数返回值为空,void不写,如果有返回值,通常定义相同变量来接收,不用,可以忽略。
源文件*.c(xxx.c)
提到C 语言源文件,大家都不会陌生。因为我们平常写的程序代码几乎都在这个XX.C 文件里面。编译器也是以此文件来进行编译并生成相应的目标文件。作为模块化编程的组成基础,我们所要实现的所有功能的源代码均在这个文件里。 理想的模块化应该可以看成是一个黑盒子。即我们只关心模块提供的功能,而不管模块内部的实现细节。好比我们买了一部手机,我们只需要会用手机提供的功能即可,不需要知道它是如何把短信发出去的,如何响应我们输入的按键,这些过程对我们用户而言,就是一个黑盒子。
在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。而你在编写这个模块的时候很可能就需要利用到别人写好的模块的接口,这个时候我们所关心的是,他的模块实现了什么样的接口,我们该如何去调用,至于模块内部是如何组织的,对于我们而言,无需过多关注。而追求接口的单一性,把不需要的细节尽可能对外部屏蔽起来,正是我们所需要注意的地方。
通常在源文件中包含两部分代码:初始化代码,能保证硬件电路的正常工作,功能函数,单独的功能函数实现具体的功能。
头文件*.h(xxx.h)
谈及到模块化编程,必然会涉及到多文件编译,也就是工程编译。在这样的一个系统中,往往会有多个C 文件,而且每个C文件的作用不尽相同。在我们的C 文件中,由于需要对外提供接口,因此必须有一些函数或者是变量提供给外部其它文件进行调用。该文件通常包含了一些重要的宏定义以及一些结构体声明,外部变量和函数声明。
一般情况下,头文件和源文件一一对应,名字保持一致。以后我们需要调用源文件中的函数或变量,需要包含其头文件即可。
防止头文件重复包含
避免一个头文件被重复包含,通常使用条件编译命令#ifndef--#endif,如下示例: 示例1:
#ifndef TIME_H
#define TIME_H
……
#endif
示例2:
#ifndef LED_H
#define LED_H
……
#endif
其中#define FILENAME_H为基本格式,FILENAME_H为头文件名称,但要全部使用大写形式,使用单下划线后紧跟一个H表明是头文件。不要在宏名最前面加上“_"或“__”,即使用FILENAME_H代替_FILENAME_H_,因为一般以"_"和”__"开头的标识符为系统保留或者标准库使用。
在工程中建立模块化文件 新建-->保存->添加->编辑
led.c--------------SRC
led.h--------------INC
按键
一、 按键介绍
用户和单片机机之间进行信息交互,主要包含两大类,输入设备和输出设备。前边讲的LED流水灯就是简单的输出设备,这节课我们学习一下最常用的输入设备——按键。
常用种类:轻触按键,自锁按键,拨码开关,船型开关,薄膜按键
按键消抖
通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如图
按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40-50ms左右,很难再低了。抖动时间是由按键的机械特性决定的,一般是都会在10ms以下,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。按键消抖可分为硬件消抖和软件消抖。
硬件消抖就是在按键上并联一个电容,如图8所示,利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度。所以实际中使用的并不多。
在绝大多数情况下,我们是用软件即程序来实现消抖的。最简单的消抖原理,就是当检测到按键状态变化后,先等待一个几十ms左右的延时瞬间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就刻意确认按键已经稳定的动作了。
矩阵按键和独立按键
独立按键:开发板的四个按键就是四个独立按键,每个按键
矩阵按键:当需要多个按键的时候,如果做成独立按键会大量占用IO口,因此我们引入了矩阵按键,如图所示,使用了8个IO口来实现16个按键。
二、 软件编程
1, 查看原理图---硬件连接情况
可知:
4条输入线接到单片机的IO口上,当按键K1按下时,+3.3V通过按键K1然后再通过电阻R最终进入GND形成一条通路, KEY1这个引脚就是个高电平。当松开按键后,线路断开, KEY1通过电阻R连接到地,KEY1这个引脚就是个低电平。我们就可以通过KEY1这个IO口的高低电平来判断是否有按键按下。
其他三个按键正好相反,没有按下按键是,IO引脚连接到地为低电平,当按下按键时,IO引脚连接到3.3v为高电平。
KEY1 | PA0 |
KEY2 | PE2 |
KEY3 | PE3 |
KEY4 | PE4 |
2, 芯片手册
查找需要配置的寄存器
第六章 6.3.12 打开PA PE时钟
第七章 通用GPIO
模式----输入
上拉/下拉
3,编程
Key.c
初始化代码
读取按键值函数
Key.h
宏定义/函数声明