MSP430程序库七按键
更新时间:2023-03-08 06:22:19 阅读量: 综合文库 文档下载
- 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; //保存新按键值 return; } if(addedFlag==1) //已加入队列 { return; } addedFlag = 1; AddKeyCode(KeyCode[keyVal]); } 这个函数完成按键的判断,并和上次的比较,从而判断是否是有效按键,再根据是否已经入队保存,去判断是否要保存,入队列保存按键。 这个函数需要每10ms-20ms中断运行一次:
#pragma vector=WDT_VECTOR __interrupt void WDT_ISR() { KeyProcess(); } 这是430看门狗的间隔定时中断,设置的是每16ms中断一次:
WDTCTL=WDT_ADLY_16; //看门狗内部定时器模式16ms IE1 |= WDTIE; //允许看门狗中断 KeyProcess里调用了GetKey函数,这个函数需要用户提供,以满足特殊的按键需求,这里提供了两个实例:4个按键和4*4矩阵键盘。 4个按键的getkey函数:
char GetKey() { if((P1IN&0X0F)==0x0E) { return 0; } if((P1IN&0X0F)==0x0D) { return 1; } if((P1IN&0X0F)==0x0B) { return 2; } if((P1IN&0X0F)==0x07) { return 3; } return 0xff; } 这里根据每个按键,输出按键原始键值,没有按键则输出0xff;当自己提供getkey函数时,也需要这样,无按键时返回0xff
把对应原始键值翻译成所需键码,用数组KeyCode:
char KeyCode[] = \; /*4个按键时*/ 这里把它转化成ASCII码输出,需要的话可以自行更改。 4*4矩阵键盘:getkey:
char GetKey() { P1DIR |= 0XF0; //高四位输出 for(int i=0;i<4;i++) { P1OUT = 0XEF << i; for(int j=0;j<4;j++) { if((P1IN&(0x01< KeyCode,翻译成ASCII码: char KeyCode[] = \ 到这里,正常的键盘程序结束,调用时只需加入Key.c,包含Key.h即可使用,先调用KeyInit后,就可以正常的读键了。这里不再细说。 scanf移植:scanf移植时,需要的是ASCII码字符型设备,利用ASCII码输入数据还必须要有回车键,只有这样,才能用scanf输入数据,这里为了输入数据错误时,可以退格修改,按键还有一个退格键。 键盘结构: 1 4 7 保留 2 5 8 0 3 6 9 保留 退格 保留 保留 回车 保留键用字符’\\0’,回车’\\n’退格’\\b’ 所以:KeyCode: char KeyCode[] = \; /* 4*4,scanf移植*/ 在字符串里,\\0后面是数字时,必须用’\\000’否则,c语言编译器认为\\0和后面的数字组合为一个字符。 scanf的移植,需要实现getchar函数,这里和之前的getchar函数类似,把它放到了Getchar.c文件里,内容如下: #include int getchar() { return ReadKey(); } 要实现scanf调用,还需要设置,详细设置参考:MSP430程序库<四>printf和scanf函数移植;需要把库设置为CLIB;在Option-general option-library configuration里面。 这样,键盘的scanf移植完成,需要使用时,只需加入对stdio.h文件的包含,然后完成键盘的初始化即可。 ? 使用示例: 这里,示例实现的是键盘和液晶的简单交互;键盘输入数据,液晶正常显示;就像c语言调试时键盘和屏幕一样;当然没有那个丰富啦。 液晶的部分,用的是原来实现的程序,在这里,为了支持输入错误时退格,对原来的printf函数加入了退格支持。具体参考:MSP430程序库<四>printf和scanf函数移植(已经更新)。 项目中接入液晶的c程序文件和printf的程序文件(Lcd12864.c、Printf.c),加入Lcd12864.h的文件包含;初始化液晶后,就可用printf向液晶输出要显示的内容了。 键盘:加入Key.c,包含Key.h,加入Getchar.c,程序中初始化键盘;然后设置所用的lib为CLIB,具体设置见:MSP430程序库<四>printf和scanf函数移植。之后就可以用键盘和液晶完成和430单片机简单的交互了。 详细参考示例工程和main.c。 #include 键盘的程序库就到这里,有什么不足,欢迎讨论。 (DEL 键) #define InEOL '\\r' //ASCII
正在阅读:
MSP430程序库七按键03-08
临床技能竞赛重点范围及评分06-28
2011年全国中考物理分类汇编考点34 不同学科间交叉综合题 - 图文05-18
TPM - 图文04-02
新概念青少版1A期末测试卷及答案 -10-22
南邮软件设计报告10-26
《秋瑾》朗诵稿 - 十三届齐悦一等奖稿件05-05
高三文综试题01-19
安徽合肥一中2011年冲刺高考模拟最后一卷参考答案 - 图文03-06
论油田污水处理现状及发展趋势06-22
- Win7 安装MySql图示
- 计算器课程设计报告
- 部编版八年下语文第三单元第六单元古诗文理解默写练习及答案
- 13质量通病防治方案和施工措施
- 土力学试题~~~~
- 公务员打印资料
- 传热膜系数测定实验报告 - 图文
- 新时期煤矿协管安全工作的创新与实践
- 第五章 习题及参考答案
- 220kV架空线路强条执行记录表
- 音乐欣赏读后感
- 高炉
- 劳动教育需要新的时代内涵
- 10建筑地面工程施工质量验收规范GB50209-20021
- 银行会计练习题2答案
- 2013年七年级地理上册知识点复习提纲湘教版
- 人教版三年级语文上册第四单元测试题(A卷)(有答案)
- 营养师第九章练习题
- 湖北省武汉市2018届高三毕业生二月调研 理综化学
- 行业分析2018-2023年中国男性护肤品行业市场发展分析及投资前景
- 按键
- 程序
- MSP430
- 综合基础知识 题库有答案及公文写作
- 合肥淮河路步行街地段调研报告
- 21 广义特征值与极大极小原理
- 2018-2023年中国纸箱行业市场运营趋势分析及投资潜力研究(目录
- 财务报表的逻辑
- 诺基亚5800手机的一些进程
- 基于plc的自动装箱机控制系统的设计
- 法语笔记1
- 九年级语文上册 7《傅雷家书两则》导学案 新
- 河南省郑州市2019届高一上学期期末考试生物试题 Word版含答案 -
- 代表队名单
- 课文简答题示例
- 最新-企业办公室文秘个人工作总结1 精品
- 王封煤矿“2014-2017”瓦斯防治规划
- 2006年高考重庆卷文科综合试题及参考答案
- 如何快速记英语单词
- 海明威最杰出的作品
- 六上科学课堂作业本的答案
- 工程电磁场习题解答1
- 多肉植物小区推广方案