4乘4按键代码.docx_第1页
4乘4按键代码.docx_第2页
4乘4按键代码.docx_第3页
4乘4按键代码.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录4*4键盘程序代码 基于STM321位操作符与逻辑与,非,或的区别34*4键盘程序代码 基于STM32这是自己写的扫描第一行按键的程序代码。PE的位8位11设置为下拉输入。PE的位12位15设置为推挽输出其中PE的位11是4*4键盘的第一列,PE的为键盘的第一行。先将第一行设置为高电平,检测列中是否有高电平u8 KEY_Scan(u8 mode) static u8 key_up=1;/按键按松开标志if(mode)key_up=1; /支持连按GPIO_SetBits(GPIOE, GPIO_Pin_15); if(key_up& ( (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8) |(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9) |(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)|(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11) ) )delay_ms(10);/去抖动 key_up=0;if( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8) )return 10;else if( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9) )return 3;else if( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10) )return 2;else if( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11) )return 1;else if( (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8)=0&(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9)=0&(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10)=0&(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11)=0 )key_up=1; return 0;/ 无按键按下写好扫描一行后,对比网上别人写的代码,发现写的十分冗长,原因:调用了库函数的位操作函数对4位进行操作。而不是进行整理处理。然后改写如下:GPIO_Write(GPIOE, 0x8000); if( (key_up) & (GPIOE-IDR & 0x0f00) )delay_ms(10);/去抖动 key_up=0;switch( GPIOE-IDR & 0x0f00 )case 0x0100: KeyVal=10; break; case 0x0200: KeyVal=3; break; case 0x0400: KeyVal=2; break; case 0x0800: KeyVal=1; break;else if ( ( GPIOE-IDR & 0x0f00) ) ;key_up=1; /若松开按键,则将key_up置一。改写成功后,自己就以为4*4键盘只要将代码复制,改动一下GPIO_Write(GPIOE, 0x8000);中的数值。结果发现只有最后一行的按键不支持连按。其他的若一直按着,就会一直刷新按键值(自己在串口中观察,相关代码未贴出来)。不符合自己设计的要求,即按键不支持连按。于是进入Debug模式。逐行调试,观察GPIOE的输入数据寄存器(GPIOx_IDR),发现在扫描第二行时,写GPIO_Write(GPIOE, 0x4000)时候,(GPIOx_IDR)的值就改变了,原因就是换行了按键即使按下,也是低电平。所以key_up就会被置一,长按自然会反复刷新按键值。只要将if语句改为while语句即可。即按键送下来之前不进行后面的扫描!这个问题很简单,自己在写的时候都没有发现。不过最终还是调试出来了。自己写程序会犯各种低级错误,比如自己甚至连 & 和&都未区分开来,后面自己在编译器写了一段测试代码才区分开来。这会让在上面浪费很多时间。上面说的小问题,就耗费了自己数个小时,因为自己之前都是在脑袋中想象代码的的执行流程。但是我还是要坚持这种学习方法,问题虽然会很多,但也正是如此才能发现自己的缺陷,自己去思考,去写了代码,对知识的理解也会更深。自己要坚持记录自己菜鸟路上发生的种种,真不知道将来回顾自己是个什么心情!行者 2014/10/31为者常成,行者常至。位操作符与逻辑与,非,或的区别关键词: c语言中没有专门的逻辑值它将一切非零值默认为真,0为假测试代码:#include stdio.hmain ()int a = 0x0010;int b = 0xff0f;int c,d,e,f,g,h,l;c = a&b;d = a&b;e = a | b;f = a | b;g = !(a&b);h = !(a&b);l = (a != b);printf(c的值:%xn,c);printf(d的值:%xn,d);printf(e的值:%xn,e);printf(f的值:%xn,f);printf(g的值:%xn,g);printf(h的值:%xn,h);printf(l的值:%xn,l);a & b a和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论