欢迎来到天天文库
浏览记录
ID:37850604
大小:21.84 KB
页数:6页
时间:2019-06-01
《51环境下键盘驱动(矩阵键盘)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第五节:键盘驱动指提供一些函数给任务调用,获取按键信息,或读取按键值。定义一个头文档,描述可用函数,如下:#ifndef_KEY_H_//防止重复引用该文档,如果没有定义过符号_KEY_H_,则编译下面语句#define_KEY_H_//只要引用过一次,即#include,则定义符号_KEY_H_unsignedcharkeyHit(void);//如果按键,则返回非0,否则返回0unsignedcharkeyGet(void);//读取按键值,如果没有按键则等待到按键为止voidkeyPut(unsignedcharuc
2、KeyVal);//保存按键值ucKeyVal到按键缓冲队列末voidkeyBack(unsignedcharucKeyVal);//退回键值ucKeyVal到按键缓冲队列首#endif定义函数体文档KEY.C,如下:#include“key.h”#defineKeyBufSize16//定义按键缓冲队列字节数unsignedcharKeyBuf[KeyBufSize];//定义一个无符号字符数组作为按键缓冲队列。该队列为先进//先出,循环存取,下标从0到KeyBufSize-1unsignedcharKeyBufWp=0;//作为数组下标变量,记录
3、存入位置unsignedcharKeyBufRp=0;//作为数组下标变量,记录读出位置//如果存入位置与读出位置相同,则表明队列中无按键数据unsignedcharkeyHit(void){if(KeyBufWp==KeyBufRp)return(0);elsereturn(1);}unsignedcharkeyGet(void){unsignedcharretVal;//暂存读出键值while(keyHit()==0);//等待按键,因为函数keyHit()的返回值为0表示无按键retVal=KeyBuf[KeyBufRp];//从数组中读出键值
4、if(++KeyBufRp>=KeyBufSize)KeyBufRp=0;//读位置加1,超出队列则循环回初始位置return(retVal);}voidkeyPut(unsignedcharucKeyVal){KeyBuf[KeyBufWp]=ucKeyVal;//键值存入数组if(++KeyBufWp>=KeyBufSize)KeyBufWp=0;//存入位置加1,超出队列则循环回初始位置}/******************************************************************************
5、***********由于某种原因,读出的按键,没有用,但其它任务要用该按键,但传送又不方便。此时可以退回按键队列。就如取错了信件,有必要退回一样******************************************************************************************/voidkeyBack(unsignedcharucKeyVal){/*如果KeyBufRp=0;减1后则为FFH,大于KeyBufSize,即从数组头退回到数组尾。或者由于干扰使得KeyBufRp超出队列位置,也要调整回到正常
6、位置,*/if(--KeyBufRp>=KeyBufSize)KeyBufRp=KeyBufSize-1;KeyBuf[KeyBufRp]=ucKeyVal;//回存键值}下面渐进讲解键盘物理层的驱动。电路共同点:P2端口接一共阴数码管,共阴极接GND,P2.0接a段、P2.1接b段、…、P2.7接h段。软件共同点:codeunsignedcharSeg7Code[10]是七段数码管共阴编码表。CodeunsignedcharSeg7Code[16]=//0123456789AbCdEF{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0
7、x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};例一:P1.0接一按键到GND,键编号为‘6’,显示按键。#include#include“KEY.H”voidmain(void){P1_0=1;//作为输入引脚,必须先输出高电平while(1)//永远为真,即死循环{if(P1_0==0)//如果按键,则为低电平{keyPut(6);//保存按键编号值为按键队列while(P1_0==0);//如果一直按着键,则不停地执行该循环,实际是等待松键}if(keyHit()!=0)
8、//如果队列中有按键P2=Seg7Code[keyGet()];//从队列中取出按键值,并显示在数码管上}}
此文档下载收益归作者所有