3 矩阵键盘扫描流程的分析.doc

上传人:文库蛋蛋多 文档编号:4146168 上传时间:2023-04-07 格式:DOC 页数:8 大小:22.50KB
返回 下载 相关 举报
3 矩阵键盘扫描流程的分析.doc_第1页
第1页 / 共8页
3 矩阵键盘扫描流程的分析.doc_第2页
第2页 / 共8页
3 矩阵键盘扫描流程的分析.doc_第3页
第3页 / 共8页
3 矩阵键盘扫描流程的分析.doc_第4页
第4页 / 共8页
3 矩阵键盘扫描流程的分析.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《3 矩阵键盘扫描流程的分析.doc》由会员分享,可在线阅读,更多相关《3 矩阵键盘扫描流程的分析.doc(8页珍藏版)》请在三一办公上搜索。

1、3 矩阵键盘扫描流程的分析关于按键这块,我想矩阵键盘的原理我就不说了,网上一搜一大把,但是要注意CC2530的IO口的配置情况,涉及到:是外设还是普通的IO口的选择,端口方向的选择,端口的中断是否使能(这里是在行输入用到),上拉还是下拉,初始的时候端口是高电平还是低电平等的一些配置。下面上图,文档本身的描述:这些最基本的配置都是在HalKeyInit()里面实现的,原函数如下void HalKeyInit(void)#if(HAL_KEY=TRUE)halKeySavedKeys=HAL_KEY_CODE_NOKEY;/初始化保存的键值HAL_KEY_COL_SEL&=(uint8)HAL_K

2、EY_COL_BITS;/设置列端口的功能为普通的IO口HAL_KEY_COL_DIR|=HAL_KEY_COL_BITS;/设置列端口的方向为输出if(HAL_KEY_ROW_PULLDOWN)/这里涉及到上拉还是下拉的问题HAL_KEY_COL_PORT|=HAL_KEY_COL_BITS;/输出所有的列为高电平elseHAL_KEY_COL_PORT&=(uint8)HAL_KEY_COL_BITS;/输出所有的列为低电平HAL_KEY_ROW_SEL&=(HAL_KEY_ROW_BITS);/设置行为普通的IO口HAL_KEY_ROW_DIR&=(HAL_KEY_ROW_BITS);/

3、设置行的方向为输入/pull down setup if necessary if(HAL_KEY_ROW_PULLDOWN)/如果是下拉模式,进来配置行端口为下拉HAL_KEY_ROW_INP|=HAL_KEY_ROW_PDUPBIT;pHalKeyProcessFunction=NULL;/这里是对回调函数的初始化为空HalKeyConfigured=FALSE;halKeyTimerRunning=FALSE;#endif下面我们开始对历程中的键盘扫描进行简要的分析:我们从每一个框框开始分析:(1)start就不用说了(2)All columns active output,All ro

4、ws interrupt enable.这里就是我们前面所说的整个对IO初始化的过程,这里要说明的是对HalKeyInit()的调用要从rsa_main.c中说起,rsa_main.c文件没什么东西,只有一个函数int main(void),在main函数中HalDriverInit()被调用,HalDriverInit()对很多外设做了初始化,这里面就包含了HalKeyInit()这个函数(也就是对键盘初始化的函数),但是在这个函数中并没有使得All rows interrupt enable,别急,仍然是在main函数中的倒数第二句,又调用了一个函数HalKeyConfig(RSA_KEY

5、_INT_ENABLED,RSA_KeyCback);这句非常关键,RSA_KEY_INT_ENABLED是对行中断的使能,RSA_KeyCback是个回调函数,RSA_KeyCback本身是个普通的函数,它的作用是读取按下键盘的值,它被定义在rsa_basic.c中上前段设计到的程序void HalKeyConfig(bool interruptEnable,halKeyCBack_t cback)#if(HAL_KEY=TRUE)Hal_KeyIntEnable=interruptEnable;pHalKeyProcessFunction=cback;/登记回调函数(也就是说回调函数pHa

6、lKeyProcessFunction不等于NULL了)if(Hal_KeyIntEnable)/注意这里TI原始程序中默认中断时使能的PICTL&=(HAL_KEY_ROW_EDGEBIT);/设置是上升沿中断还是下降沿中断if(HAL_KEY_ROW_EDGE=HAL_KEY_FALLING_EDGE)PICTL|=HAL_KEY_ROW_EDGEBIT;HAL_KEY_ROW_ICTL|=HAL_KEY_ROW_ICTLBITS;/使能中断,具体到某一位的中断HAL_KEY_ROW_IEN|=HAL_KEY_ROW_IENBIT;/整个端口使能中断,不具体某一位if(HalKeyConf

7、igured=TRUE)osal_stop_timerEx(Hal_TaskID,HAL_KEY_EVENT);else如果没有使用端口中断/disable interrupt不使能中断HAL_KEY_ROW_ICTL&=(HAL_KEY_ROW_BITS);HAL_KEY_ROW_IEN&=(HAL_KEY_ROW_IENBIT);osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,HAL_KEY_POLLING_VALUE);HalKeyConfigured=TRUE;#endif(3)Row interrupt这里指的是触发了行中断这个事件,首先调用H

8、AL_ISR_FUNCTION(halKeyPort0Isr,P0INT_VECTOR)这个函数,接着在中断程序中调用halProcessKeyInterrupt(),在这个函数中调用了osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,HAL_KEY_DEBOUNCE_VALUE),osal_start_timerEx的作用是步骤(4)所提到的Start key de-bounce timer,也就是说启动键盘防抖动的定时器HAL_ISR_FUNCTION(halKeyPort0Isr,P0INT_VECTOR)/中断程序,halKeyPort0Isr/是

9、中断的函数名称,P0INT_VECTOR是中断的入口地址halProcessKeyInterrupt();/读取键盘的过程#if HAL_KEY P0IFG=(uint8)(HAL_KEY_P0INT_LOW_USED|HAL_KEY_POINT_HIGH_USED);P0IF=0;CLEAR_SLEEP_MODE();#endifvoid halProcessKeyInterrupt(void)#if(HAL_KEY=TRUE)if(HAL_KEY_ROW_PXIFG&HAL_KEY_ROW_BITS)/判断中断标志位是否置为1/Disable interrupt,首先关闭具体到位的中断HA

10、L_KEY_ROW_ICTL&=(uint8)HAL_KEY_ROW_ICTLBITS;/interrupt flag has been set HAL_KEY_ROW_PXIFG=(uint8)(HAL_KEY_ROW_BITS);/清中断标志位if(!halKeyTimerRunning)/halKeyTimerRunning初始值为falsehalKeyTimerRunning=TRUE;osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,HAL_KEY_DEBOUNCE_VALUE);/启动防抖动的定时器/Enable interrupt HAL_K

11、EY_ROW_ICTL|=HAL_KEY_ROW_ICTLBITS;#endif(4)Start key de-bounce timer这里是启动了防抖动定时器,我想大家都知道抖动的意思,这里就是通过osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,HAL_KEY_DEBOUNCE_VALUE)这么一句来启动防抖动定时器,HAL_KEY_DEBOUNCE_VALUE默认产的初始值为25,也就是说防抖动的时间是25ms。(5)Timer expiry直译就是定时器溢出,根据步骤(4)可以知道他的意思是防抖动的定时器溢出,(6)Key scanning(7)A

12、ny key press?这里把步骤6和7一块说了,当防止抖动的时间过去之后开始键盘扫描,键盘的扫描函数如下:void HalKeyPoll(void)/键盘轮询扫描#if(HAL_KEY=TRUE)uint8 keys=0;keys=HalKeyRead();/读取键盘的值if(!Hal_KeyIntEnable)/没有使用中断时候进来if(keys=halKeySavedKeys)return;halKeySavedKeys=keys;/保存当前的键值,为了跟下一次进行比较if(keys!=HAL_KEY_CODE_NOKEY|Hal_KeyIntEnable)&(pHalKeyProce

13、ssFunction)/这里就是在判断回调函数是否被注册了/When interrupt is enabled,send HAL_KEY_CODE_NOKEY as well so that/application would know the previous key is no longer depressed.(pHalKeyProcessFunction)(keys,HAL_KEY_STATE_NORMAL);/对键值的处理if(Hal_KeyIntEnable)if(keys!=HAL_KEY_CODE_NOKEY)/In order to trigger callback agai

14、n as far as the key is depressed,/timer is called here.osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,50);/下面有详细说明elsehalKeyTimerRunning=FALSE;以上是这个轮询程序的大概流程,下面我对黑体部分做一个详细的分析,首先HalKeyRead()这个函数是读取硬件上的键盘的值,只是对硬件的端口读取了一下没有做其他的任何处理,对读取的键盘真正处理的地方是在RSA_KeyCback(uint8 keys,uint8 state)这个函数中,但是好像上面的程序没有这个函数,这

15、个时候你就要明白回调函数的意义所在了,在步骤(2)中我们已经对回调函数注册了,也就是说pHalKeyProcessFunction已经不是NULL了(在这里需要说明一点的是这个NULL在数值上为0,但是跟0是不同的),更关键的一点是在main函数中调用了HalKeyConfig(RSA_KEY_INT_ENABLED,RSA_KeyCback)这个函数,第二个参数就是处理键盘的这个函数,简单的说就是,将一个函数当做形参来调用了,而这个形参是指针类型,也就是说这个时候回调函数pHalKeyProcessFunction指向的是RSA_KeyCback这个函数,对pHalKeyProcessFun

16、ction的调用就是对RSA_KeyCback的调用,这下应该明白回调的作用了。osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,50);这句的意思我觉得是要跟图中步骤(8)的实现,这里是在有键值按下的情况下开启定时器,50ms检测一次,这里我觉得是为了连发而设置的,只是我的推测,也不是很确定,先写在这里了,如有错误希望大家多多指教。这步还有一种情况是没有读取到键值,这时候回跳到步骤(2)重新配置执行同样的过程,如果有有效的键值读取到,那么就执行到下一步(8)Start polling timer在上一步中,已经说到这里是用osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,50)来实现的,如果定时器溢出,那么跳到步骤(5)OK!以上都是个人见解,当然还是要感谢高老师,他给了我很多的帮助,一个键值的读取花了我一个晚上的时间,时间飞快啊,哈哈。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号