1、第5章 GPIO的应用实例 键盘、LED与LCD,主要知识点,键盘,5.1,数码管LED,5.2,液晶显示器LCD,5.3,5.1 键盘,键盘模型键盘的基本电路为接触开关,通、断两种状态分别表示0和1。 接口方式 1)独立方式 2)矩阵方式,4,2019/5/14,独立方式:将每个独立按键按一对一的方式直接接到I/O输入线上 矩阵方式:矩阵方式是用n条I/O线组成行输入口,m条I/O线组成列输出口,在行列线的每一个交点上设置一个按键,5,5.1.2键盘键盘编程的基本问题,(1)键的识别识别是否有键被按下,主要有查询法、定时扫描法与中断法等。而要识别键盘上哪个键被按下主要有行扫描法与行反转法。
2、(2)抖动问题当键被按下时,会出现所按的键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况,当释放一个按键时也会出现类似的情况,这就是抖动问题。在软件上,解决抖动的方法通常是延迟等待抖动的消失或多次识别判定 (3)重键问题 所谓重键问题就是有两个及两个以上按键同时处于闭合状态的处理问题。在软件上,处理重键问题通常有连锁法与巡回法。,2019/5/14,6,给出一个实际的4*4键盘编程实例,讲述如何扫描键盘取得键值和键盘编码等问题。,5.1.2 键盘驱动构件设计,键盘驱动构件设计实例,2019/5/14,7,5.1.2 键盘驱动构件设计,4*4键盘与 MCU接法,将列线n1n4分别接AN4A
3、N7,且编程时将AN4AN7定义为输入并进行上拉,行线m1m4分别接AN0AN3,且编程时将AN0AN3定义为输出。,2019/5/14,5.1 键盘,2019/5/14,8,键盘定义及各键相应的键值,9,5.1 键盘,键值计算方法,以上两张图给出了键盘与MCU接线以及键的定义符号“0”“9”、“A”“D”、“*”、“#”等。如何识别“1”键呢?采用逐行逐列地检查键盘状态的方法对键盘扫描。在MCU的控制下,使行线m1为低电平(0),其余三根行线m2、m3、m4都为高电平(1),并读列线n1n4状态。当“1”键被按下时,图中n1状态值为0。则“1”键对应于:AN7AN0=11101110,即$E
4、E;同理“2”键对应于:AN7AN0=11011110,即$DE;“D”键对应于:AN7AN0=01110111,即$77。前者“1”、“2”、“D”就是我们的定义值,后者$EE、$DE、$77就是“键值”,这种情况“键值”是一个字节。这样即可以得出对应于相应接线图的键值表。键值可以通过扫描法获得,由键值通过查表法编程得到定义值。,2019/5/14,10,5.1 键盘,键盘构件程序 包含头文件KB.h和程序文件KB.c,包括对以下函数的声明和定义(需调用GPIO构件):,Void KBInit( void ):初始化键盘模块。Void KBDef( void ):键值转为定义值函数uint8
5、 KBScan1(void):扫描1次4*4键盘,返回扫描到的键值,若无按键,返回0xff uint8 KBScanN(INT8U KB_count):多次扫描键盘,消除“抖动”.uint8 EnableKBInter ():键盘中断使能uint8 DisableKBInter ():键盘中断禁止uint8 KBInterClear() :清键盘中断,2019/5/14,5.1.3 键盘驱动构件测试实例,键盘测试工程 程序功能: 本测试实例调用上节给出的KBI构件,使用UART0口和PC机通信,当按下键盘按键时,由串口向PC机发送对应的键值。键的识别采用上文所讲述的中断法,故设计了与之相对应的
6、中断处理函数。,11,注意,这两个值需用十六进制显示。,2019/5/14,12,5.2 LED模块的驱动构件设计,对数码管编程需要了解的两个问题,一、所用LED是几段,是共阴还是共阳?二、所选LED的电气参数怎样?如额定功率、额定电流是多少?,2019/5/14,13,5.2 LED模块的驱动构件设计,LED的选择需要根据实际应用需求来决定,若只需要显示数字“0”“9”,则只需七段LED就够了,若同时又要显示小数点,则需使用八段LED。 8段数码管由8个发光二极管组成。MCU是通过I/O脚来控制LED某段发光二极管的亮灭从而达到显示某个数字的目的。 8段数码管分别由a、b、c、d、e、f、g
7、位段和小数点位段h(或记为dp)组成。共阴极8段数码管的信号端高电平有效,只要在各位段加上高电平信号即可使相应的位段发光,比如要使a段发光,则在a段加上高电平即可。共阳极的8段数码管则相反,在相应的位段加上低电平即可使该位段发光。 比如对共阳极8段数码管,AN07分别接ag、dp,即MCF_GPIO_PORTAN=0b01111111时dp段亮;当MCF_GPIO_PORTAN=0b10000000时除dp位段外,其他位段均亮。,2019/5/14,14,5.2 LED模块的驱动构件设计,如何对多个LED编程(以8段数码管为例),数据端 通过MCU的一个8位I/0口来控制位段。 控制端 8段数
8、码管的公共端,原来接到固定的电平(对共阴极是GND,对共阳极是Vcc),现在接MCU的一个输出引脚,由MCU来控制,通常叫“位选信号”。而把这些由n个数码管合在一起的数码管组称为n连排数码管。 这样MCU的两个8位端口就可以控制一个8连排的数码管。,15,5.2 LED模块的驱动构件设计,数码管构件程序 包含头文件LED.h和程序文件LED.c,包括对以下函数的声明和定义(需调用GPIO构件):,void LEDInit(void) 定义LED控制引脚的数据口和位选口为输出void LEDShow1(uint8 i, uint8 c) 在第i个LED上显示数字c(要查表转码)void LEDc
9、hangeCode (uint8 num) 将num转换成对应的Dtable中的码,5.2 LED模块的驱动构件设计,LED测试工程 本测试实例调用上节给出的LED构件,使用UART0口和PC机通信。先通过串口向PC机发送Hello World!,然后观察4位LED,显示“2012”四位数字。,16,2019/5/14,17,5.3 LCD模块的驱动构件设计,2019/5/14,LCD模块 LCD的特点: 1)低电压微功耗 2)平板型结构 3)使用寿命长 4)被动显示 5)显示信息量大且易于彩色化 6)无电磁辐射 LCD分类方法 (1)按电光效应分类 (2)按显示内容分类 (3)按LCD的采光
10、方式分类,18,5.3 LCD模块的驱动构件设计,HD44780的编程结构 相关寄存器 1指令寄存器(IR) 指令寄存器IR用于MCU向HD44780写入指令码。 2数据寄存器(DR) DR用于寄存数据。 3忙标志(BF) 令RS=0、R/ =1,在E信号高电平的作用下,BF输出到总线的DB7上,MCU可以读出判别。 4地址计数器(AC) AC作为DD RAM或CG RAM的地址指针。,2019/5/14,19,5.3 液晶LCD,HD44780的编程结构 相关寄存器 5显示数据寄存器(DD RAM) DD RAM用于存储显示数据,共有80个字符码。 6字符发生器ROM(CG ROM) CG
11、ROM由8位字符码生成57点阵字符160种和510点阵字符32种,8位字符编码与字符的对应关系,可以直接使用。 7字符发生器RAM(CG RAM) CG RAM是提供给用户自定义特殊字符用的,它的容量仅为64字节,编址为003FH。,2019/5/14,20,在实验板上,LCD的数据线714脚(D0D7)分别与MCU的PTE的10,7,6,5,4,3,2,1引脚连接,LCD的控制线RS、R/ 、E(4、5、6脚)分别与MCU的PTE的11,8,9引脚连接。LCD的1、2、3脚为供电电源与亮度调节引脚。,5.3 液晶LCD,点阵字符型LCD编程实例,2019/5/14,21,5.3 液晶LCD,
12、LCD与K60的连接,2019/5/14,22,5.3 液晶LCD,液晶构件程序包含头文件lcd.h和程序文件lcd.C,包括对以下函数的声明和定义(需调用GPIO构件):,void LCDInit(void) 初始化Lcd,设置显示方式,清屏,AC自动+1void LCDShow(uint8 data32) 在lcd显示屏显示data所指向的32个数据,2019/5/14,5.3 液晶LCD,LCD测试工程 本测试实例调用上节给出的LCD构件,使用UART0口和PC机通信。先通过串口向PC机发送首先向PC发送“Test LCD!“,然后在LCD分两行显示“Wait Receiving“和“Soochow 2011.12.“。,23,2019/5/14,第五章 练习题,1简述独立键盘和矩阵键盘的应用特点。 2列举常见的键盘消除抖动的方法(提示:可从软件和硬件两方面考虑) 3简述扫描法动态显示LED的原理。 4分析LCD液晶显示的工作时序。 5简要说明键盘、LED、LCD构件封装的基本要点 6综合设计:将矩阵键盘模块、LED和LCD模块与K60芯片相连,编写程序实现:当键盘有按键按下时,在LED和LCD上同时显示按键内容。,