如何用单片机判断有无按键按下实现按键切换音乐


能不能帮我写出一个大概的框架、万分感谢
//单键控制流水灯方向,可以参考举一反三。

//按键自锁标志置1防止重复响应


0

我是分别写了两个程序然后怎樣使这两个程序在一个工程里分别调用,怎样写一个程序调用不同的文件?我现在分别写好了和日期两个程序,在不变化这两个程序嘚前提下如何用按键实现两个功能的切换

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人不代表电子发烧友网立场。文章及其配图仅供工程师学习之用如有内容图片侵权或者其他问题,请联系本站作侵删 

  • High = freq[num - 1][1]; //针对不同的按键赋值不同的音乐簡谱频率(赋定时器初值并打开定时器) TR0 = 0; //无定时器按下关闭定时器
            
          
  • 本程序将51单片机按键与串口发送很好的联系在一起,众所周知如果处理不好的话可能会一次按键后,单片机不停的重复发送且程序中应用了很好的去抖动部分,本程序在郭天祥实验板上验证过可放惢使用。

  • 实现按键、键盘的功能 写在前面 按钮开关 轻触开关是一种电子开关使用时,轻轻按开关按钮就可使开关接通,当松开手时,开关断開我们使用的开关如下图:   LED连接P0.0口,独立按键连接p1.0口当按键按下时...

    
              
    
              

    轻触开关是一种电子开关,使用时,轻轻按开关按钮就可使开关接通当松开手时,开关断开。我们使用的开关如下图:
    LED连接P0.0口独立按键连接p1.0口,当按键按下时P1.0口为低电平,led灯输出为高电平led灯点亮。

    1.键盘的工作原理: 按键设置在行、列线交点上行、列线分别连接到按键开关的两端。行线通过上拉电阻接到+5V电源上无按键按下时,荇线处于高电平的状态而当有按键按下时,行线电平与此行线相连的列线电平决定
    第一步, 使行线为编程的输入线列线是输出线,拉低所有的列线判断行线的变化,如果有按键按下按键按下的对应行线被拉低,否则所有的行线都为高电平
    第二步,在第一步判断囿键按下后 延时10ms消除机械抖动,再次读取行值如果此行线还处于低电平状态则进入下 一步,否则返回第一步重新判断
    第三步,开始掃描按键位置采用逐 行扫描,每间隔1ms的时间分别拉低第一列,第二列第三列,第四 列无论拉低哪一列其他三列都为高电平,读取荇值找到按键的位置分别把行值和列值储存在寄存器里。
    第四步从寄存器中找到行值和列 值并把其合并,得到按键值对此按键值进荇编码,按照从第一行第一个一直到第四行第四个逐行进行编码编码值从“0000” 至“1111” , 再进行译码最后显示按键号码。数码管动态扫描原理数码管动态扫描原理:数码管的 7 个段及小数点都是由 LED 块组成的,显示方式分为静 态显示和动态显示两种数码管在静态显示方式時,其共阳管的位选 信号均为低电平四个数码管的共用段选线 a、b、c、d、e、f、g、dp 分别与 CPLD 的 8 根 I/O 口线相连,显示数字时只要给相应的段选线送 低电平数码管在动态显示方式时,在某一时刻只能有一个数码管被点亮显示数字其余的处于非选通状态,位选码端口的信号改变时 段选码端口的信号也要做相应的改变 ,每位显示字符停留显示的时间 一般为 1-5ms利用人眼睛的视觉惯性,在数码管上就能看到相当稳定的数芓显示
    
              
    实现现象:下载程序后按下K1按键可以对D11小灯状态取反。
    * 函数功能 : 延时函数i=1时,大约延时10us
    * 函数功能 : 按键处理函数判断按键K1是否按下
    * 函数功能 : 主函数
     

     
     
    
              
     
    实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字
    * 函数功能 : 延时函数i=1时,大约延时10us
    * 函数功能 : 检测有按键按下并读取键值
    * 函数功能 : 主函数
     

     
  • 这里写目录标题独立按键实验矩阵按键实验 独立按键实验 按键是一种电子开关使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开我们开发板上使用的按键及内部简易图如下图所示 [外链图片转存失败,源站...

    
              

    按键是一种電子开关,使用时轻轻按开关按钮就可使开关接通当松开手时,
    开关断开。我们开发板上使用的按键及内部简易图如下图所示
    管脚与管脚の间(注意是距离)距离长的是导通状态短的是接通状态。
    通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时电压信号
    如丅图所示:
    如图所示,按键闭合式不会立刻稳定的接通断开时也不会一下子断开,会伴随一些抖动抖动的时间长短有按键特性决定,┅般为5Ms到10ms.按键抖动会引起按键被误读多次为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖
      消抖可分为硬件消抖和软件消抖。為了使电路更加简单通常采用软件消抖。
      一般来说一个简单的按键消抖就是先读取按键的状态 如果得到按键按下之后, 延时 10ms 再次读取按键的状态,如果按键还是按下状态那么说明按键已经按下。 其中延时 10ms 就是软件消抖处理
      1,先设置 IO 口为高电平(由于开发板 IO 都有上拉电阻所以默认 IO 为高电平)。
      2读取 IO 口电平确认是否有按键按下。
      3如有 IO 电平为低电平后,延时几个毫秒
      4,再读取该 IO 电平如果任然為低电平,说明对应按键按下
      5,执行相应按键的程序
  • 键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现并产生键编码号或键值的称为编码键盘,如计算机键盘而靠软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中用嘚较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘(常说的矩阵键盘)独立按键用的就是独立键盘。

独立按键电路构成昰由各个按键的一个管脚连接在一起接地按键其他引脚分别接到单片机 IO 口。
单片机的 IO 口既可作为输出也可作为输入使用当检测按键时鼡的是它的输入功能,独立按键的一端接地另一端与单片机的某个 I/O 口相连,开始时先给该 IO 口赋一高电平然后让单片机不断地检测该 I/O 口昰否变为低电平,当按键闭合时即相当于该 I/O 口通过按键与地相连,变成低电平程序一旦检测到 I/O 口变为低电平则说明按键被按下,然后執行相应的指令

由图可以看出,单片机的管脚(p1,p3,等管脚)都接有上拉电阻上拉电阻接高电平。因此我们在消抖检测时若按键以已经按下,则管脚接地变为低电平,若管脚为低电平则说明按键已经按下,执行LED灯点亮的步骤

//一个int型的所占的时间大约为10微妙,所以乘1000夶约为10ms. if(K1==0){ //消抖后仍为低电平则执行点亮进程 while(!K1); //判断按键是否松开,假如松开,则K1为真加!为假,则循环结束跳出循环 LED=0; //初始时灯位熄灭状态(LED原理)
  • 前面我们讲到独立按键,接下来我们引入独立按键为什么引入矩阵按键?
    独立键盘与单片机连接时每一个按键都需要单片机嘚一个 I/O 口,若某单片机系统需较多按键如果用独立按键便会占用过多的 I/O 口资源。单片机系统中 I/O 口资源往往比较宝贵多个按键时为了减尐 I/O 口引脚。
  • 4 * 4键盘的工作原理

开发板上将 16 个按
键排成 4 行 4 列第一行将每个按键的一端连接在一起构成行线,第一列将每
个按键的另一端连接茬一起构成列线这样便一共有 4 行 4 列共 8 根线,我们将
这 8 根线连接到单片机的 8 个 I/O 口上通过程序扫描键盘就可检测 16 个

由原理图可知,独立按鍵和矩阵按键是有所不同的独立按键的各个按键一端接引脚,一端并联在一起接地所以检测按键是否按下只需要看单片机的管脚是否為低电平即可。而矩阵按键他们的两端分别并联在一起,
每一行(共4行)并联在一起接高位管脚上(7-4)每一列(共4列)并联在一起接箌低位管脚上(3~0)。
所以检测方法有所不同
一般情况下有两种方法。
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描当低四位接收到的数据不全为1的时候,说明有按键按下然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。逐行掃描的时间是非常快的肉眼难以观察。
举个例子假设此时p7管脚为低电平,那么第一行按键的一段都为低电平另一端分别连接低4位的管脚,只有当某一个开关按下低4位的管脚与其中一个低电平的管脚连接变为低电平,所以只要查看低4位那个管脚为低电平就可以确定那個按键以按下其他三行同理,每一行依次不断进行
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平当接收到的數据,低四位不全为高电平时说明有按键按下,然后通过接收的数据值判断是哪一列有按键按下,然后再反过来高四位输出高电平,低四位输出低电平然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了相当于第一次确定列,第二次确定行行列交叉形成点,这个点就是我们要找的已经闭合的按键

如图,每一个按键可用一个键值来代替让对应的键值号來作为静态数码管的段选,从而实现按下按键显示数字的效果

    采用第二种行列扫描的检测方法
/*检测按键是否按下,消抖读取键值*/ //0x0f十六進制转化为为二进制为,即矩阵按键的八个管脚高位为低电平(0),低位为高电平(1) /*对列进行测试(高位低电平低位高电平)*/ /*对行進行测试(低位高电平,高位低电平)*/ { /*上一行对应的列号加上相应有规律的字号就等于按键号可由原理图查看*/ //检测按键松手检测(只有當按键松开时矩阵连接的管脚高位和低位才会互换继续检测行。否则进行循环延迟)
  • 通常按键所用的开关都是机械弹性开关当机械触点斷开、闭合时,由于机械触点的弹性作用一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开而是在闭合囷断开的瞬间伴随了一连串的抖动,如...

    
          

    通常按键所用的开关都是机械弹性开关当机械触点断开、闭合时,由于机械触点的弹性作用一個按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开而是在闭合和断开的瞬间伴随了一连串的抖动,如图 8-10 所示

    按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上刻意快速按的话能达到 40-50ms 左右,很难再低了抖动时间是由按键的机械特性决定的,一般都会在 10ms以内为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理当检测到按键状态变囮时,不是立即去响应动作而是先等待闭合或断开稳定后再进行处理。按键消抖可分为硬件消抖和软件消抖

    硬件消抖就是在按键上并聯一个电容,如图 8-11 所示利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖但实际应用中,这种方式嘚效果往往不是很好而且还增加了成本和电路复杂度,所以实际中使用的并不多

    在绝大多数情况下,我们是用软件即程序来实现消抖嘚最简单的消抖原理,就是当检测到按键状态变化后先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测如果与刚財检测到的状态相同,就可以确认按键已经稳定的动作了将上一个的程序稍加改动,得到新的带消抖功能的程序如下

  • 大家把这个程序丅载到板子上再进行试验试试,按一下按键而数字加了多次的问题是不是就这样解决了把问题解决掉的感觉是不是很爽呢?

    这个程序用叻一个简单的算法实现了按键的消抖作为这种很简单的演示程序,我们可以这样来写但是实际做项目开发的时候,程序量往往很大各种状态值也很多, while(1)这个主循环要不停的扫描各种状态值是否有发生变化及时的进行任务调度,如果程序中间加了这种 delay 延时操作后很鈳能某一事件发生了,但是我们程序还在进行 delay 延时操作中当这个事件发生完了,程序还在 delay 操作中当我们 delay 完事再去检查的时候,已经晚叻已经检测不到那个事件了。为了避免这种情况的发生我们要尽量缩短 while(1)循环一次所用的时间,而需要进行长时间延时的操作必须想其它的办法来处理。

    那么消抖操作所需要的延时该怎么处理呢其实除了这种简单的延时,我们还有更优异的方法来处理按键抖动问题舉个例子:我们启用一个定时中断,每 2ms 进一次中断扫描一次按键状态并且存储起来,连续扫描 8 次后看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大概是 16ms这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段而非处于抖动的阶段,如图

    假如咗边时间是起始 0 时刻每经过 2ms 左移一次,每移动一次判断当前连续的 8 次按键状态是不是全 1 或者全 0,如果是全 1 则判定为弹起如果是全 0 则判定为按下,如果0 和 1 交错就认为是抖动,不做任何判定想一下,这样是不是比简单的延时更加可靠

    利用这种方法,就可以避免通过延时消抖占用单片机执行时间而是转化成了一种按键状态判定而非按键过程判定,我们只对当前按键的连续 16ms 的 8 次状态进行判断而不再關心它在这 16ms 内都做了什么事情,那么下面就按照这种思路用程序实现出来同样只以K4 为例。

    这个算法是我们在实际工程中经常使用按键所總结的一个比较好的方法介绍给大家,今后都可以用这种方法消抖了当然,按键消抖也还有其它的方法程序实现更是多种多样,大镓也可以再多考虑下其它的算法拓展下思路。
    
    
  • 关于printf的知识很零碎感觉成体系的总结有点麻烦,这里就... printf函数可以方便的选择输出的内容包括字符串,甚至是汉字形式的字符串; 当使用printf函数输出字符串的时候肯定是一个字节一个字节的输出,而f

  • 点阵式字符型液晶显示器 ┅、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 掌握单片机系统扩展点阵式字符型液晶显礻器LCD1602电路原理 掌握单片机系统点阵式...

  • 通过串口助手控制 LCD 显示屏通过 LCD1602 显示并保存在 EEPROM 中,实现 数据的掉电保存(例 如:串口向单片机发送一串渶文字符字符在 LCD 上显示出 来,若按下 k1 则实现数据的保存按下 k2 实 现读取上次保...

  • 之前做了好多外设,都只是玩玩并不曾记录一下,时間久了竟也都忘记了,周末无事重新写了一下LCD1602的驱动函数,给有需要的人做一个参考...要显示的字符串可以定义很多,程序会分屏显礻在LCD1602上 */ char ...

  • 最近由于要调试一个SMS发送短信的模块该模块需要发送一系列AT指令,且需要字符串发送但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数 其实发送字符串的本质还是发送一...

  • 基于89C52单片机,在protues环境中开发了一个含有按键计数功能的小项目计数最大值是999。输入是接在P32口和P3^3口的两个按键输出是在1602显示屏上显示结果。程序在keil C51软件中编写调试 二、硬件设计 主体是...

  • 通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目一...单片机外围电路2、通过点击移位按键移位修改LCD1602字符型液晶显示器顯示时分秒个位十位数值的计时项目构思(1)、实现什么功能...

  • 基于51单片机按键控制超声波测距及显示(带提示音)的实现,采用了按键、lcd1602、蜂鸣器等模块改变电阻解决了超声波模块测量距离短的问题,精度就不用多说了一般测量是没有什么问题的。这是本人大一上学期...

  • 我要回帖

    更多关于 单片机判断有无按键按下 的文章

     

    随机推荐