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

发布者:等风来88888最新更新时间: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);   //松手检测

   }

}

关键字:蓝桥杯  单片机  独立按键 引用地址:桥杯单片机设计与开发笔记(四)

上一篇:蓝桥杯单片机设计与开发笔记(二)
下一篇:蓝桥杯单片机设计与开发笔记(三)

推荐阅读最新更新时间:2024-11-17 04:17

单总线AT89C51单片机多机通讯系统设计
提出了用单总线完成单片机通讯的方法。结合系统既传输数字信号又传输模拟信号的特点,提出用消侧音电路解决模拟信号的方案,并给出了详细的技术解决方案。 传统的多机通讯系统一般需要四条线完成: 1.电源线;2.地线;3.发送信号线;4.接收信号线。然而,对于主机和分机距离较远、分机台数较多的系统,采用四线制的经费投入较大,安装起来也颇困难。基于这一问题,本文结合为某医院研制的既有模拟信号(语音)又有数字信号的传输呼叫系统,提出用单总线实现多机通讯,并给出了一个完整的技术方案。 1 单总线制多机通讯系统的总线设计方案 本设计实现的多机呼叫系统的主要功能是:分机呼叫主机,利用单片微机向主机发送数字呼叫信息,主机响应后,显示出呼叫
[单片机]
单片机C程序延时精度研究
  在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几μs以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了 。 1 C语言程序延时   Keil C51的编程语言常用的有2种: 一种是汇编语言;另一种是C 语言。用汇编语言写单片机程序时,精确时间延时是相对容易解决的。比如,用的是晶振频率为12 MHz的AT89C51,打算延时20 μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 μs;“MOV R0,#X”
[单片机]
<font color='red'>单片机</font>C程序延时精度研究
单片机的模拟智能灌溉系统
模拟智能灌溉系统: 先上原理图 这是用proteus画的模拟图,当然还有实物图,不过都被我放在自己的工作室了(话说明明是实验室好不好)目前是在外面进一步学习,我就不把实物晒出来了。 程序的好坏在于它的流程图是否好,于是我就把我当时画的流程图拿了出来! 那么该项目到底是什么呢? 就是当年比赛的一个预习题,不过平台不一样搞得我当时比较狼狈就拿了个三等奖回来,哎,希望我嵌入式小组的学弟学妹们能够加油,帮我拿个一等奖回来!了了我心中的遗憾吧! 功能简述: 要求 模拟智能灌溉系统 能够实现土壤湿度测量、土壤湿度和时间显示、湿度阈值设定及存储等基本功能。通过电位器Rb2输出电压信号,模拟湿度传感器输出信号,再通过AD
[单片机]
<font color='red'>单片机</font>的模拟智能灌溉系统
51单片机数据存储类型
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型。分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。 在51系列中data,idata,xdata,pdata的区别: data:固定指前面0x00-0x7f的128个RAM,可以用acc直接
[单片机]
PIC单片机之步进电机
大家好, 通过前一期的学习, 我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232 串口等资源,体会到了学习板的易用性与易学性,看了前几期实例,当你实验成功后一定很兴奋,很有成就感吧!现在我们就趁热打铁,再向上跨一步,一起来学习一下步进电机的工作原理及使用方法,这是我们用单片机来控制机械进行运动的开始。 步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机就按设定的方向转动一个固定的角度(步距角)。通过控制脉冲个数来控制角位移量,可以达到准确定位;同时可以通过控制脉冲频率来控制电
[单片机]
PIC<font color='red'>单片机</font>之步进电机
用51Hei单片机开发板制作基于AD的数字电压表
/*************************************************************************** 晶振:11.0592M 跳线设置:跳线设置:J2的34端插上跳线帽 这个程序的上位机就用附带串口调试程序,在51hei单片机开发板上实验成功,发送01后 旋动电压调整电位器RP2,当前电压即可显示在串口调试程序的接受区如上图 单片机上电后等待从上位机发送来的命令,同时在数码管的前三位以十进制方式显 示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示000。 当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turn o
[单片机]
用51Hei<font color='red'>单片机</font>开发板制作基于AD的数字电压表
单片机ADC采用输入电压范围的调节
本文以STM32F429IGT6单片机为例。 STM32F429IGT6有 3 个 ADC,每个 ADC有 12 位、10 位、8 位和 6 位可选,每个ADC有 16 个外部通道。另外还有两个内部 ADC源和 V BAT 通道挂在 ADC1 上。ADC具有独立模式、双重模式和三重模式,对于不同 AD 转换要求几乎都有合适的模式可选。ADC功能非常强大,具体的我们在功能框图中分析每个部分的功能。 单个ADC功能框图如下所示: 掌握了 ADC的功能框图,就可以对 ADC有一个整体的把握,在编程的时候可以做到了然如胸,不会一知半解。框图讲解采用从左到右的方式,跟 ADC 采集数据,转换数据,传输数据的方向大概一致。 电压输
[单片机]
<font color='red'>单片机</font>ADC采用输入电压范围的调节
基于AT89C51单片机设计的简易智能机器人
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。 1 设计思想与总体方案 1.1 简易智能机器人的设计思想 本机器人能在任意区域内沿引导线行走,自动绕障,在有光源引导的条件下能沿光源行走。同时,能检测埋在地下的金属片,发出声光指示信息,并能实时存储、显示检测到的断点数目以及各断点至起跑线间的距离
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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