欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

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

    • 资源ID:4146168       资源大小:22.50KB        全文页数:8页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    3 矩阵键盘扫描流程的分析关于按键这块,我想矩阵键盘的原理我就不说了,网上一搜一大把,但是要注意CC2530的IO口的配置情况,涉及到:是外设还是普通的IO口的选择,端口方向的选择,端口的中断是否使能(这里是在行输入用到),上拉还是下拉,初始的时候端口是高电平还是低电平等的一些配置。下面上图,文档本身的描述:这些最基本的配置都是在HalKeyInit()里面实现的,原函数如下void HalKeyInit(void)#if(HAL_KEY=TRUE)halKeySavedKeys=HAL_KEY_CODE_NOKEY;/初始化保存的键值HAL_KEY_COL_SEL&=(uint8)HAL_KEY_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);/设置行的方向为输入/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 rows 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_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;/登记回调函数(也就是说回调函数pHalKeyProcessFunction不等于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(HalKeyConfigured=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这里指的是触发了行中断这个事件,首先调用HAL_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/是中断的函数名称,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,首先关闭具体到位的中断HAL_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_KEY_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)Any 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)&&(pHalKeyProcessFunction)/这里就是在判断回调函数是否被注册了/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 again 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)这个函数中,但是好像上面的程序没有这个函数,这个时候你就要明白回调函数的意义所在了,在步骤(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检测一次,这里我觉得是为了"连发"而设置的,只是我的推测,也不是很确定,先写在这里了,如有错误希望大家多多指教。这步还有一种情况是没有读取到键值,这时候回跳到步骤(2)重新配置执行同样的过程,如果有有效的键值读取到,那么就执行到下一步(8)Start polling timer在上一步中,已经说到这里是用osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,50)来实现的,如果定时器溢出,那么跳到步骤(5)OK!以上都是个人见解,当然还是要感谢高老师,他给了我很多的帮助,一个键值的读取花了我一个晚上的时间,时间飞快啊,哈哈。

    注意事项

    本文(3 矩阵键盘扫描流程的分析.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开