独立按键

首先我们看一下按键的原理图,如图1,当J5中的2,3接在一起的时候,红线标注就是一个完整的电路图,此时只有s4、s5、s6、s7按键可以使用,也就是独立按键。例如:当我们按下s4时,电路导通,P33引脚被拉为低电平0,此时我们读取P33引脚电平的高低就能判断出哪个按键被按下。其他按键也是如此。

图1 独立按键

消抖 :

消抖的方法包括:硬件消抖和软件消抖。硬件消抖主要是通过添加滤波电路消除抖动干扰。软件消抖则是延迟时间,当检测到按键状态发生变化时,延迟5~10ms的时间,让抖动消失后,再次检测按键的状态。我们在这里主要使用软件消抖。当我们按下按键时,整个过程的波形如下图2所示。所以,当我们检测到按键状态发生变化时,加一个10ms的延迟后,再次检测按键状态,如果与上次状态相同则说明按键被按下。

图2 按键波形图

矩阵按键

如图3所示,J5中的1,2连接在一起就形成4X4的矩阵按键,这里我们设从下到上依次为Y1、Y2、Y3、Y4(行),从左到右依次为X1、X2、X3、X4(列),例如:想要扫描第一列时,只要使X1为低电平0,Y1、Y2、Y3、Y4为高电平1,此时如果没有按键按下,那么这个状态会一直保持。当S7按下的时候,由于X1为低电平0,S7按下电路导通,使得Y4也为低电平0。(这里我们就可以用代码判断:Y4的电平高低,当Y4为低电平时,说明S7按下)其他按键同理。

图3 矩阵按键

这里我们最好使用 #include "stc15f2k60s2.h" 而不是  #include "reg52.h" ,下图我们对比一下,reg52.h中有很多端口没有声明。而stc15f2k60s2.h中则比较全面。大家有兴趣也可以自己去头文件里看一下。

图4 reg52.h

图5 stc15f2k60s2.h

代码实现 :

如使用独立按键请将矩阵按键代码屏蔽,反之亦然。

独立按键S4的功能:按下时8个数码管全亮,松开时8个数码管全灭。

矩阵按键S4、S8、S12、S16的功能:按下S4 L1 L2亮,按下S8L3 L4亮,按下S12 L5 L6亮,按下S16 L7 L8亮,松开熄灭。

#include "stc15f2k60s2.h"sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;//***********独立按键****************
sbit s7 = P3^0;
sbit s6 = P3^1;
sbit s5 = P3^2;
sbit s4 = P3^3;
//***********************************//**********矩阵按键***************
//Y为行,X为列
sbit Y1=P3^3;
sbit Y2=P3^2;
sbit Y3=P3^1;
sbit Y4=P3^0;sbit X1=P4^4;
sbit X2=P4^2;
sbit X3=P3^5;
sbit X4=P3^4;void Delay1ms()       //@12.000MHz
{unsigned char i, j;i = 12;j = 169;do{while (--j);} while (--i);
}void delay_ms(int x)
{while(x--){Delay1ms();}
}/* 选择通道并且输入数据 */
void slect_138_573(unsigned char channel, unsigned char dat)
{P0 = 0x00;                                    /* 将原来P0口中的数据清0 */P0 = dat;                                        /* 这里用P0而不用其他端口是因为我们操作LED、数码管、继电器、蜂鸣器都是对P0进行操作 */switch(channel)                            /* 选择通道 */{case 4:                                      /* 使Y4输出低电平0,也就是操作LED */P2 = (P2 & 0x1f) | 0x80;/* (P2 & 0x1f)就是将前3位清0,再操作前3位。将0x80转为2进制1000 0000,这里只看前3位100就是Y4 */break;case 5:                                        /* 使Y5输出低电平0,也就是操作继电器和蜂鸣器 */P2 = (P2 & 0x1f) | 0xa0;break;case 6:                                       /* 使Y6输出低电平0,也就是操作8个数码管 */P2 = (P2 & 0x1f) | 0xc0;break;case 7:                                     /* 使Y7输出低电平0,也就是操作8个数码管中的1个数码管显示值 */P2 = (P2 & 0x1f) | 0xe0;break;case 0:                                       /* 关闭所有通道 */P2 = (P2 & 0x1f) | 0x00;break;}P2 = (P2 & 0x1f) | 0x00;       /* 使用后,关闭所有通道 */}*****************************独立按键***********************
void anjian(void)
{  if(s4==0){delay_ms(10);if(s4==0){slect_138_573(4, 0x00);while(s4==0);slect_138_573(4, 0xff);} }}********************************************************************//******************************矩阵按键*********************************//void anjian(void)
//{
//  Y1=0;//扫描第一行
//  Y2=Y3=Y4=1;
//  X1=X2=X3=X4=1;
//  if(X1==0)             /* s4 */
//  {
//      delay_ms(10);
//      if(X1==0)
//      {
//          slect_138_573(4, 0xfc);
//          while(X1==0);
//          slect_138_573(4, 0xff);
//      }
//  }
//  else if(X2==0)    /* s8 */
//  {
//    delay_ms(10);
//      if(X2==0)
//      {
//          slect_138_573(4, 0xf3);
//          while(X2==0);
//          slect_138_573(4, 0xff);
//      }
//  }
//  else if(X3==0)    /* s12 */
//  {
//    delay_ms(10);
//      if(X3==0)
//      {
//          slect_138_573(4, 0xcf);
//          while(X3==0);
//          slect_138_573(4, 0xff);
//      }
//  }
//  else if(X4==0)    /* s16 */
//  {
//    delay_ms(10);
//      if(X4==0)
//      {
//          slect_138_573(4, 0x3f);
//          while(X4==0);
//          slect_138_573(4, 0xff);
//      }
//  }
//
//
//}//***********************************************************************
void main(void)
{slect_138_573(0,0x00);slect_138_573(4,0xff);slect_138_573(5,0x00);slect_138_573(6,0xff);slect_138_573(7,0xff);while(1){anjian();}
}

蓝桥杯单片机比赛学习:3、独立按键与矩阵按键的基本原理相关推荐

  1. 蓝桥杯单片机比赛学习:8、PWM的基本原理之呼吸灯

    经过7节的学习,我们已经掌握了基本的硬件的使用规则,从本节开始我们开始学习一些模块的使用PWM.PCF8591.AT24C02.DS18B20.DS1302.555频率测量.光敏电阻测量.超声波测距等 ...

  2. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理

    中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...

  3. 蓝桥杯单片机比赛学习:11、频率测量的基本原理

    在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能.频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现. 频率测量的基本原理 产生脉冲的主要元件是555定时器.555定 ...

  4. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...

  5. 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块--PCF8591.我主页有其他模块的使用方法和基本原理(2条消息) Do My Best ...

  6. 蓝桥杯单片机比赛学习:7、中断系统之串口中断的基本原理

    这一节我们讲一下蓝桥杯单片机比赛中断中的最后一个模块--串口.中断的其他模块在我的个人主页(4条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主有兴趣的可以去学习. 通信 ...

  7. 蓝桥杯单片机比赛学习:1、led点亮原理

    此教程是鄙人蓝桥杯单片机的学习过程总结,可能会有错误,请指出批评.蓝桥杯单片机学习最重要的是将整个单片机模块化,比如,我们可以将它分为LED.蜂鸣器.继电器.数码管.按键.AD/DA.555定时器.光 ...

  8. 蓝桥杯单片机国赛客观题_蓝桥杯单片机比赛历年试题获取

    蓝桥杯单片机比赛历年试题获取!!! 准备蓝桥杯蓝桥杯比赛除了对板子各个模块的熟悉外,还有一件事,那就是把它们综合起来运用.当你单独使用板子上的某一个模块时,可能不会有什么问题,甚至对已经反复练习过后的 ...

  9. [蓝桥杯单片机]模块学习—中断系统

    前一段时间的文章已经跟各位一起刷了一部分的客观题了 接下来将会跟大家一起从官方提供的原理图和芯片手册出发 练习每个模块的程序编写 因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以 ...

最新文章

  1. 【Spark】Spark基础练习题(一)
  2. UVa 311 - Packets
  3. python读取文件参数_Python 通过配置文件 读取参数进行
  4. scala强制类型转换
  5. matplotlib(四)核心模式以及注意事项
  6. SQL 语句执行顺序
  7. dsniff 和 Ettercap 和 bettercap 详解 - 网络嗅探工具包
  8. python求1到n的乘积_Python实现矩阵相乘的三种方法小结
  9. Qt实践录:常见控件操作示例1
  10. 如何使用JMeter 对Dubbo接口进行测试
  11. 使用单元测试驱动开发的方式编写flask应用
  12. 洛谷——P1421 小玉买文具
  13. 《等级保护二级基本要求》
  14. U盘系统安装步骤超级简单,弄懂ghost不管是windows7win10都不难
  15. 3D立方体图片切换动画
  16. 当你的职业是一名IT项目经理
  17. 中国科学技术大学研究生免疫学技术原理与应用复习资料及历年题
  18. 信捷plc485通信上位机_上位机开发之三菱FX3U以太网通信实践
  19. JavaFX 边框背景
  20. 整理的apollo 入门课程

热门文章

  1. obsidian apk下载办法
  2. Allegro172版本DFM规则之Annular Ring
  3. 学计算机买笔记本r5还是i5,电脑处理器r5和i5哪个好
  4. Nginx封禁恶意IP
  5. 一分钟了解“查期刊的SCI分区”
  6. 2021年9月电子学会Python等级考试试卷(一级)考题解析
  7. 机器人学(一):构型空间(C-Space)
  8. linux 音频文件切割_linux下通过CUE分割APE、FLAC、WAV无损音频
  9. 偷走sex.com的疑犯落网
  10. 全球化(4):CultureInfo