- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MSP430程序库七按键
MSP430程序库七按键按键是单片机系统最常用的输入设备之一;几乎是只要需要交互输入,就必须有键盘。这篇博客实现了一个通用的键盘程序,只要提供一个读取键值的函数(底层键值),程序将完成消抖、存入队列等一些列处理。同时本程序提供最常用的4*4矩阵键盘的程序,和4个按键的程序。
硬件介绍:
本文主要实现了一个键盘的通用框架,可以很方便的改为不同的键盘函数,这里实现了两种按键4个单独按键和4*4行列扫描的键盘。
4个按键的是这样的:四个按键分别一端接地,另一端接上拉电阻后输入单片机的P1.0-P1.3口;这样,按键按下时,单片机接到低电平,松开时单片机输入信号有上拉电阻固定为高电平。
4*4的按键:行输入信号配有桑拉电阻,无按键时默认电平高电平;列扫描信号线直接接到按键列线;读键时,列扫描信号由单片机给出低电平信号(按列逐列扫描),读取行信号,从而判断具体是哪个按键;电路图大概如下:
?
图中,IN是键盘的列扫描线,OUT是键盘的输出的行信号线。扫描是也可以按行扫描,这时IN是行扫描线,OUT的按键输出的列信号线。我的程序是按列扫描的(行列扫描原理一样,只是行列进行了交换)。
这里,同时实现了4*4按键的scanf函数的移植,同时,加入了之前实现的液晶的printf函数的移植,搭建了一个可以交互输入输出的完整的一个系统;液晶的printf又加入了函数,实现了退格;可以在输入错误数字的时候退格重新输入。
程序实现:
先说一下程序的结构,程序实现了一个循环队列,用来存放已按下的键值,可以保存最新的四个按键,可以防止按键丢失;程序使用的是中断的方式进行按键,每16ms(用的是看门狗的间隔中断)读一次按键,进行判断键值是否有效,有效则放入队列,等待读取。
循环队列的实现:用数组实现,为判断队满,数组的最后一个元素不用于存储键码值:
/**********************宏定义***********************/
#define KeySize 4 //键码值队列
#define Length KeySize+1 //队列数组元素个数
/***************************************************/
/**********************键值队列*********************/
//可KeySize(Length-1)个键码循环队列占用一个元素空间
char Key[Length];
入队函数:入队时,队满则出队一个,以保存最新的四个按键。
void AddKeyCode(char keyCode)
{
if((rear+1)%Length==front) //队满
{
front=(front+1)%Length; //出队一个
}
Key[rear] = keyCode;
rear=(rear+1)%Length;
}
出队函数:出队函数即是读取按键的函数,以供其他需要的地方调用。
char ReadKey()
{
char temp;
//if(rear==front) return \0; //无按键
while(rear==front);
temp = Key[front];
front=(front+1)%Length;
return temp;
}
KeyProcess:这个函数即是键盘处理函数,需要被每10ms-20ms的时间调用一次的函数,在这里把它放入了看门狗定时器16ms的中断中;函数流程图和函数内容如下:
?
void KeyProcess()
{
static char keyValue = 0xff; //按键标识,键值
static char addedFlag = 0; //加入队列标志
char keyVal = GetKey();
if(keyVal==0xff) //无按键
{
keyValue = 0xff;
addedFlag = 0;
return;
}
if(keyValue==0xff) //之前状态无按键
{
keyValue = keyVal;
return;
}
if(keyValue!=keyVal) //和前次按键不同
{
keyValue = keyVal
您可能关注的文档
最近下载
- 青岛版小学数学五年级上册《多边形的面积》大单元教学整体设计.docx VIP
- 2021年考研英语一真题.pdf
- 《耐候桥梁钢与耐候钢-不锈钢复合板构件设计标准》.pdf
- 高中智慧校园建设方案.pdf VIP
- 钣金检验作业指导书.docx
- 高校科技成果转化政策与案例分享PPT幻灯片.ppt
- 2025年福建省福州市长乐区产业投资发展集团有限公司招聘20人考试模拟试题及答案解析.docx VIP
- 医院安全生产责任制.pdf VIP
- M公司员工招聘与配置管理现状及优化措施研究.docx VIP
- B∕T 1800.1-2020 产品几何技术规范(GPS) 线性尺寸公差ISO代号体系 第1部分:公差、偏差和配合的基础(高清版).pdf VIP
文档评论(0)