精华内容
下载资源
问答
  • 单片机按键程序

    2012-03-14 21:56:33
    里面很多按键程序,还有一个按键文档,适用于单片机初学者
  • 单片机按键使用程序 (51单片机

    千次阅读 2019-10-30 20:40:08
    单片机独立按键使用程序 (51单片机) 独立按键单片机中很重要的一器件,在这篇文章里,通过这用独立按键控制LED灯的小程序来介绍独立按键开关的使用。 ...

    单片机独立按键使用程序 (51单片机)

    独立按键是单片机中很重要的一个器件,在这篇文章里,通过这个用独立按键控制LED灯的小程序来介绍独立按键开关的使用。

    #include<reg52.h>
    typedef unsigned int u16;
    typedef unsigned char u8;
    sbit key=P3^1; 
    sbit led=P2^0;  
    
    void delay(u16 num)//延时函数
    {
     u16 x,y;
     for(x=num;x>0;x--)
      for(y=110;y>0;y--)
     {
      ;
     }
    }
    void main(void)
    {
     led=1;
     while(1)
    {
     if(key==0)
     {
      
      delay(10);//消抖程序
      if(key==0)
      {
      led=~led;//取反
      }
      while(!key);//使灯在开关下一次按下之前不发生变化,不跳出大循环
     }
    }
    }
    

    两次按下按键的结果图
    1

    在这里插入图片描述

    运行视频
    在这里插入图片描述
    关注公众号,了解更多。

    在这里插入图片描述

    展开全文
  • 51单片机简洁按键程序

    万次阅读 多人点赞 2018-10-10 11:47:46
    最为精辟和实用的按键处理程序;1.新型的按键扫描程序;不过我在网上游逛了很久,也看过不少源程序了,没有;同时,这里面用到了一些分层的思想,在单片机当中也;以下假设你懂C语言,因为纯粹的C语言描述,所以和;...

    最为精辟和实用的按键处理程序;1.新型的按键扫描程序;不过我在网上游逛了很久,也看过不少源程序了,没有;同时,这里面用到了一些分层的思想,在单片机当中也;以下假设你懂C语言,因为纯粹的C语言描述,所以和;核心算法:;unsignedcharTrg;;unsignedcharCont;;voidKeyRead(void);unsignedcharReadDat

          最为精辟和实用的按键处理程序

          1.新型的按键扫描程序

          不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。

          同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。 对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。因为这是实际项目中总结出来的经验,学校里面学不到的东西。

          以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。当然,我自己也是在多个项目用过,效果非常好的。 好了,工程人员的习惯,废话就应该少说,开始吧。以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。

          核心算法:

          unsigned char Trg;

          unsigned char Cont;

          void KeyRead( void )

          {

          unsigned char ReadData = PINB^0xff; // 1

          Trg = ReadData & (ReadData ^ Cont); // 2

          Cont = ReadData; // 3

          }

          完了。有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!! 下面是程序解释:

          Trg(triger) 代表的是触发,Cont(continue)代表的是连续按下。

          1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

          2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。

          3:算法2,用来计算连续变量。

          看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。

          我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。下面就看看具体几种情况之下,这算法是怎么一回事。

          (1) 没有按键的时候

          端口为0xff,ReadData读端口并且取反,很显然,就是 0x00 了。

          Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。

          Cont = ReadData; 保存Cont 其实就是等于ReadData,为0;

          结果就是:

          ReadData = 0;

          Trg = 0;

          Cont = 0;

          (2) 第一次PB0按下的情况

          端口数据为0xfe,ReadData读端口并且取反,很显然,就是 0x01 了。

          Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。那么这个式子的值也不难算,也就是 Trg = 0x01 & (0x01^0x00) = 0x01

          Cont = ReadData = 0x01;

          结果就是:

          ReadData = 0x01;

          Trg = 0x01;Trg只会在这个时候对应位的值为1,其它时候都为0

          Cont = 0x01;

          (3) PB0按着不松(长按键)的情况

          端口数据为0xfe,ReadData读端口并且取反是 0x01 了。

          Trg = ReadData & (ReadData ^ Cont); 因为这是连续按下,所以Cont是上次的值,应为为0x01。那么这个式子就变成了 Trg = 0x01 & (0x01^0x01) = 0x00

          Cont = ReadData = 0x01;

          结果就是:

          ReadData = 0x01;

          Trg = 0x00;

          Cont = 0x01;

          因为现在按键是长按着,所以MCU会每个一定时间(20ms左右)不断的执行这个函数,那么下次执行的时候情况会是怎么样的呢?

          ReadData = 0x01;这个不会变,因为按键没有松开

          Trg = ReadData & (ReadData ^ Cont) = 0x01 & (0x01 ^ 0x01) = 0 ,只要按键没有松开,这个Trg值永远为 0 !!!

          Cont = 0x01;只要按键没有松开,这个值永远是0x01!!

          (4) 按键松开的情况

          端口数据为0xff,ReadData读端口并且取反是 0x00 了。

          Trg = ReadData & (ReadData ^ Cont) = 0x00 & (0x00^0x01) = 0x00

          Cont = ReadData = 0x00;

          结果就是:

          ReadData = 0x00;

          Trg = 0x00;

          Cont = 0x00;

          很显然,这个回到了初始状态,也就是没有按键按下的状态。

          总结一下,不知道想懂了没有?其实很简单,答案如下:

          Trg 表示的就是触发的意思,也就是跳变,只要有按键按下(电平从1到0的跳变),那么Trg在对应按键的位上面会置一,我们用了PB0则Trg的值为0x01,类似,如果我们PB7按下的话,Trg 的值就应该为 0x80 ,这个很好理解,还有,最关键的地方,Trg 的值每次按下只会出现一次,然后立刻被清除,完全不需要人工去干预。所以按键功能处理程序不会重复执行,省下了一大堆的条件判断,这个可是精粹哦!!Cont代表的是长按键,如果PB0按着不放,那么Cont的值就为 0x01,相对应,PB7按着不放,那么Cont的值应该为0x80,同样很好理解。

          如果还是想不懂的话,可以自己演算一下那两个表达式,应该不难理解的。

          因为有了这个支持,那么按键处理就变得很爽了,下面看应用:

          应用一:一次触发的按键处理

          假设PB0为蜂鸣器按键,按一下,蜂鸣器beep的响一声。这个很简单,但是大家以前是怎么做的呢?对比一下看谁的方便?

          #define KEY_BEEP 0x01

          void KeyProc(void)

          {

          if (Trg & KEY_BEEP) // 如果按下的是KEY_BEEP

          {

          Beep(); // 执行蜂鸣器处理函数

          }

          }

          怎么样?够和谐不?记得前面解释说Trg的精粹是什么?精粹就是只会出现一次。所以你按下按键的话,Trg & KEY_BEEP 为“真”的情况只会出现一次,所以处理起来非常的方便,蜂鸣器也不会没事乱叫,hoho~~~

          或者你会认为这个处理简单,没有问题,我们继续。

          应用2:长按键的处理

          项目中经常会遇到一些要求,例如:一个按键如果短按一下执行功能A,如果长按2秒不放的话会执行功能B,又或者是要求3秒按着不放,计数连加什么什么的功能,很实际。不知道大家以前是怎么做的呢?我承认以前做的很郁闷。

          但是看我们这里怎么处理吧,或许你会大吃一惊,原来程序可以这么简单

          这里具个简单例子,为了只是说明原理,PB0是模式按键,短按则切换模式,PB1就是加,如果长按的话则连加(玩过电子表吧?没错,就是那个!)

          #define KEY_MODE 0x01 // 模式按键

          #define KEY_PLUS 0x02 // 加

          void KeyProc(void)

          {

          if (Trg & KEY_MODE) // 如果按下的是KEY_MODE,而且你常按这按键也没有用,

      { //它是不会执行第二次的哦 , 必须先松开再按下

          Mode++; // 模式寄存器加1,当然,这里只是演示,你可以执行你想

          // 执行的任何代码

          }

          if (Cont & KEY_PLUS) // 如果“加”按键被按着不放

          {

          cnt_plus++; // 计时

          if (cnt_plus > 100) // 20ms*100 = 2S 如果时间到

          {

          Func(); // 你需要的执行的程序

          }

          }

          }

          不知道各位感觉如何?我觉得还是挺简单的完成了任务,当然,作为演示用代码。

          应用3:点触型按键和开关型按键的混合使用

          点触形按键估计用的最多,特别是单片机。开关型其实也很常见,例如家里的电灯,那些按下就不松开,除非关。这是两种按键形式的处理原理也没啥特别,但是你有没有想过,如果一个系统里面这两种按键是怎么处理的?我想起了我以前的处理,分开两个非常类似的处理程序,现在看起来真的是笨的不行了,但

          是也没有办法啊,结构决定了程序。不过现在好了,用上面介绍的办法,很轻松就可以搞定。

          原理么?可能你也会想到,对于点触开关,按照上面的办法处理一次按下和长按,对于开关型,我们只需要处理Cont就OK了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~

     

     

    转载原地址:http://www.51hei.com/bbs/dpj-41204-1.html,如侵删

    展开全文
  • 每一个按键对应一个led灯, ** #include <reg51.h> #define uint unsigned int #define uchar unsigned char //定义按键端口 sbit key1 = P1^0;//定义按键端口1 sbit key2 = P1^1; sbit key3 = P1^2; sbit key...

    51单片机8路独立按键开关程序

    每一个按键对应一个led灯,实现独立开关灯。
    源程序:
    ** #include <reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    //定义按键端口
    sbit key1 = P1^0;//定义按键端口1
    sbit key2 = P1^1;
    sbit key3 = P1^2;
    sbit key4 = P1^3;//定义按键端口4
    sbit key5 = P1^4;
    sbit key6 = P1^5;
    sbit key7 = P1^6;
    sbit key8 = P1^7;

    sbit led1 = P2^0; //定义LED灯1
    sbit led2 = P2^1;
    sbit led3 = P2^2;
    sbit led4 = P2^3; //定义LED灯4
    sbit led5 = P2^4;
    sbit led6 = P2^5;
    sbit led7 = P2^6;
    sbit led8 = P2^7;

    //延时函数声明
    void delay(uint xms);
    //程序入口
    void main(){
    while(1){
    //第一次判断
    if(key1 == 0){
    //延时20ms 消除抖动
    delay(20);
    //第二次判断

    1. List item

      if(key1 == 0){
      led1 = ~led1;// 灯亮

      }
      while(!key1); //当按键未松开时,key为0,执行该死循环。
      //等待按键被松开
      }
      if(key2 == 0){
      //延时20ms 消除抖动
      delay(20);
      //第二次判断
      if(key2 == 0){
      led2 = ~led2; //灯亮

      }

      //等待按键被松开

      while(!key2); //当按键未松开时,key为0,执行该死循环。
      }
      if(key3 == 0){
      //延时20ms 消除抖动
      delay(20);
      //第二次判断
      if(key3 == 0){
      //灯亮
      led3 = ~led3;

      }

      //等待按键被松开

      while(!key3); //当按键未松开时,key为0,执行该死循环。
      }

      if(key4 == 0){
      //延时20ms 消除抖动
      delay(20);
      //第二次判断
      if(key4 == 0){
      led4 = ~led4;// 灯亮

      }
      while(!key4); //当按键未松开时,key为0,执行该死循环。
      //等待按键被松开
      }
      if(key5 == 0){
      //延时20ms 消除抖动
      delay(20);
      //第二次判断
      if(key5 == 0){
      led5 = ~led5; //灯亮

      }

      //等待按键被松开

      while(!key5); //当按键未松开时,key为0,执行该死循环。
      }
      if(key6 == 0){
      //延时20ms 消除抖动
      delay(20);
      //第二次判断
      if(key6 == 0){
      //灯亮
      led6 = ~led6;

      }

      //等待按键被松开

      while(!key6); //当按键未松开时,key为0,执行该死循环。
      }
      if(key7 == 0){
      //延时20ms 消除抖动
      delay(20);
      //第二次判断
      if(key7 == 0){
      led7 = ~led7; //灯亮

      }

      //等待按键被松开

      while(!key7); //当按键未松开时,key为0,执行该死循环。
      }
      if(key8 == 0){
      //延时20ms 消除抖动
      delay(20);
      //第二次判断
      if(key8 == 0){
      //灯亮
      led8 = ~led8;

      }

      //等待按键被松开

      while(!key8); //当按键未松开时,key为0,执行该死循环。
      }

      }
      }
      void delay(uint xms)
      {
      uint i,j;
      for(i = 0; i<xms; ++i)
      for(j = 0; j<110; ++j);
      }

       **
      
    展开全文
  • 蓝桥杯单片机独立按键扫描程序

    千次阅读 2019-01-26 22:51:42
    最近自己在做单片机的东西,准备参加比赛,偶然发现了独立按键的神助攻——三行搞定独立按键,看到网上很描述的不清晰,自己又花时间整理了一下,话不说先上代码: void Key_Read(void) { ReadData=KeyPort...

    最近自己在做单片机的东西,准备参加比赛,偶然发现了独立按键的神助攻——三行搞定独立按键,看到网上很多描述的不清晰,自己又花时间整理了一下,话不多说先上代码:

    void Key_Read(void)
      {
       ReadData=KeyPort^0xff;
      Trg=ReadData&(ReadData^Cont);
      Cont=ReadData;
      }
    

    千万不要小瞧了这三行代码,威力可是相当的大啊。
    首先说一下这几个小符号:异或"^",与"&",或"||",非"~"。在这几行代码中,Trg(Triger) 代表的是触发,Cont(continue)代表的是连续、继续。
    对于独立按键或者矩阵键盘,我们要解决的问题无非就是1.按键未按下时;2.按键按下时;3.按键一直按下时;4.按键弹起复原,这四种状态下分别对应的要发生的情况。那么对于这几行代码我们倒着去分析,今天不去想它怎么写出来的,我们想想为什么要这要写,这样写的巧妙之处在哪。
    我们假设按键K1对应的端口为P3^0,可以得到如下图所示的关系(具体过程按照代码推导一下就出来了):
    在这里插入图片描述
    四种情形其实只有三种,无按下时与按下后复原的情况相同,我们只要区别开按键单次按下和长按的区别即可,此时再去看Trg与Cont的区别是不是更为明显了呢?Trg(Triger) 代表的是单次触发,Cont(continue)代表的是连续按下。只有在长按时,Trg为0,其余均为0X01,可以有效的对两种情况进行区分。
    从本质上来讲,这一个扫描函数就是一直在循环往复的运行,大约是每10ms进行一次扫描,可以从以下时间轴来看:对于扫描的周期我假定为10ms
    就这样,通过这个10ms的周期扫描以及Trg与Cont之间的关系,巧妙的解决了按键的抖动问题与单词按键和长时间按键的问题

    在这里插入图片描述

    展开全文
  • C51单片机——多个按键中断控制实现 1.实现代码 /* * 2018-10-22 */ #include&lt;STC15F2K60S2.h&gt; #define uchar unsigned char #define uint unsigned int sbit KEY_1 = P3^2; sbit KEY_2 = P3^3; ...
  • 设定一个定时器中断,每隔10MS 扫描一次按键。,读取值。。如果多个按键,又有多余的定时器,可以试试这个方法,效率高了。搞STM32 刚好。 cool.
  • 单片机-多个按键的操作

    千次阅读 2020-04-15 19:35:52
    使用软件Proteus和Keil uVision4 代码如下: #include int num; char code table[]={0xc0,... } } 电路仿真效果 按下松开第一个按键,就显示1, 同样按下第n个按键,就显示n。 使用: 80C51 ,BUTTON , 7SEG-COM-AN-GRN
  • 51单片机按键控制程序源代码,单片机按键控制源码包括:CPU控制的按键扫描实验、按键加1数码管显示、按键可调节的电子时钟、定时中断控制的按键程序、独立式键盘的按键一键功能程序、独立式键盘控制的4级变速流水...
  • 单片机按键消抖程序

    万次阅读 2014-09-15 12:27:33
    通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如...
  • 独立按键原理是这样的:按键没按下的时候,相应端口是高电平状态,而当按键按下的时候,相应的端口则是低...所以可以根据这现象,实现相应的功能。 还有一点应该注意的是:按键在闭合和断开时,触点会存在抖动现象。
  • 按键电路是单片机应用中最广泛最简单的一个电路了,实际项目中经常会用到按键,但是一个按键往往需要占用一个IO口,特别是单片机资源比较紧张的情况下,IO就显得更加珍贵了。如果要用到按键,同时又不想浪费IO口,...
  • 功能独立按键程序

    2018-01-09 19:19:23
    用状态机写的单片机多功能按键程序,程序注释清晰,只要稍作修改便可移植使用
  • 单片机 矩阵式按键

    万次阅读 多人点赞 2018-05-28 14:39:04
    单片机应用系统中,通过按键实现数据输入及功能控制是非常普遍的,通常在所需按键数量不时,系统常采用独立式按键。需要按键数量比较,为了减少I/O口的占用,通常将按键排列成矩阵。测试环境为Win7-32bit-2G...
  • 单片机按键检测程序(定时器法消抖) 相信大家在初学51单片机的时候按键检测为了消抖都会加一些空循环做软件延时。这样做可是浪费了CPU的不少资源。对于51这种低端单片机做一些功能很的项目时软件延时的方法不仅...
  • AT89S52单片机按键程序

    2010-08-22 14:54:22
    按键程序 #include #define uchar unsigned char #define uint unsigned int sbit clk=P0^2;//指定位变量名的位置 产生时钟脉冲 sbit Data=P0^3;//同上 串行数据输入口 void display(num); uchar num,temp,qq,aa,c;...
  • 单片机的按键编程中,有时会遇到一个问题,用多个按键来控制多个死循环,而程序一旦进入循环就跳不出来,此时会想到用中断,而普通单片机一般只有2个外部中断,stc系列的查了一下最多也只有5个外部中断,那要是...
  • 有关单片机按键 长按 短按 双击 组合按程序分享啊
  • 单片机控制,结合按键和数码管,实现按键控制数码管显示0-8的C程序。经过51单片机调试验证
  • 单片机-4独立按键的控制程序

    千次阅读 2019-05-04 11:00:00
    确认按键已经按下 35 while (! K1); 36 } 37 if (! K2) 38 { 39 // 软件延时消除抖动 40 Delayms( 10 ); 41 if (! K2) 42 { 43 LED_2 = ! LED_2; 44 } 45 ...
  • 我研究单片机几年了,在单片机编程中我认为最难得就是人机接口的问题。想和大家分享一下,此程序是我用状态机编的按键程序。绝对有用。
  • 51单片机之独立按键

    万次阅读 多人点赞 2019-05-15 12:03:00
    但是无论如何,所有的按键其实都有一原型,来源于同一种原理,所有的按键无论复杂,华丽,都是从这样一原型发展而成的。好比你就算长的再帅,你也是只猩猩变来的,呵呵。我们平日所见到的绝大部分的按键,...
  • 在这架钢琴上,我们可以看到遍布着很按键,有琴键,也有功能选择的按键,面对如此的按键,对于一个刚出来工作的小伙伴肯定压力比较大,琴键的特征和普通按键不太一样,琴键的一个按键由两个按键组成,一个按键...
  • 本文旨在介绍单片机入门的基础知识,为初接触或即将接触单片的新手提供一入门指导。本文章会陆续推出,隔几天一章节。所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和...按键单片机系统中最常用的交互方式
  • 一直在思考一不使用延时函数同时兼容性和移植性较强的按键驱动程序。之前用了半天时间总算是写出来这驱动程序,还不是很成熟,不足之处多多指正。在讲解之前,先说明一下按键,短按,长按,单击,击分别是如何...
  • 上图是一共4个按键的独立按键,低电平触发,明白这些,再来看看消抖,如下图。 上图的示意图中是不是有“键稳定”的部分?我们可以通过这一部分细化, 通过键稳定的时间来判断单击还是长按,利用好...
  • 单片机---功能按键处理

    千次阅读 2017-07-28 10:30:50
    最近自己在琢磨按键程序,之前弄了,按键单击程序,程序可以实现读取按键的几状态,然后根据需求使用。单击按键的几状态如下: 单击后,马上返回按键值单击后,释放之后,返回按键值单击后,按住不放,次...
  • 里面包含了20多个常用的基础的单片机实验,有用汇编写的也有用C写的。
  • 下面由我来给大家讲讲按键和LED复用IO口时,程序该如何处理吧。(上一讲已经讲过,我个人比较喜欢状态机编程,因此这里还是采用状态机编程的方法,来实现按键和LED复用扫描功能)。 一、按键和LED复用原理图如下: ...
  • 基于51单片机的独立按键单击、双击,长按,次按的项目工程一、前言1、基于51单片机的独立按键单击、双击,长按,次按的项目工程包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路2、基于51...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,371
精华内容 3,348
关键字:

单片机多个按键程序