精华内容
参与话题
问答
  •  按钮在按下与弹起的过程中会出现一定的抖动,这有时会对应用过程产生影响,所以我想了一个办法,用switch来 判断按钮的状态。 #include #include char B=0,choose1=1; void SURE_key(int Key

               第一次写博客,有不对或不好的地方欢迎指正。

            

                  

                     程序过程很简单,就是系统上电后LED0-LED3亮,LED4-LED7灭;当第一次按下SW8后,LED4-LED7亮,LED0-LED3灭 ,再次按下SW8后,LED0-LED3亮,LED4-LED7灭。

                按钮在按下与弹起的过程中会出现一定的抖动,这有时会对应用过程产生影响,所以我想了一个办法,用switch来        判断按钮的状态

           

    #include<iom16v.h>
    #include<macros.h>
    
    char B=0,choose1=1;
    void SURE_key(int Key_Num);    //定义按键状态判断函数
    //=============================
    void delay_ms(int k)
    {
        int i,j;			
        for(i=0;i<k;i++)
        {
           for(j=0;j<850;j++)
           ;
        }
    }
    //=============================
    int main()	
    {		
    unsigned char i=0;		
    DDRA=0xff;		    //初始化端口A全为输出
    PORTA=~(0xf);		    //初始化端口A 0-3输出低电平;4-7输出高电平
    DDRD=0x0;                   //初始化端口D全为输入
    PORTD|=0xff;                //打开上拉电阻
       while(1)	
       {   
       
    	    SURE_key(~PIND&(1<<4));       //判断按键状态,按下弹起后B++
    	    if(B%2==1) PORTA=(0xf);
    		else PORTA=~(0xf);
       
    	}
       return 0;		
    }
    
    void SURE_key(int Key_Num)
    {
          switch(choose1)
         {
          case 1:
           if(Key_Num!=0) choose1=2;     //按下了么?
    	   else choose1=1;
           break;  
          case 2:
           if(Key_Num!=0) choose1=3;    //按下了么?
           else choose1=1;
           break;
          case 3:
          if(Key_Num!=0) choose1=3;       //按下了!松开了么?
          else choose1=4;
          break;
          case 4:                          //松开了
           B++;
           choose1=1;
           break;
          }
    }

    展开全文
  • 单片机按钮防抖C语言程序

    千次阅读 2013-05-04 17:55:10
    if(key==0) //再判断是否按下 { while(!key); 松手检测 ·················································· 该按键按下要实现的功能程序 ·····...
    key为按键,规定按下为低电平
    if(key==0)
    {
    delay(50); //延时50ms,消抖
        if(key==0) //再判断是否按下
       {
          while(!key); 松手检测
    ··················································
    该按键按下要实现的功能程序
    ··················································
         }
    }
    我的习惯是这样写
    展开全文
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言...
  • 该例子处理了长延时与按钮响应速度的关联,同理亦可推理出长延时与中断的关联处理。 一个4缸发动机,分别用P1.0、P1.1、P1.2、P1.3所接LED代表1,2,3,4缸的喷油器,LED灯亮代表喷油。当按键S1被按下后,喷油器按1-3-...

    该例子处理了长延时与按钮响应速度的关联,同理亦可推理出长延时与中断的关联处理。

    一个4缸发动机,分别用P1.0、P1.1、P1.2、P1.3所接LED代表1,2,3,4缸的喷油器,LED灯亮代表喷油。当按键S1被按下后,喷油器按1-3-4-2缸的顺序不断循环喷油。当按键S2被按下后,喷油器停止喷油。就是流水灯顺序变了而已,最简单程序就是几个互连判断或分支:
    void main()
    {
        int a;
        while(1)
        {
    	if(P1==253)P1=254;
    	else if(P1==254)P1=251;
    	else if(P1==251)P1=247;
    	else if(P1==247)P1=253;
            if(!s2)p1=255;
            if(!s1)p1=254;
            a=44444;
            while(s1&&s2&&a--);
        }
    }

    展开全文
  • Proteus仿真—40个单片机初学程序.

    热门讨论 2009-04-13 13:00:56
    单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合...
  • 将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键...
  • PIC单片机电容触摸按键,最方便的地方就是外围电路简单,不需要任何外围元器件。只要从引脚连接出一条线到焊盘上即可。 电容按键触摸的原理 PIC单片机通过松弛振荡器是一个自激 RC 振荡器...官方提供的简单按钮检测方
  • 51单片机基础篇-2

    2020-08-05 11:35:07
    轻触开关是一种电子开关,使用时,轻轻按开关按钮就可使开关接通,当松开手时,开关断开。我们使用的开关如下图: 2.原理  K1连接P3^ 1、K2连接P3^ 0、K3连接P3^ 2、K4连接P3^3。  按下时值为0,松开时值为1。 3....

    七、独立按键

    1.独立按键介绍

    轻触开关是一种电子开关,使用时,轻轻按开关按钮就可使开关接通,当松开手时,开关断开。我们使用的开关如下图:
    在这里插入图片描述

    2.原理

    在这里插入图片描述在这里插入图片描述

    K1连接P3^ 1、K2连接P3^ 0、K3连接P3^ 2、K4连接P3^3。
    在这里插入图片描述
    按下时值为0,松开时值为1。

    3.消抖

    按键在闭合和断开时,触点会存在抖动现象。
    在这里插入图片描述
    一般有两种消抖方法:
    ①硬件消抖:
    在这里插入图片描述
    ②软件消抖:通过两次if判断实现

    if(k1==0)
    {
    	delay(1000);
    	if(k1==0)
    		LED = ~LED;
    	while(!k1);
    }     
    

    4.代码

    #include<reg51.h>
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit k1=P3^1;
    sbit LED=P2^0;
    
    void delay(u16 i)
    {
    	while(i--);
    }
    void keypros()
    {
    	if(k1==0){
    		delay(1000);
    		if(k1==0){
    			LED = ~LED;
    		}
    		while(!k1);      //按键松开时使用while语句来判断
    	}
    }
    void main()
    {
    	while(1){
    		keypros();
    	}
    }
    

    七、矩阵按键

    1.矩阵按键示意图

    在这里插入图片描述

    2.矩阵按键扫描原理

    高四位(P17、P16、P15、P14),低四位(P13、P12、P11、P10)

    • 方法一:
      逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
    • 方法二:
      行列扫描:我们可以先通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。(先确定列,后确定行

    3.矩阵按键怎么变成独立按键

    举个例子:
     对于矩阵按键中的S1、S5、S9和S13,如果将P1^3固定为0(相当于接地),则S1、S5、S9和S13就可以构成一个独立按键。对于其他的按键也同理,横着的四个按键也可以。

    4.代码

    这里用到的是行列扫描:

    #include<reg51.h>
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;		   //数码管
    
    #define GPIO_KEY P1		 //矩阵按键
    #define GPIO_DIG P0		 //数码管
    
    u8 KeyValue;	 //按下的按键,默认为0
    
    u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
    					0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    void delay(u16 i)
    {
    	while(i--);
    }
    
    void KeyDown()
    {
    	u8 a=0;
    	GPIO_KEY=0x0f;		 //行列扫描,高四位输出低电平,低四位输出高电平
    
    	if(GPIO_KEY!=0x0f)	 //按键按下
    	{
    		delay(1000);
    		if(GPIO_KEY!=0x0f)	  //消抖
    		{
    			GPIO_KEY=0x0f;
    			switch(GPIO_KEY)
    			{
    				case(0x07):KeyValue=0;break;   //确定为第一列
    				case(0x0b):KeyValue=1;break;   //确定为第二列
    				case(0x0d):KeyValue=2;break;   //确定为第三列
    				case(0x0e):KeyValue=3;break;   //确定为第四列
    			}
    			GPIO_KEY=0xf0;	   //高四位输出高电平,低四位输出低电平
    			switch(GPIO_KEY)
    			{
    				case(0x70):KeyValue=KeyValue;break;		  //确定为第一行
    				case(0xb0):KeyValue=KeyValue+4;break;	  //确定为第二行
    				case(0xd0):KeyValue=KeyValue+8;break;	  //确定为第三行
    				case(0xe0):KeyValue=KeyValue+12;break;	  //确定为第四行
    			}
    			while((a<50)&&(GPIO_KEY!=0xf0))	//这样在一直按着按键的时候也能使按键按下有效
    			{
    				delay(1000);
    				a++;
    			}
    		}
    	}
    }
    
    void main()
    {
    	LSA=0;
    	LSB=0;
    	LSC=0;
    	while(1)
    	{
    		KeyDown();
    		GPIO_DIG=smgduan[KeyValue];
    	}
    }
    

    八、中断系统

    1.中断的概念

     CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。

    2. 51单片机的中断系统结构

    在这里插入图片描述
    在这里插入图片描述
     引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统

     随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点:

    • 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率;
    • 实时响应:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强;
    • 可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。

    89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 :
    在这里插入图片描述

    • (P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
    • (P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
    • TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
    • TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
    • RI(SCON.0)或 TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

    3.中断允许控制

    CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
    在这里插入图片描述

    • EX0(IE.0),外部中断0允许位;
    • ET0(IE.1),定时/计数器T0中断允许位;
    • EX1(IE.2),外部中断1允许位;
    • ET1(IE.3),定时/计数器T1中断允许位;
    • ES(IE.4),串行口中断允许位;
    • EA (IE.7), CPU中断允许(总允许)位。

    4.中断请求标志

    在这里插入图片描述

    • IT0(TCON.0),外部中断0触发方式控制位。
      当IT0=0时,为电平触发方式。
      当IT0=1时,为边沿触发方式(下降沿有效)。
    • IE0(TCON.1),外部中断0中断请求标志位。
    • IT1(TCON.2),外部中断1触发方式控制位。
      当IT1=0时,为电平触发方式。
      当IT1=1时,为边沿触发方式(下降沿有效)。
    • IE1(TCON.3),外部中断1中断请求标志位。
    • TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
    • TF1(TCON.7),定时/计数器T1溢出中断请求标志位。

     同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
    在这里插入图片描述
    中断源:
    在这里插入图片描述

    5. 51单片机的中断优先级的三条原则

    • CPU同时接收到几个中断时,首先响应优先级别最高的中断请求
    • 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断
    • 正在进行的低优先级中断服务,能被高优先级中断请求所中断

     为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

    6. 51单片机中断处理过程

    中断响应条件:

    • 中断源有中断请求
    • 此中断源的中断允许位为1
    • CPU开中断(即EA=1)

    以上三条同时满足时,CPU才有可能响应中断。

    以外部中断0为例:
    主程序中需要有以下代码:
    EA=1;//打开总中断开关
    EX0=1;//开外部中断0
    IT0=0/1;//设置外部中断的触发方式

    中断服务函数:
    
    void   int0   ()  interrupt   0    using  1
    {
    	do anything that you want
    }
    

    中断服务函数的标准格式为(后面的 using 1 可有可无):

    void 自己定义的函数名 () interrupt 中断源
    {
    }
    

    7.代码

    以下代码使用的是外部中断0,可以类似的实现外部中断1

    #include "reg52.h"
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit k3=P3^2;  //定义按键K3
    sbit led=P2^0;	 //定义P20口是led
    
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    void Int0Init()
    {
    	//设置INT0
    	IT0=1;//跳变沿出发方式(下降沿)
    	EX0=1;//打开INT0的中断允许。	
    	EA=1;//打开总中断	
    }
    
    void main()
    {	
    	Int0Init();  //	设置外部中断0
    	while(1);		
    }
    
    void Int0()	interrupt 0		//外部中断0的中断函数
    {
    	delay(1000);	 //延时消抖
    	if(k3==0)
    	{
    		led=~led;
    	}
    }
    
    展开全文
  • 单片机中断函数中的全局变量问题

    千次阅读 2019-06-26 15:42:55
    然后呢,我不想在中断函数里写太多代码,便只在中断函数里放了一个全局变量,按下按钮进入中断时改变该变量的值,然后在主程序中判断该值,来执行接下来的程序,部分程序代码如下: void main...
  • 原理分析:4X4矩阵键盘每个按键都有它的行值和列值,当每个按键的行值为低电平,列值为高电平时,按键才能起作用,判断是否有按钮按下时,先让这一行通低电平,再通过扫描每一列来判断是否被按下(逐列使列值通高电...
  • 2、可用于计算机检测各种外围光电开关、红外探头、按钮信号、设备开关; 3、可串口远程实时监控电动设施的运行状态,省却人工操作之劳苦、节约人力成本; 4、可用于集中控制带有直流电机的设备或家具,如电动座椅,...
  • 工作原理:当有按钮第一次按下时,设置第一个标志An,当按钮第一次释放后,进入中断消抖延时计数,假如在计数范围内第二次按钮按下,设置第二标志Aa,这样就把单击和双击区分开,而且是可靠的逻辑标志,长按为大于1秒的判断. ...
  • 上位机每发送一行数据都计数+1,发送前为判断计数是否超过某个值,超过则暂停发送,直到收到ok,计数满足要求。 请问代码哪里有问题。 补充:现在的问题好像跟跨线程有关,手动逐行发送计数都没问题。通过按钮...
  • Arduino的按钮控制程序

    2019-09-24 18:13:37
    单片机程序的设计难题在于,对按钮开关的判断,初学者往往会简单认为检测到电流即为按钮按下,其实不然,程序的一段代码的执行时间是非常短的,而开关的机械结构,使得开关在按下去,在按钮完全即将接触到完全接触...
  • C#编程经验技巧宝典

    千次下载 热门讨论 2008-06-01 08:59:33
    的值 52 <br>0069 求最大公约数 52 <br>0070 求最小公倍数 53 <br>0071 判断素数的算法 53 <br>0072 如何判断一个数是否是完数 54 <br>0073 歌德巴赫猜想的算法 54 <br>0074 八皇后...
  • 一、App的简单介绍 首先APP的功能描述如下,他可以...后面的未知两个字在数据传输过来之后,在确认按钮按下之后,会对数据进行比较,判断温度和气压有没有超出我们所限定的值。而下方的6个文本输入框就是输入我们想...
  • 画面中任何按钮被按下或弹起,屏幕都会将该按钮的ID和状态值上传给用户,用户单片机接收串口指令并解析,即可判断当前按钮的动作。2.文本控件用户预先通过上位机将文本在画面中的显示坐标、颜色、字体和背景色设置好...
  • 7.这时执行程序,可实现按下登录按钮进入主窗口,按下退出按钮退出程序。 8.添加用户名密码判断功能。将登陆按钮的槽函数改为: void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text()==tr("qt")&&m...
  • PROGISP自动下载助手

    2008-12-11 15:13:41
    但是代码编译之后都要手动去按下PROGISP的自动按钮 有时候也无法确定代码有没有重新生成HEX文件 MUISP的并口下载具有自动检测HEX.BIN文件功能 所以觉得很好用,但是又没有PROGISP支持的单片机多,列入AT90PWM2,AT90...
  • 14.3.3 判断是否有触发事件 14.3.4 启动并口控制的报警设备 14.3.5 根据设置拨打报警电话 14.3.6 安防日志管理 14.3.7 I/O端口通信 14.4 实现代码分析 14.4.1 创建项目 14.4.2 界面设计与实现 14.4.3 加入数据库...
  • 点击窗口的相应按钮就可以在线检测手势动作,其中的执行手势按钮是和下位机通信(如STM32单片机), 通过串口函数将识别结果传给下位机,实现根据手势动作控制的功能。 测试结果: 使用该模型训练到900步的时候在...

空空如也

1 2
收藏数 21
精华内容 8
关键字:

单片机判断按钮