
第5章 GPIO的应用实例.docx
11页第5章GPIO的应用实例:键盘、LED与LCD本章导读:键盘、LED数码管和LCD液晶显示是嵌入式系统中常用的输入 /输出设备,它们一般通过通用I/O 口与MCU连接,本章把它们作为GPIO的 应用实例来看待键盘是嵌入式应用的输入设备,识别按键情况常用查询法、定 时扫描法与中断法等LED和LCD是嵌入式应用的输出设备本章主要知识点 有①键盘扫描基本原理与编程方法;②LED扫描基本原理与编程方法;③字符 型LCD的编程举例在本章讲述的鍵盘、LED和LCD构件设计的一般模型, 可适用于不同型号的设备,但需注意硬件电路设计的差异5.1键盘模块的驱构件设计本节首先简要阐明有关键盘识的一些基本问题随后给出K60的键盘的工作原里基于构 件思想的键盘构件头文件以及源程序文件的设用思想,并给出了一个实际的4x4键盘驱动构件设计与 测试实例5・1・1键盘模型及接口键盘是由若干个按键组成的开关矩阵它是最简WMCU数字量输入设备操作员通过键盘 输入数据或命令,实现简单的人机通言首先 我I'应了解键盘模型及接口的基本概念和原理以便为后续编程做隹备键盘的基本电 路为接触开关通、断两种状态分别表示)和1键盘的电路模型及其实际按键动作见图5-1 所示。
mcu通过检测与®M相连接M/o 口来确定键盘状态到微处理器输入端口图5-1键盘模型及按键抖动示意图其次键盘接口按照不同的标准有不同的分类方去按键盘排布的方式可分成独立方式和矩阵 方式按读入值的方式可分为直读W扫方式按是否进行硬件编码可分成H非编码方式和硬牛 编码方式 按微处理器响应方式可分为中断方式和查询方式本章将使用中断方法编程将以上各种 方式组合可构成不同的键盘接口方式p以下介绍两种较为常用的键盘接口方式1)独立方式独立方式是指将每个独立按键m方式直接接m/o输入线上女忤2所示读健 值时直接读[/ O 口,每个键值通过读入对应[/O的状态来反映所以也称这种方式为一维直读方式习 惯尔为独立式这种方式査键实现简单但占M/O资源较多,一般在按键数■较少勺情况下采用2)矩阵方式矩阵方式是用1条I/O线组成行输入口,m条I/O线组成列输入口,在行线的每一个交点 上设置一个按键女[®-3所示读键值方法一般采用扫描方式艮RMCU输出口按位轮换输出 低电平再从输入口读入键信息最后获得键马这种方式W/O线较少在实际应用系统中采用 较多在使用这种方法时需要考虑硬件连接时需要选择键諏些I脚作为MCU的输入明些作为 MCU的输出,作为MCU的输入的键盘>1需要上立。
设计键盘时,通常小于4个按键的应用,可以使用独立式接口女果于4个按键为了减少寸 微处理器的I/O资源的占用,可以使用矩阵式键盘另I么键盘编程应该注意0些问题呢?下节我fl、就 讨论这个问题这对于实际应常重要■OGND言>5 VD n o o行线笄X炉列线图5-1矩阵式键盘图5-2独立式键盘2.对于键盘编程我I、]至少应该解决下面几个问题0第一,女[何识别键盘上的按键?第二,女何分按键是否真正地被按下还是抖动?第三女何理重键问题? 了解这些问题有于键盘编&1 )键勺识别女如瞰知道健盘上0个键被按下就是键的识别问题若键盘上闭合键的识别由专用硬件实现称 为编码键盘而靠软牛实的称为未编码键盘在这里主要讨论未编码键盘的接口技术和键盘输入呈 序的设计识别是否有键被按下主要有查询法定时扫描去与中断法等而要识3键盘上0个键被 按下主要有行扫描法与行反转去2)抖动问题当键被按下寸,会出现所按的键在闭合位置和断开位置之间®几下才稳定到闭合状态勺勺情况当时也会出现类似勺情况这就是抖动她抖动持续的时'间因操作者而异一般为5 〜10ms,稳定闭合时间一般为十分之秒到几秒由操作者的按键动作所确定在软件上解决抖动勺 方法通常是延迟等待抖动的肖失或多次识别定。
3) 重键问题所谓重键问题就是有两个及两个以上按键同时处于闭合状态的处理问题> 在软件上处理重 键问题通常有连锁法与巡回去5 V0 0 0行线in 1 _尸一.4皆列线 nl n2 (13 n4图5-4 4x4键盘的结构为了正确理解MCU键盘接口方法与编程技术下面以4x4键盘为例说明按键识的基本编程原理4x4的键盘结构如®-4所示,图中歹线伍1〜14)通过电阻接^5V,当键盘上没有键闭合时,所有的行线和线断开,列线11〜14都呈高电平当键盘上某一个键闭合时, 贝该键所对应的行线与列线短洛例如f第2排第3个按键被按 下闭合时,行线m2和列线13短路,此时13线上勺电平由m2 的电位所决定那么如何确定键盘上哪个按键被按下呢?可以把列线11〜14接SMCU的输入口 , 行线ml〜m4接到MCU的输出口,贝在微机的控制下,使行线m1为低电平(0),其余三根行线m2、m3、m4都为高电 平,并读列线11 n4状态女如果11〜14都为高电平贝Ijm1这一行上没有键闭合,女如果读出歹线11〜114的状态不全为高电平 那P么为低电平的列线和m1相交的键处于闭合状态女曝m1这一行上没有键闭合,接着使行线m2为 低电平其余行线为高电平用同样方去检查m2这一行上有无键闭合;以此类推最后使行线m4为 低电平其余的行线为高电平检查m4这一行上是否有键闭合。
这种逐行逐列地检查键盘状态的过 程尔为对键盘的一次扫苗CPU对键盘扫描可以采取程序控制的随机方式CPU空闲时扫B键盘; 也可以采取定时控制每隔^定时间,CPU对键盘扫描一次CPU可随时响应键输入请求还可以 采用中断方式当键盘上有键闭合时,向CPU请求中断,CPU响应键盘输入中断,对键盘扫描以 识别J8一键处于闭合状态并对键盘输入信息做出相应处理CPU对键盘上闭合键的键号确定可 以根据行线和线的状态计算求得也可以根据行线和线状态查表求得5.1.2构件设计本节给出-个实际的4X4键盘驱动构件设计方去讲述如何扫描键盘取得键值和盘编码等 问题o键盘与MCU接线见图5-5 ,图5-6给出了键的定义符号'0”〜9'、“A”〜“D”、“*”、“#”等女如何识别T'键呢?这里将列线11〜14分别接PTIPO、PT1PK PTIP2、PTIP3, 且编程时将这四个I脚定义为输入并进行上拉行线ml〜m4分别接PORTAO〜PORTA3, 且编程寸将PORTAO〜PORTA3定义为输出,那[么“ 1 ”键对应于按照PTIP3、PTIP2, PTIP1、PTIPO、PORTA3、PORTA2、PORTA1、PORTA0 的顺序为 11101110, ^$EE: “2” 键对应于 11011110, 即$DE;…:“D”键对应01110111'艮即$77。
前者T'、“2”、“D”就是我|、的定义值 后者$EE、$DE、$7 7就是‘键值',这种情况'键值'是一个字节这样 按图5-5的接法可以得出键值表见®-6键值 可以通过扫描法获得由键值通过査表法编程得到定义值从软件角度来看,键盘模块具有初始L单次扫描键值、多次扫描键值、键值转换等操作 按照构件的思想可将它I、封装成独立的功I®数KB构件包括头文件b.h和kb.C文牛KB 构件头文忡主要包括相关宏议 KB的功!函数原型说明等内容KB构件程序文件勺内容是 给出KB各功!函数的实现过昱此#,由图5-5可看出,键盘与MCU的PTIP、PORTA部分11 脚连接在进行键盘按键扫描寸,需设置PTIP、PORTA某些|脚的输出或读取某些|脚的状态, 显然在编写键盘KB构牛时,需调用GPIO构牛图5-5键盘与MCU的接法图5-6K1构件给出了表5-1所示的函数的声明和定义表5-1 KB构牛函数序号函数名参数功能1KBInit无键盘初始化2KBScan1无扫描1次4x4键盘返扫扫懸的键值若无按键 返回Oxff3KBScanN重复扫s键盘的次数(KB count)多次扫描键盘消除“抖动”4KBDef键值Valve键值转为定义值5EnableKBlnter无开放键盘中断6DisableKB Inter无禁止键盘中断7KBInterClear无键盘中断清空F面以K60的驱动构件设计为例,给出相应的程序代码。
1.键盘构件头文件(kb.h)2.键盘构件源文件(kb.c) 5.1.3键盘驱动翩测试实例本测试实例调用上节给出的KBI构件,使用UARTO 口和PC通信,当按 下键盘按键时,由串口向PC发送对应的键值键的识别采用上文所讲述的中断 法,故设计了与之相对应的中断处理函数1. 测试工程的主函数(main.c)2. 中断函数(isr.c)测试结果:通过按键可在串口调试工具上显示相应按键的对应键值和定义 值5. 2 LED模的驱构件设计本节在介绍8段数码管(Light Emitting Diode,LED)显示编程原理的基础 上,分析了 LED驱动构件设计方法,并给出了扫描法实现四连排LED显示实 例5.2.1 LED的基知识对于LED编程我们需要了解下列几个问题:第一,所用LED是几段,共阴 极还是共阳极?第二,所选LED的电气参数怎样?如额定功率、额定电流是多 少?如果我们对上述两个问题有明确的了解,那么对LED编程和封装LED构件 就变得容易多了LED的选择需要根据实际应用需求来决定,若只需要显示数字“0” “9,则只需7段LED就够了,若同时又要显示小数点,则需使用8段LED,8段LED 由8个发光二极管组成。
例如,图5-8的8段数码管分别由a、b、c、d、e、f、g位段和小数点位段h (或 记为dp)组成MCU是通过I/O引脚来控制LED某段发光二极管的亮灭从而 达到显示某个数字的目的那么怎样才能使LED发光二极管亮灭呢?首先应了 解所选用的是共阴极数码管还是共阳极数码管若为共阴极数码管,则公共端需要接地,若为共阳极则公共端接电源正极(见图5-7)数码管外形见图5-8abcdcfgdp abode fgdp(a)共阴极 (b)共阳极吉GND1 a,0厂g 口图5-7数码管连接方式 图5-8数码管外形共阴极8段数码管的信号端高电平有效,只要在各位段加上高电平信号即可 使相应的位段发 光,比如要使a段发光,则在a段加上高电平即可共阳极的 8段数码管则相反,在相应的位段 加上低电平即可使该位段发光因而一个8 段数码管就必须有8位(即1个字节)数据来控制各 个位段的亮灭比如对共 阳极8段数码管,PORTBO〜7分别接a〜g、dp,即PORTB=0b01111111时dp 段亮;当PROTB=Ob 10000000时除dp位段外,其他位段均亮到此我们基本 弄清对一个LED编程的原理了,下面我们需要注意的是在进行硬件连接时需要 注意所选用的LED的电气参数,如能承受的最大电流、额定电压。
根据其电气 参数来选择使用限流电阻或电流放大电路下面介绍如何进行多个LED编程,因为在实际应用中往往需要多个LED协 同使用那么是不是如上段述说一样,有几个8段数码管,就必须由几个字节的 数据来控制各个数码管的亮灭?这样控制虽然简单,却不切实际,MCU也不可 能提供这么多的端口用来控制数码管,为此往往是通过一个称为数据口的8位数 据端口来控制位段而8段数码管的公共端,原来接到固定的电平(对共阴极 是GND,对共阳极是Vcc),现在接MCU的一个输。
