单片机cpu供电电压是多少正常,但无输出,按键也驱动不了

在嵌入式系统中,用的最多的输入设备就是按键,用户的应用需求可通过相应按键传递到系统软件中,软件转而完成用户请求,实现简单的人机交互。笔者此处就矩阵按键的实现作一个简单的介绍。

按键是一种常开型按钮开关,平时键的二个触点处于断开状态,按下键时它们才闭合。按键控制电路就是用来实时监视按键,当有键接下时,电路监控中的输入引脚电平发生变化,检测到这种变化后,控制电路进行按键扫描,定位按键的位置,并把相关的按键信息反馈回上一层应用中。常见的按键输入设计有独立式按键,矩阵式按键。独立式按键每个键占用一个IO口,电路配置灵活,软件简单,但按键较多时,IO口浪费大。矩阵式按键适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上。节省IO口。通常按键控制电路通过查询方式或中断方式去检测按键的输入,查询方式需占用一定的cpu资源,查询频率太低可能造成按键输入丢失,太高浪费cpu资源,通常按键查询频率约50HZ较合适。中断方式需占用cpu一路外部中断,但不会占用cpu资源,只要有按键按下时,cpu即可马上检测到输入,进行扫描并得到按键值。

笔者此处采用4x4的矩阵按键设计,当然,矩阵键盘可通过四个肖特基二极管构成四输入的与门(可参考笔者这篇文章<浅谈小信号肖特基二极管在数字电路中的应用>),连接到单片机的外部中断引脚,从而实现中断方式检测按键输入。为兼容目前开发板常见的矩阵按键设计,笔者把4x4的矩阵按键接口接在P1口,通过查询方式检测按键输入。


由于我们采用的是查询方式按键设计,因此单片机需一定的频率去扫描P1口的按键,通常这个频率约50HZ较合适,为保证这个扫描频率,通常是通过定时器产生时标周期性进行执行扫描。P1.4~P1.7列线通过上拉电阻接到VCC上,P1.0~P1.3行线产生相应的扫描信号,无按键,列线处于高电平状态,有键按下,列线电平状态将由与此列线相连的行线电平决定。行线电平为低,则列线电平为低,行线电平为高,则列线电平为高。

按键扫描函数如下,该函数需周期执行,以扫描按键的状态。以51单片机为例,P1.0~P1.3逐行输出扫描信号,在Key.h模块头文件实现接口宏KeyOutputSelect()

输出扫描线后,需要读取对应扫描线的按键状态(P1.4~P1.7),同样在Key.h模块头文件实现引脚状态读取接口宏KeyGetPinState()

读取了对应扫描线下的按键引脚状态,就需判断哪些引脚电平为0(按下),对读到的引脚状态进行取反转换成对引脚状态变量进行搜1算法,得到键值的速度能达到最快,并且多个按键同时按下时也能够正确得到优先级最高的按键。按键有效按下会得到0~15的键值,无按键按下时得到键值16。

// 键值为0~15,未按键键值为16,任意多的键按下均能

// 正确返回优先级最高的键值

得到了按键值后,我们需要对按键值进行处理并根据按键状态把可能产生的按键消息保存进缓冲区中,以便用户程序读取处理。按键通常有按下、松手、长按这几个状态,需要支持按下检测、松手检测、长按、连击的功能,并且需要对按键进行去抖滤波。按键的状态往往会在这几种情况进行切换,因此,对按键进行状态机编程是相当清晰的思路。我们在KeyStore()函数中实现对按键状态的转移判断,在模块中我们通过按键状态结构变量KeyState来跟踪记录按键的状态

检测到相应的按键事件后(KEY_UP、KEY_DOWN、KEY_LONG),需产生相应的按键消息保存进按键缓存区,通常可以开辟一个按键队列缓存,以便保存多个产生的按键消息,不会因用户代码未能及时处理按键而造成按键丢失,笔者此处为避免复杂,以一个按键缓冲为例,按键事件结构变量KeyBuffer用来保存按键消息

// 按键扫描得到的键值存放在KeyBuffer中,包含键值及键状态

按键消抖以及长按均是需要以时间为判断标准,我们在模块中定义消抖时间以及长按时间判决以及相应的状态宏

// 按键的扫描周期为20ms

按键扫描可以作为一个任务,需大约20ms进行执行扫描一次,笔者此处例程用数码管显示相应的按键值,数码管扫描函数需2ms进行一位的扫描,因此数码管扫描也可当作一个任务,另外还需一个按键处理任务用来处理按键扫描任务得到按键消息。安排一定量的任务以及保证实时是需要一定的编程模式进行程序设计。笔者此处介绍一种分时处理的思想,这种思想就是用定时器重复进行一定间隔的计时,产生时间片,任务根据这个时标来确定运行、挂起、超时等情况。对于抢占式操作系统如ucos、Linux等操作系统来说,这个定时器对于操作系统就如同人的心脏,操作系统在每个SystemTick会进行各种状态的处理,如任务的延时时间到、任务超时、有高优先级的任务需运行进行上下文切换抢占等。8位单片机运行像ucos这样的很小型操作系统也几乎没有实际意义,因为单操作系统就占用了8位单片机的大部分资源。但我们仍然可以用时间分片的思想来设计我们的8位单片机系统。对于一般任务,我们可以在定时器中断服务程序中判断任务是否需运行,实际的代码执行在完成定时器中断服务后进行调度,这可称为合作型任务,即一旦这个任何运行,只有退出了,其它合作型任务才能得到运行,因为合作型任务是不可抢占的,如果一个任务设计不好,如用了软件延时Delay_ms()让cpu空等浪费,将造成整个合作型任务均没有实时性。确实耗时长的任务应分状态,细分成小任务,保证任务的实时。对于一些需强实时的任务,比如必须精确地在某一时间点执行的任务,可以在定时器中断中执行,此时的任务是抢占型任务,即可打断合作型任务,执行完自身后再中断返回继续执行合作型任务。抢占型任务可能出现的问题就是会同时访问共用的资源,而这一资源往往只能被一个任务独占,造成访问冲突,例如合作型任务正在往串口发送数据”1234”,但发送到”1”时,这时定时器中断来了,执行抢占式任务,抢占式任务也要访问串口发送数据”abcd”,这时在PC机上接收到的串口数据就为”1abcd234”,造成了错误。因此对于抢占型操作系统,访问独占资源,都是需要关调度器或加锁的方法进行访问。

笔者为了让读者有一个认识,把数码管扫描任务及按键扫描任务当作抢占式任务,按键处理任务当作合作型任务。当然,设计一个调度器根据需求是需要实现不同的功能函数的,如调度器数据结构、初始化函数,定时器中断服务程序,调度器增加任务函数,调度器执行任务函数,调度器删除任务函数等。为避免复杂,笔者实现定时器中断服务函数,每个任务的数据结构只有两个任务变量TaskPeriod以及TaskRun,其中TaskPeriod变量用来时标计数,是必须的,TaskRun为任务执行标志,不为0时表明任务需调度执行,因此实际每个任务只需时标计数变量即可。

// 按键处理任务执行周期及执行标记

// 定时器2ms中断处理作为时标

每隔2ms执行实时任务DigitalTube_Scan()以及每隔20ms执行KeyScan(),而对于按键处理任务DoKey()需在按键扫描可能得到键值后才需调度处理,设为22ms执行处理一次即可,在定时器中按键处理任务的时标计数到了22ms后,才设置相关的执行计数标志DoKeyRun,告知调度器需执行按键任务。

调度器简单的判断按键处理任务的执行标志,若需执行,则调用DoKey()执行任务。所有任务执行完后,此时调试器已经无事可做,一般让cpu进入休眠,可以极大的节省功耗,如这个例程,单片机任务并不重,估计90%的时间都在休眠。下一个时间片到来后会唤醒cpu执行定时器中断程序并如此重复任务的调度。

其它任务通过KeyGetValue()函数获得按键扫描的值及按键状态(KEY_UP、KEY_DOWN、KEY_LONG),抢占式任务KeyScan()产生按键消息到缓存区,在任务中调用KeyGetValue()访问按键缓存区时,应先关中断禁止调度,防止访问临界区时发生中断,执行抢占式任务KeyScan()可能同时修改按键缓冲区,KeyGetValue()访问完临界区后即可再开中断。

// 按键扫描任务放在中断中,在访问以下中断任务临界变量时,

// 应关中断,保证不在访问这些变量时产生中断,中断扫描任务

// 同时访问这些变量,造成冲突

在例程中,DoKey()任务为简单的得到键值并在数码管进行显示,按键长按2s会进行长按计数,完整代码见文章给出的链接,包括完整的Keil源码及Proteus仿真工程。

CH451是一个集成的数字显示和键盘扫描驱动器和多功能外围芯片μP监控。 CH451内置RC振荡电路可以动态驱动8个或64个数码管LED发光管,具有BCD译码器,闪烁,移位等功能;而键盘,也可用于扫描64个按键; CH451可以通过串行接口级联到与微控制器交换数据;并提供上电复位和看门狗功能,如监测。

(一)内置高电流驱动电平显示驱动器

●,段电流不小于25毫安,字电流不小于150mA。

●动态显示扫描控制,直接驱动8或64位数码管光管LED。

●可选的数字控制部分和数据不对应的解码相位模式或BCD译码。

●左,右,左环,右环数字控制字的数据。

●每个数字的数字闪存独立控制。

●提供16级亮度是由占空比设置控制。

●支持部分流限调节,可以保存当前的限流电阻。

●扫描限额控制,对于1-8的数字,数字发行的支持才能有效扫描时间。

●内建64键键盘控制器,基于8×8矩阵键盘扫描。下拉电阻

●内置按键状态输入,内置去抖动电路。

●键盘中断,低电平有效输出。

●提供按键释放标志位,可供查询按键按下和释放。

●高速4线串行接口,用于多片级联的支持,时钟速度从0到10MHz。

●串行接口符合DIN和DCLK信号线可以与其它接口电路共用,节省引脚。

●完全内置时钟振荡电路,无需外部晶体或RC振荡。

●内置上电复位和看门狗看门狗,高电平有效和低电平有效复位输出。

●支持3V5V电源电压。

●引脚和功能的基本CH452芯片兼容。

我要回帖

更多关于 单片机供电电压 的文章

 

随机推荐