历史上的今天
返回首页

历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2019年10月09日 | 4*4键盘程序代码 基于STM32

2019-10-09 来源:eefocus

这是自己写的扫描第一行按键的程序代码。


PE的位8~位11设置为下拉输入。


PE的位12~位15设置为推挽输出


其中PE的位11是4*4键盘的第一列,PE的为键盘的第一行。


先将第一行设置为高电平,检测列中是否有高电平


u8 KEY_Scan(u8 mode)


{       


         staticu8 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;


                   elseif( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9) )return 3;


                   elseif( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10) )return 2;


                   elseif( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11) )return 1;


         }elseif( (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;


                   }


         }


         elseif ( ( GPIOE->IDR & 0x0f00) ) ;key_up=1; //若松开按键,则将key_up置一。



改写成功后,自己就以为4*4键盘只要将代码复制,改动一下GPIO_Write(GPIOE, 0x8000);中的数值。

结果发现只有最后一行的按键不支持连按。其他的若一直按着,就会一直刷新按键值(自己在串口中观察,相关代码未贴出来)。不符合自己设计的要求,即按键不支持连按。


于是进入Debug模式。逐行调试,观察GPIOE的输入数据寄存器(GPIOx_IDR),由于是if语句判断,当没松开后就程序就会运行扫描第二行的代码时,写GPIO_Write(GPIOE,0x4000)时候,(GPIOx_IDR)   的值就改变了,因此后面的if语句就会将key_up就会被置一,而非等到自己按键松开了。长按自然会反复刷新按键值。


只要将if语句改为while语句即可。即按键送下来之前不进行后面的扫描!


这个问题很简单,自己在写的时候都没有发现。不过最终还是调试出来了。


自己写程序会犯各种低级错误,比如自己甚至连 & 和 &&都未区分开来,后面自己在编译器写了一段测试代码才区分开来。


这会让在上面浪费很多时间。上面说的小问题,就耗费了自己数个小时,因为自己之前都是在脑袋中想象代码的的执行流程。。。


但是我还是要坚持这种学习方法,问题虽然会很多,但也正是如此才能发现自己的缺陷,自己去思考,去写了代码,对知识的理解也会更深。


推荐阅读

史海拾趣

G24 Innovations公司的发展小趣事

在快速发展的同时,远阳公司始终不忘履行社会责任。公司积极参与公益事业,通过捐款捐物、志愿服务等方式,回馈社会、关爱弱势群体。此外,远阳还注重环境保护和可持续发展,积极推广绿色生产、节能减排等环保理念。公司建立了完善的环境管理体系和能源管理体系,通过技术创新和管理优化,不断降低生产过程中的能耗和排放。这些举措不仅提升了远阳的企业形象和社会声誉,也为企业的长远发展奠定了坚实基础。

Auris公司的发展小趣事

2019年,强生公司以34亿美元的价格收购了Auris Health。这次收购对于双方来说都具有重要意义。对于Auris而言,它获得了强大的资金支持和市场资源,有助于加速其产品的市场推广和技术研发。对于强生来说,它借此机会获得了Auris在呼吸道手术和肺癌检测方面的先进技术,进一步巩固了其在医疗领域的领先地位。

E Connector Solutions公司的发展小趣事

E Connector Solutions公司始终坚持以客户需求为导向的产品创新策略。公司密切关注市场动态和客户需求变化,及时调整产品策略。例如,随着新能源汽车市场的兴起,公司迅速研发出适用于新能源汽车的专用连接器产品,满足了客户对高可靠性、高安全性的需求。这种以客户需求为导向的产品创新策略使得公司能够保持市场的领先地位。

芯源半导体(CW)公司的发展小趣事

在电子行业的激烈竞争中,芯源半导体(CW)公司凭借其卓越的技术创新能力,成功在市场中脱颖而出。公司创始人李博士带领研发团队,针对当时市场上半导体产品的不足,开发出了一款高性能、低功耗的芯片产品。这款产品凭借其卓越的性能和稳定性,迅速获得了市场的认可,为芯源半导体(CW)公司的初期发展奠定了坚实基础。

Axon' Cable公司的发展小趣事

为了进一步扩大市场份额和提升竞争力,Axon' Cable公司开始实施全球化战略。公司在全球范围内设立了多个生产基地和研发中心,积极开拓国际市场。同时,Axon' Cable还加强了与国际知名企业的合作,共同推动技术创新和产业升级。这些举措使得Axon' Cable的产品在全球范围内得到了广泛应用,公司的国际影响力也逐步提升。

EAO公司的发展小趣事

在产品质量方面,EAO公司始终坚持品质至上的原则。公司建立了严格的质量管理体系和检测流程,确保每一件产品都符合高标准的质量要求。同时,EAO公司还注重员工素质的提升和技能培训,确保员工具备专业的技能和知识来保障产品质量。正是这种对品质的坚守和追求,让EAO公司在激烈的市场竞争中赢得了客户的信任和口碑。

请注意,以上故事均为虚构内容,旨在展示EAO公司在电子行业中可能的发展路径和成就。实际情况可能因公司战略、市场环境等因素而有所不同。

问答坊 | AI 解惑

发现论坛bug

在点击进入电路图后,最下面有不对齐的…

查看全部问答>

陶显芳老师的开关电源设计资料

开关电源原理与设计—陶显芳…

查看全部问答>

MC33996的一个问题,高手进。。。

请问,用MC33996和S08单片机做开关量输出时,那个AND/OR到底是怎么用的?谁来解释下。。…

查看全部问答>

历届电子设计优秀作品

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 继续啊  …

查看全部问答>

各位前辈们 谁用过 sc32442这系列的芯片?很想知道这系列的不同型号有什么区别? 怎么命名的?

各位前辈们 你们谁用过 sc32442这系列的芯片?小弟要用这颗料做个手持设备 发现有很多型号 SC32442BL-33 SC32442B43-7080 SC32442B54 SC32442AL-43S SC32442AL-45 SC32442XL-31 SC32442X33-7080 SC32442X31-7080 SC32442AL-33 SC32442A45 ...…

查看全部问答>

版本移植问题请教大家???

     感谢helenhf的回复我上个问题,那个问题已经解决。是MPC8280的PCI内部空间和外部空间有一个转换关系,即outwindow地址,PCI设备的基地址应设置为0x50000000,此时 d 0x80000000 就可以看到PCI设备的寄存器了。   &nb ...…

查看全部问答>

在一个程序里面,不能在主窗体里面给弹出的各个子窗体依次发关闭消息,叫他们自己关闭自己?

在一个程序里面,不能在主窗体里面给弹出的各个子窗体依次发关闭消息,叫他们自己关闭自己?…

查看全部问答>

不同PIC单片机的C语言语法是一样的吗?

基本的C指令是一样的吗?哪儿有常用的语法资料?…

查看全部问答>

wince 部署的问题

我通过vs2005 部署到wince板子上  但是重启又没了 我新建的文件夹也没了. 现在有一个 sd存储卡, 要不就写入到卡里 ,让他开机自动运行,但是 不知道怎么弄?…

查看全部问答>

NIOSII编译出现很诡异的问题,求大侠帮帮忙

最近在学NIOSII编程,参考别人的,写了一个很简单的程序定时器程序,编译老是出错。一直找不出原因,老是出现这个错误 multiple definition of `main\' 快疯了。现把程序贴上,求高手指点。 #include\"system.h\"#include \"altera_avalon_timer ...…

查看全部问答>