下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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这个函数,对phalkeyprocessfunction的调用就是对rsa_keycback的调用,这下应该明白回调的作用了。osal_start_timerex(hal_taskid,hal_key_event,50);这句的意思我觉得是要跟图中步骤(8)的实现,这里是在有键值按下的情况下开启定时器,50ms检测一次,这里我觉得是为了连发而设置的,只是我的推测,也不是很确定,先写
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙合同解除协议书范本
- 厂房租赁居间合同简单版范本
- 电子商务公司商家加盟合同范本完整版
- 工程造价答辩问题终极
- 工程预算书格式
- 工程项目招投标审计
- 办公室窗帘采购合同书
- 国际贸易合同样本
- 甘肃省酒泉市四校联考2023-2024学年高二下学期5月期中考试英语
- 安徽省合肥市部分学校高三下学期三模政治试题2
- 安全环保职业健康法律法规清单2024年
- 地 理《世界的地形》第一课时课件-2024-2025学年人教版七年级地理上册
- 广西岑溪市2025年高三高考化学试题系列模拟卷(3)含解析
- 2024-2030年中国燃气表行业市场发展分析及发展趋势预测研究报告
- (新版)烟草行业法律法规知识竞赛参考试题库-下(判断、简答题)
- 第4单元表内除法(一)应用题(专项训练)-2024-2025学年二年级上册数学苏教版
- 微专题(三) 光合作用和细胞呼吸的综合问题教学设计-2024-2025学年高一上学期生物人教版必修1
- 2024-2025学年一年级语文上册第一单元测试卷(统编版2024新教材)
- 恙虫病护理查房模板
- 2023年云南省红河州同舟社会工作服务中心招聘笔试真题
- 红色简约中华人民共和国成立75周年演讲
评论
0/150
提交评论