单片机
返回首页

桥杯单片机设计与开发笔记(四)

2022-01-20 来源:eefocus

按键几乎也是每次蓝桥杯单片机设计与开发组竞赛的必考部分,因为这是CT107D开发平台上仅有的输入设备之一,而且按键也是单片机基础开发中常见的器件。


一、独立按键

1、原理分析


用跳帽把J5的引脚2和引脚3接起来,即可使用4个独立按键(如下图):S7,S6,S5,S4。按键的一端接到GND,另一端接到P3口的低四位,所以我们只要检测连接按键的P3口的某一位是否为低电平即可确定某一按键是否被按下。但是,因为存在抖动,所以需要进行消抖处理。总之,独立按键的按键检测基本流程为:检测是否有键按下,延时消抖,再次检测是否有键按下,执行按键按下后的相应操作,松手检测。

这里写图片描述

2、示例程序


sbit S7=P3^0;

sbit S6=P3^1;

sbit S5=P3^2;

sbit S4=P3^3;

//这里以S4为例

if(S4==0)   //检测S4是否被按下

{

    delay_ms(2);   //延时消抖

    if(S4==0)   //再次检测S4是否被按下

    {

       //这里执行按键后需要执行的操作  

    }

    while(S4==0);   //松手检测

}


二、矩阵键盘

1、原理分析


用跳帽把J5的引脚1和引脚2接起来,即可使用矩阵键盘(如下图)。矩阵键盘的检测常常采用行列扫描法。先进行行扫描,给P3口赋值为0x0f,当有键按下时P3口低四位的某一位的高电平会拉低,通过检测P3口高低电平的变化即可确定是哪一行的按键被按下,然后再给P3口赋值为0xf0,同理,当有键按下时P3口的高四位的某一位的高电平会被拉低,通过检测P3口的电平变化即可确定是哪一列的按键被按下,由行列交叉可以确定唯一的一个按键。

这里写图片描述

2、示例程序


先确定行来得到键值的临时值,待确定列后将键值的临时值加上列值得到最终的键值。当然,这里的按键编号可以进行合理的自定义,不需要和以下程序完全一样。


#include

#define uchar unsigned char

#define uint unsigned int

#define temp P3

uchar key_value = 0;

void keyscan()   //按键扫描函数

{

   temp = 0x0f;

   if(temp!=0x0f)    //扫描行

   {

      delay_ms(10);    //延时消抖

      switch(temp)

      {

         case 0x0e:   key_value = 0;   break;     

         case 0x0d:   key_value = 4;   break;

         case 0x0b:   key_value = 8;   break;

         case 0x07:   key_value = 12;  break;

      }


      temp = 0xf0;    //扫描列

      if(temp == 0x70)   key_value + = 0;     while(temp == 0x70);     //松手检测

      if(temp == 0xb0)   key_value + = 1;     while(temp == 0xb0);     //松手检测

      if(temp == 0xd0)   key_value + = 2;     while(temp == 0x0d);     //松手检测

      if(temp == 0xe0)   key_value + = 3;     while(temp == 0x0e);     //松手检测

   }

}


因为CT107D单片机开发平台采用IAP15F2K61S2单片机,使用的是转接板,由转接板原理图知矩阵键盘接的是P3口的低6位与P4.2、P4.4口,即用P4.2代替了P3.6,P4.4代替了P3.7,所以需要修改部分代码。


#include

#define uchar unsigned char

#define uint unsigned int

#define temp P3

sfr P4 = 0xc0;

sbit P44 = P4^4;

sbit P42 = P4^2;

uchar key_value = 0;

void keyscan()    //按键扫描函数

{

   temp = 0x0f; P42 = 0; P44 = 0;

   if(temp!=0x0f)    //扫描行

   {

      delay_ms(10);    //延时消抖

      switch(temp)

      {

         case 0x0e:   key_value = 0;   break;

         case 0x0d:   key_value = 4;   break;

         case 0x0b:   key_value = 8;   break;

         case 0x07:   key_value = 12;  break;

      }


      temp = 0xf0; P42 = 1; P44 = 1;    //扫描列

      if(P44 == 0)       key_value + = 0;     while(P44 == 0);       //松手检测

      if(P42 == 0)       key_value + = 1;     while(P42 == 0);       //松手检测

      if(temp == 0xd0)   key_value + = 2;     while(temp == 0x0d);   //松手检测

      if(temp == 0xe0)   key_value + = 3;     while(temp == 0x0e);   //松手检测

   }

}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章