小编今天原本想用proteus7.8做个计算器显示的仿真,结果被矩阵按键这块整好长时间。秃头秃头!!!
某站上普中科技的教学视频里的“矩阵按键”采用的是行列式的扫描方式实现确定按键位置的。但我用那个程序仿真没整出来。分析修改程序等等,弄了好久没整出来。于是我换了一种方式,用视频里介绍的**“逐行扫描”**的方式弄了一下,整出来了!!,先把我的实验过程分享给大家,在来谈谈我的理解。
仿真图如下:
计算器在proteus7.8中搜“KEYPAD”即可
代码如下:
#include #include #define uchar unsigned char #define uint unsigned int #define GPIO_DIG P0 #define GPIO_KEY P1 uchar KeyValue;//设一个最后的传递值(给P0的) void delay(uint x){//简单的延时函数 while(x--); } //采用逐行扫描的方式: //低四位轮流输出低电平来对矩阵键盘进行逐行扫描, //(1)当高四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 /******************************************************************************* * 函 数 名 : KeyDown() * 函数功能 : 矩阵按键的扫描,确定按下哪个键 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void KeyDown(void){ if((GPIO_KEY&0xf0)!=0xf0){//读取是否有按键按下,符合(1)的说明;补充:P1.0——P1.3是低四位,行表示 KeyValue=~(0xf0|GPIO_KEY); //这步很关键,得到KeyValue(P0)低四位数据,P0.0~P0.3亮的含义:分别表示是第一行到——第四行的某行亮 switch((GPIO_KEY&0xf0)){ //这个'|'要有 case(0X70): KeyValue|=0x10;break; //'4'行 case(0Xb0): KeyValue|=0x20;break; //'3'行 case(0Xd0): KeyValue|=0x40;break; //'2'行 case(0Xe0): KeyValue|=0x80;break; //'1'行 } } else{GPIO_KEY=_crol_(GPIO_KEY,1); } //如果高四位是为1,到下一行去判断 if(GPIO_KEY==0xef){GPIO_KEY=0xfe;} //这句很重要!!!,判断第四次移位是否完成:若低电平移到第五位P1.4,则返回P1.0重新轮询扫描!!! } void main(){ uchar i; GPIO_KEY=0xfe; //设一个行的轮询的初始值,从第一行开始 while(1){ //死循环,不断的查询中 for(i=0;i<4;i++){ //完成一整次轮询 KeyDown(); //调用按键判断函数 delay(1000); GPIO_DIG=KeyValue; //得到按键所在行列的信息 } GPIO_KEY=0xfe; //再赋值准备下次轮询 i=0;//清零,为下次轮询准备 } } 这个程序实现的结果是:随意按计算器上的一个键,通过发光二极管显示出这个键在哪行哪列。P0.0—P0.3分别表示第一行至第四行;P0.4—P0.7分别表示第一列至第四列 下面是按下*按键的显示结果图: 总结:这种“逐行扫描”相当于不间断的扫描每行,监听不同列的变化,若某列发生变化,则将行和列的变化信息返回给P1口,判断后得出结果。 问题分析: 为什么普中的“行列扫描”方式仿真的时候不行呢? 我想应该是按键按下时低电平的时间太短的问题。“行列扫描”方式要求按键按下时的低电平要有一段时间的保持,这样在P1口高低位互调时才能发挥想要的效果。 而仿真中计算器的按键按下去后低电平的时间很短,根本不够这种时间的转换,可能换成16个独立组合的行吧。我下面写了个“行列扫描”的程序验证了我这个想法 仿真图还是原来那个不变,但“行列扫描”的代码如下 #include #define uchar unsigned char #define uint unsigned int #define GPIO_DIG P0 #define GPIO_KEY P1 uchar KeyValue; void delay(uint x){ while(x--); } void KeyDown(void) { GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { //测试行 switch(GPIO_KEY) { case(0X07): KeyValue=0x01;break; case(0X0b): KeyValue=0x02;break; case(0X0d): KeyValue=0x04;break; case(0X0e): KeyValue=0x08;break; } //测试列 GPIO_KEY=0Xf0; //这时候应该还在按下的状态 while((GPIO_KEY==0xf0)==1); //检测按键松手检测 if(GPIO_KEY!=0xf0){ switch(GPIO_KEY) { case(0X70): KeyValue|=0x10;break; case(0Xb0): KeyValue|=0x20;break; case(0Xd0): KeyValue|=0x40;break; case(0Xe0): KeyValue|=0x80;break; } } while(GPIO_KEY!=0xf0); } } void main() { while(1) { KeyDown(); //按键判断函数 delay(10000); GPIO_DIG=KeyValue; // } } 这个行列扫描最后做出的结果是一个按键要按下两次才能在发光二极管处显示出他的位置信息。在仿真中列是P0.4—P0.7,行是P0.0—P0.3
上一篇:小白学习HC-05蓝牙透传模块
下一篇:51单片机系列——LCD1602显示计算器上按键字符
推荐阅读最新更新时间:2024-11-10 12:28
推荐帖子
- 【GD32307E-START】04-工程建立以及LED点灯
- 今天测试了一下GD32的板子,但是在LED的设计的时候有个小BUG,说起来应该不算BUG吧,怎么说呢,在LED灯设计的时候是使用高电平驱动LED的,使用推挽输出是可以正常驱动LED的,但是在这里就不能使用开漏输出了,如果使用开漏输出,又没有上拉电阻,我看了一下GPIO.h的文件里面,没有说输出情况下还带上拉电阻的配置,所以开发板上的灯只能使用推挽模式输出控制了,不多说,上代码。/*===============================================
- 申小林 GD32 MCU
- “学模拟+《运算放大器噪声优化手册》的研读
- 本帖最后由dontium于2015-1-2311:22编辑已收到《运算放大器噪声优化手册》实在是一本不可多得的好书,其从不同角度不同应用中解析不同噪声对运放电路造成的不同影响,每章小结更是清晰的列明本章要点,如更进一步巩固知识还有相关习题,本书详细指导如何设计运放和如何利用相关的电子设备减少和避免可能产生的噪声;对于运放噪声的分析,书中有适合大部分简单运放的分析公式,对于复杂电路,可用三步近似法处理方式:1、首先用方程式做一个简单的评估,2、利用SPICE模型作更精确的评估,3、
- bjwl_6338 模拟与混合信号
- ADC12SC 无法置位,这问题很奇怪,,,,
- 在使用149做AD实验时,无论如何也调不出来,jtag调试之后发现ADC12SC没有置位,也就是说ADC12内核没有启动。ENC等已经置位。。。。。大侠们有货这种情况吗?WDTCTL=WDTPW+WDTHOLD;//StopWDTADC12CTL0=SHT0_2+ADC12ON;//Setsamplingtime,turnonADC12ADC12CTL1=SHP;//Usesampli
- airqj 微控制器 MCU
- 2407片外扩充RAM最大值的问题
- 有资料说“2407的片外扩展程序空间和数据空间最大都只能是32K字,再多了也是浪费。”但是,F2407用仿真器仿真的时候,一般是用的是F2407片外的RAM存储器,这个时候MP/MC引脚应该是高电平。reset后dsp从外部程序空间的0000H开始执行。这样不是在整个64k字的程序空间都可以访问吗?不知这两种说法是怎么回事?2407片外扩充RAM最大值的问题仿真的时候不可以,烧写的时候不可以.是两种情况都不能访问到64k的程序空间吗?不好意思,写错了.仿真的时候可以.
- bluejb119 微控制器 MCU
- 【LPC54100】LPC54102带LCD板子(包装为LPC11U6x)如何上手?
- 本帖最后由guo8113于2015-3-2009:54编辑 收到活动的板子,甚是激动,一看包装盒顿时歇菜,再看板卡芯片,duang,竟然是54102.好吧,找资料,液晶屏的资料找不到,板子的资料找不到,USB找不到。。USB只是供电的?只能靠串口了,插上串口,duang奇迹发生了,白屏了,串口没反应。上个活动链接,跟官方的板子不一样的。https://bbs.eeworld.com.cn/thread-453383-1-1.html收到同样板卡的你们是如何上
- guo8113 NXP MCU
- 保安队HMI开发板-STM32H7S7(焊接篇)
- MCU:STM32H7S7NORFLASH:MX25UW256PSRAM:APS256XXNEMMC:THGBMJG6C1LBAIL保安队HMI开发板-STM32H7S7(焊接篇)STM32H7S不是今年刚出的芯片吗?这就有人用上了? 趁热乎
- bloody41760 stm32/stm8