51单片机系列学习——逐行扫描的方式实现矩阵按键的仿真

发布者:boczsy2018最新更新时间:2022-01-12 来源: eefocus关键字:51单片机系列  逐行扫描  矩阵按键 手机看文章 扫描二维码
随时随地手机看文章

小编今天原本想用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

关键字:51单片机系列  逐行扫描  矩阵按键 引用地址:51单片机系列学习——逐行扫描的方式实现矩阵按键的仿真

上一篇:小白学习HC-05蓝牙透传模块
下一篇:51单片机系列——LCD1602显示计算器上按键字符

推荐阅读最新更新时间:2024-11-10 12:28

单片机实验板2011_V1.1-矩阵按键练习
原理图: /************单片机教学实验板 ******************/ /*功能描述:学习板整体演示程序 */ /*作者:郑 文 */ /*编写时间:2011.3.1 */ /*接外部晶振11.0592 MHZ */ /*功能描述*/ /*4*4矩阵按键练习*/ #include reg52.h #include STC_Delay.h #include stdio.h #include stdlib.h #include intrins.h #include math.h
[单片机]
单片机实验板2011_V1.1-<font color='red'>矩阵按键</font>练习
51单片机系列——通过位运算符来实现流水灯
基础知识 1)首先认识一个寄存器(例如P1)占一个字节,而一个字节多数是8位,例如P1 = 11111111,即P1^0 到P1^7都是1。 我们可以看成一个字节的二进制数代表我们的8个IO口如下表所示 2)其次要知道LED灯为1时(LED = 1)即高电平,灯熄灭。相反(LED = 0)低电平,则灯亮。 3)移位运算符效果: /*默认P1 = b11111111*/ P1 = P1 1 ; /*执行一次结果为 11111110 ,即整体左移一位 最右边用低电平0来替代 */ 4)头文件intrins的函数使用 _crol_(xx,m) xx寄存器字符循环左移m位 _cror_(xx,m) xx寄存
[单片机]
<font color='red'>51单片机</font><font color='red'>系列</font>——通过位运算符来实现流水灯
51单片机 矩阵按键控制数码管显示0~F
通过按下4*4矩阵按键让数码管显示对应的数值 #include reg52.h typedef unsigned char u8; typedef unsigned int u16; u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0 1 2 3 4 5 6 7 8 9 A b C d E F u16 key_value; void delay(u16 i) { while(i--); } void keyscan() { P1=
[单片机]

推荐帖子

【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
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved