单片机 按键口模式_单片机检测按键设置什么gpio模式 - CSDN
精华内容
参与话题
  • 写的不知道还不好,有什么不对的地方还请指出,谢了。 对于独立按键,方法1是多次判断。方法2是利用了switch语句。...//独立按键,函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5 unsigne

    写的不知道好不好,有什么不对的地方还请指出,谢了。

    对于独立按键,方法1是多次判断。方法2是利用了switch语句。

    对于矩阵按键,直接就采用了switch语句了。

    哪个计算器没有设计,等待后面闲着在整吧。

    在主函数要是用按键,需要在配合循环语句。

    //独立按键 S2		S3		 S4			S5
    //分别对应 P30/TX	P31/RX	 P32/INTO	P33/INT1
    #include"key.h"
    #include "delay.h"
    
    //独立按键,函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5
    unsigned char key(void)//返回2则按键2被按下,其他按键同理,本函数只循环扫描一次
    {
    	key_S2 = 1;
    	key_S3 = 1;
    	key_S4 = 1;
    	key_S5 = 1;
    
    	if (!key_S2)
    	{
    		delay_ms(10);//防抖滤波延迟
    		if (!key_S2)
    		{
    			while (!key_S2);//按键松手检测
    			return	2;
    		}
    	}
    	if (!key_S3)
    	{
    		delay_ms(10);//防抖滤波延迟
    		if (!key_S3)
    		{
    			while (!key_S3);//按键松手检测
    			return 3;
    		}
    	}
    	if (!key_S4)
    	{
    		delay_ms(10);//防抖滤波延迟
    		if (!key_S4)
    		{
    			while (!key_S4);//按键松手检测
    			return 4;
    		}
    	}
    	if (!key_S5)
    	{
    		delay_ms(10);//防抖滤波延迟
    		if (!key_S5)
    		{
    			while (!key_S5);//按键松手检测
    			return 5;
    		}
    	}
    }
    
    //独立按键使用switch语句
    unsigned char key2345(void) //函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5,本函数只循环一次
    {
    	key_all = 0xff;
    	if ((key_all&0x0f) != 0x0f)	//&与运算符没有!=不等于高  故需要加()括号
    	{
    		delay_ms(10);
    		if ((key_all & 0x0f) != 0x0f)//忘记加{号了  哎
    		{
    			switch (key_all & 0x0f)
    			{
    			case 0x0e:while ((key_all & 0x0f) != 0x0f);return 2;	//while在这里进行松手检测  炒while松手检测忘记加;号了
    			case 0x0d:while ((key_all & 0x0f) != 0x0f);return 3;	//while在这里进行松手检测
    			case 0x0b:while ((key_all & 0x0f) != 0x0f);return 4;	//while在这里进行松手检测
    			case 0x07:while ((key_all & 0x0f) != 0x0f);return 5;	//while在这里进行松手检测
    			}
    		}
    	}
    }
    
    //矩阵按键真值表4行*4列计算器使用
    unsigned char code key_true1[4][4] = { '+','-','*','/',
    								   7,  8,  9,  0,
    								   4,  5,  6,  0,
    								   1,  2,  3, '=' };
    //矩阵按键真值表4行*4列判断是哪个按键被按下
    unsigned char code key_true2[4][4] = { 
    									1,	2,	3,	4,
    									5,  6,  7,  8,
    									9,  10,	11,	12,
    									13, 14,	15,	16
    													};
    
    unsigned char key16(void)//判断16个按键中哪个被按下,本函数只循环一次  若没有按键按下此函数会自动返回0
    {
    	unsigned char x = 0;
    	unsigned char y = 0;
    	key_all = 0x0f;
    	if(key_all!=0x0f)
    	{
    		delay_ms(10);
    		if (key_all!=0x0f)
    		{
    			switch (key_all)
    			{
    			case 0x0e:x = 0;break;
    			case 0x0d:x = 1;break;
    			case 0x0b:x = 2;break;
    			case 0x07:x = 3;break;
    			}
    			key_all = 0xf0;
    			switch (key_all)
    			{
    			case 0xe0:y = 0;break;
    			case 0xd0:y = 1;break;
    			case 0xb0:y = 2;break;
    			case 0x70:y = 3;break;
    			}
    		while (key_all != 0xf0);//松手检测,检测上次赋值0xf0
    		return key_true2[x][y]; //在这里函数返回1/2/3/..../16中按下的哪个按键值
    	  }
      }
    }
    
    #ifndef __KEY_H__
    #define __KEY_H__
    #include <reg52.h>
    //独立按键 
    sbit key_S2 = P3^0;
    sbit key_S3 = P3^1;
    sbit key_S4 = P3^2;
    sbit key_S5 = P3^3;
    
    #define key_all P3
    
    //按键占用P3口
    unsigned char key(void);//返回2则按键2被按下,其他按键同理,本函数只循环扫描一次
    unsigned char key2345(void); //函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5,本函数只循环一次
    unsigned char key16(void);//判断16个按键中哪个被按下,本函数只循环一次   炒while松手检测忘记加;号了
    
    extern unsigned char code key_true2[4][4];//矩阵按键真值表4行*4列判断是哪个按键被按下
    extern unsigned char code key_true1[4][4];//矩阵按键真值表4行*4列计算器使用
    
    #endif // !__KEY_H__

     

    展开全文
  •  按键处理是学习单片机的必修课之一。一次按键的过程,并非是一个理想的有一定宽度的电平脉冲,而是在按下、弹起过程中存在抖动,只有在中间阶段电平信号是稳定的。一次典型的按键过程是酱紫的:  在抖动过程中...

    前言

      按键处理是学习单片机的必修课之一。一次按键的过程,并非是一个理想的有一定宽度的电平脉冲,而是在按下、弹起过程中存在抖动,只有在中间阶段电平信号是稳定的。一次典型的按键过程是酱紫的:

      在抖动过程中,电平信号高低反复变化,如果你的按键检测是检测下降沿或上升沿或者是用外部中断检测按键,都可能在抖动时重复检测到多次按键。这就是在未消抖的按一次键显示值加1的程序中,出现按一次键显示值+2、+3甚至加更多的原因。

      对于按键消抖,常用的有硬件消抖和软件消抖。本文是我个人对按键处理的一些常见方法的总结,由于我本人不太懂硬件,所以这里只讨论独立按键的软件消抖实现。水平有限,如有错误请不吝指正。

    硬件环境

      本文代码均在单片机STC90C516RD+、晶振12.0MHz硬件环境下试验通过。

    带消抖的简单的按键处理

      最简单的消抖处理就是在首次检测到电平变化后加一个延时,等待抖动停止后再次检测电平信号。这也是大多数单片机教程讲述的消抖方式。但在实际应用中基本不用这种方式,原因后面讲,先看代码:

     

    //方法一:带消抖的简单的按键处理
    
    #include <reg52.h>
    
    #define GPIO_KEY P1    //8个独立按键IO口
    #define GPIO_LED P0    //8个LED灯,用于显示键值
    
    unsigned char ScanKey();
    void DelayXms(unsigned char x);
    
    void main()
    {
        unsigned char key;
        GPIO_LED = 0x00;    //初始化LED
        while (1)
        {
            key = ScanKey();    //读取键值
            // if (0xff != key)    //若有键按下,则更新LED的状态
            GPIO_LED = ~key;    //点亮LED
        }
    }
    
    unsigned char ScanKey()
    {
        unsigned char keyValue = 0xff;    //赋初值,0xff表示没有键按下
        GPIO_KEY = 0xff;                //给按键IO口置位
        if (0xff != GPIO_KEY)            //检查按键IO口的电平,如有键按下则不为0xff
        {
            DelayXms(15);                //延时15ms,滤掉抖动。一般按键的抖动时间在10ms~20ms
            if (0xff != GPIO_KEY)        //再次检查按键IO口的电平
            {
                keyValue = GPIO_KEY;    //重复检测后表明有键按下,读取键值
            }
            // while (0xff != GPIO_KEY) ;    //等待按键弹起
        }
        return keyValue;
    }
    
    void DelayXms(unsigned char X)
    {
        unsigned char i, j;
        do
        {
            i = 2;
            j = 240;
            do
            {
                while (--j);
            } while (--i);
        } while (--X);
    }
    View Code

     

      可以看到,在首次检测到电平由1->0后,延时了10ms,等待抖动过去,然后再检测按键的电平。你也许已经注意到了,在延时10ms期间,单片机闲置了,就暂停在那里等待延时完成,这对处理能力本就紧张的单片机来说无疑是个巨大的浪费。特别是当你在用单片机同时运行数码管动态扫描等对时序要求高功能的时候,按键消抖延时期间程序暂停了,数码管也就熄灭了,严重影响显示效果。

    利用定时器消抖的按键处理

      为了避免单纯Delay()消抖所产生的问题,可以采用定时器来进行延时,这样就不用让单片机在那里干等了。

      一种简单的实现方式是设置一个全局状态变量,用来标志定时器延时时间已到,在第一次检测到电平变化时开启定时器,检测到定时器延时时间已到时关闭定时器并再次进行按键检测。代码如下:

    //方法二:定时器延时消抖的按键处理
    
    #include <reg52.h>
    
    #define GPIO_KEY P1    //8个独立按键IO口
    #define GPIO_LED P0    //8个LED灯,用于显示键值
    
    unsigned char timeUp = 0;        //标志位
    unsigned char th0Value = (65536 - 15000) / 256;    //15ms的定时器初值高8位
    unsigned char tl0Value = (65536 - 15000) % 256;    //15ms的定时器初值低8位
    
    unsigned char ScanKey();
    void InitialTimer0();
    
    void main()
    {
        unsigned char key;
        GPIO_LED = 0x00;    //初始化LED
        InitialTimer0();
        while (1)
        {
            key = ScanKey();    //读取键值
            if (0xff != key)    //若有键按下,则更新LED的状态
                GPIO_LED = ~key;    //点亮LED
        }
    }
    
    void InitialTimer0()    //12MHz
    {
        ET0 = 1;            //打开定时器0
        EA = 1;                //打开系统总中断开关
        TMOD &= 0xF0;        //清空定时器0的工作模式参数
        TMOD |= 0x01;        //设置定时器0的工作模式为模式1,16位定时器
        TH0 = th0Value;        //设置定时高8位初值
        TL0 = tl0Value;        //设置定时低8位初值
        TF0 = 0;            //清除TF0溢出标志
        TR0 = 0;            //关闭定时器0
    }
    
    void Timer0Interrupt() interrupt 1
    {
        TH0 = th0Value;        //设置定时高8位初值
        TL0 = tl0Value;        //设置定时低8位初值
        timeUp = 1;            //定时器标志位置1
    }
    
    unsigned char ScanKey()
    {
        unsigned char keyValue = 0xff;    //赋初值,0xff表示没有键按下
        if (0 == TR0 && 0xff != GPIO_KEY)
        {
            timeUp = 0;            //定时器标志位置0
            TH0 = th0Value;        //设置定时高8位初值
            TL0 = tl0Value;        //设置定时低8位初值
            TR0 = 1;            //开启定时器0,开始计时
        }
        if (1 == timeUp)
        {
            TR0 = 0;            //关闭定时器0
            keyValue = GPIO_KEY;                //读取键值
        }
        return keyValue;
    }
    View Code

      另一种方法是利用定时器0,每2ms左右中断一次,在中断服务程序中进行多次按键检测,当检测到10次按键按下状态时,则认为发生了一次有效的按键按下动作。这种方式与上一种相比,进行了多次检测,提高了按键检测的准确性。实现代码如下:

    //方法三:定时器多次检测的按键处理
    
    #include <reg52.h>
    
    #define GPIO_KEY P1    //8个独立按键IO口
    #define GPIO_LED P0    //8个LED灯,用于显示键值
    
    unsigned char keyCur = 0xff;        //暂存当前键值
    unsigned char keyPress = 0;            //按键按下状态标识
    unsigned char th0Value = (65536 - 2000) / 256;    //2ms的定时器初值高8位
    unsigned char tl0Value = (65536 - 2000) % 256;    //2ms的定时器初值低8位
    
    unsigned char ScanKey();
    void InitialTimer0();
    
    void main()
    {
        unsigned char key;
        GPIO_LED = 0x00;    //初始化LED
        keyCur = 0xff;    //初始化
        InitialTimer0();
        while (1)
        {
            key = ScanKey();    //读取键值
            if (0xff != key)    //若有键按下,则更新LED的状态
                GPIO_LED = ~key;    //点亮LED
        }
    }
    
    void InitialTimer0()    //12MHz
    {
        ET0 = 1;            //打开定时器0
        EA = 1;                //打开系统总中断开关
        TMOD &= 0xF0;        //清空定时器0的工作模式参数
        TMOD |= 0x01;        //设置定时器0的工作模式为模式1,16位定时器
        TH0 = th0Value;        //设置定时高8位初值
        TL0 = tl0Value;        //设置定时低8位初值
        TF0 = 0;            //清除TF0溢出标志
        TR0 = 1;            //开启定时器0
    }
    
    void Timer0Interrupt() interrupt 1
    {
        static unsigned char counter = 0;            //辅助计数
        static unsigned char keyLast = 0xff;        //记录上一次扫描时的键值
        TH0 = th0Value;        //设置定时高8位初值
        TL0 = tl0Value;        //设置定时低8位初值
    
        keyCur = GPIO_KEY;    //暂存当前键值
        if (0xff != keyCur && keyCur == keyLast)    //当前扫描时有键按下且与上一次按下的一致,则累加
            counter ++;
        else
        {
            counter = 0;
            keyLast = keyCur;
        }
    
        if (10 == counter)    //连续10次均有键按下且按按键未变,则认为时一次有效的按键
            keyPress = 1;
        else
            keyPress = 0;
    }
    
    unsigned char ScanKey()
    {
        if (1 == keyPress)
            return keyCur;            //读取键值
        else
            return 0xff;
    }
    View Code

     

      至此,简单的按键单击实现实现告一段落。但往往实际中,我们不只要实现单击,还要实现双击、长按、连发等等功能,特别是在那些小尺寸、无法设置多个按键的项目中,一个按键往往需要通过不同的操作实现不同的功能。要实现这些复杂的功能,就需要引入一种设计模式——有限状态机模式。敬请期待下一篇:单片机按键处理方式(二)——状态机按键实现单击、双击、长按、连发(挖坑,待填)

     欢迎关注本人的个人博客YoungCoding.top

    转载于:https://www.cnblogs.com/ToddleLobster/p/5914002.html

    展开全文
  • 基于51单片机的小设计,包含流水灯、无源蜂鸣器、两位动态数码管,通过按键进行模式选择,适合新手入门学习(包含数码管动态扫描、定时器操作、io使用、按键识别)
  • 单片机IO工作方式详细分析

    千次阅读 2017-07-25 16:33:42
    单片机I/O工作方式基本有以下几类: 1.准双向IO配置(弱上拉)  小结: 灌电流能力强,拉电流能力弱读外部状态前要先锁存“1”(断开下拉晶体管)读IO状态的原则是非高即低,只能准确识别外部的低电平信号...

    单片机I/O口工作方式基本有以下几类:

    1.准双向IO口配置(弱上拉)

           小结:

    • 灌电流能力强,拉电流能力弱
    • 读外部状态前要先锁存“1”(断开下拉晶体管)
    • 读IO口状态的原则是非高即低,只能准确识别外部的低电平信号,无法区分悬空和真正的高电平
    • 作为输入时,输入阻抗不为高阻,可能出现将外部低电平误读为高电平的情况(例上拉电阻10K,外部电阻100K,IO=5*100/110=4.54V)


       其应用方式参考:


    准双向口用作输入时,可对地接按键,如图1,当然也可以去掉R1直接接按键,当按键闭合时,端口被拉至低电平,当按键松开时,端口被内部“极弱上拉”晶体管拉至高电平。
    当端口作为输出时,不应对地外接LED如图2控制,这样端口的驱动能力很弱(拉电流能力弱),LED只能发很微弱的光,如果要驱动LED,要采用图3的方法,这样准双向口在输出为低时,可吸收20mA的电流(灌电流能力强),故能驱动LED。图4的方法也可以,不过LED不发光时,端口要吸收很大电流。


     2.推挽输出配置
           小结:
    • 能真正输出高低电平,具有很强的驱动能力(灌电流,拉电流能力强)
    • 如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。这也是为什么推挽输出不能实现" 线与"的原因。

    推挽输出可以用图2的方式通过拉电流驱动LED灯亮。


    3.开漏输出配置
    小结:
    • 通过外部上拉电阻输出高电平
    • 若有外部上拉,可作为输入IO读取外部状态(同准双向IO,先锁存“1”
    • 通过外部上拉电源进行电平转换与外部器件兼容



    4.高阻输入
    小结:
    • 电路无法流入流出,只能作为输入数据使用

    展开全文
  • STM32GPIO8种模式细致分析(类比51单片机

    千次阅读 多人点赞 2017-04-06 13:53:14
    关于STM32GPIO的8种工作模式,我们先引出一些问题? STM32GPIO如果既要输入又要输出怎么办? 1、浮空输入模式     上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时1读出的就是1,...

    关于STM32GPIO口的8种工作模式,我们先引出一些问题?

    STM32GPIO口如果既要输入又要输出怎么办?

    1、浮空输入模式

     

     

    上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时1读出的就是1,外部没有输入IO处于阻塞读不出电平状态。

    用处:感觉在信号处理方面用的比较好,比如在读取一段一段的波形,可以清晰的知道什么时候是0信号,什么时候是1信号,什么时候是没有信号的

    类比:51单片机找不到类似的输入模式

     

    2、上拉输入

     

    上拉输入和浮空输入的区别是,上拉电阻的开关关闭了,如上图所示。IO没有输入的时候IO电平等于VDD1电平,当然IO输入低电平的事就是VDDIO口形成一个闭环电路,根据分压法IO口出分担的电压为0当然IO输入为1IO口电压和VDD相等,上拉电阻好比断开了,IO口的电压还是0

     

    用处:在按键使用的时候特别适用,按键的一端接地,一端接IO口,当按键没有按下的时候电平为高电平,当按键按下的时候IO是低电平。

     

    类比:51单片机P1 P2 P3口就是上拉输入的,大家可以回忆一下51单片机的按键操作,我们应该知道51单片机除了P0口内部没有上拉电阻其他的IO都有上拉电阻。大家应该明白了51单片机没有按键的时候,我们读到的事高电平了吧!!

     

    小计:

    上拉输入,不管输入1还是不输入IO的电平都是1,输入0IO口的电平是0

    PS按键是共地还是共VCC选择的时候要慎重


    3下拉输入

     

     

    下拉输入和上拉输入的区别是,上拉电阻的开关打开了了,下拉电阻的开关关闭;了。如上图所示。IO没有输入的时候IO电平等于VSS0电平,当IO输入高电平的时候IO口就和VSS组成一个闭合电路,根据分压法,电压都分担到了电阻上,所以IO口电平为高电平。当然IO输入为低电平的时候IO口肯定是低电平。 

    用处:在按键使用的时候特别适用,按键的一端接VCC,一端接IO口,当按键没有按下的时候电平为低电平,当按键按下的时候IO是高电平电平。

     

    类比:51单片机没有类似的IO口 

     

    PS按键是共地还是共VCC选择的时候要慎重

     

    4、模拟输入

     

    模拟输入,大家看上图的红色的标示。模拟输入和其他输入最大的区别

    1、 没有连接TTL触发器,这样保留最原始的电压值,不是转换过后的01信号

    2、 数据连接的终点不一样,其他的输入我们都是读取输入寄存器的值,而模拟输入,数据直接送到片上外设,一般是ADC

     


     下面就是输出类型了

    1、 推挽输出

    2、 开漏输出

    3、 复用推挽输出

    4、 复用开漏输出

     


    1、推挽输出

     


    上图就是就是推挽输出的过程。上图标示的“2”便是我们的输出寄存器,我们可以写入1或者0,如果写入1,图上的“3”上面的P-mos导通,N-mos截止,IO口等价直接连接在VDD上,所以IO口电平是高电平。同理输出寄存器的值为0时,P-mos截止,N-mos导通。IO口直接连接在VSS上,所有IO口电平为低电平。

    大家可能会问图上标的1是什么?其实1的寄存器就是间接向输出寄存器写入。好处是有的,大家自己百度哈!!

     

    用处:适合做一些开关控制,应为推挽输出可以快速的切换01,例如继电器,led

     

    类比:51单片机没有类似的IO

     


    3、 开漏输出

     

    上图红色标示便是开漏输出的过程图,图上12的标示已经在推挽输出中介绍了,此处不再说明。开漏输出与推挽输出唯一的区别就是开漏输出只有一个N-mos管。当输出寄存器的值为0的时候,n-mos导通,IO口直接连接VSS,输出为低电平。当输出寄存器为1的时候,n-mos截止,IO口直接和输出端断开了,处于浮空状态。电平状态不可控制。

    大家可能会说,这样设计不是傻缺么?有什么用设计这种输出方式。其实这种方式很有用的,请看下面的类比

    类比:

    我们都知道51单片机PO口,是不是想到什么了?PO口就是类似的开漏输出, PO口作为输出的时候一定要加上拉电阻,加上上拉电阻后,输入寄存器为1的时候,n-mos截止截止了,好比IO和输出端断开,这是IO口点压就等于上拉电阻的电压。这样变输出了高电平,如果IO口的高电平,连接到了外设低电平的,就会产生电流,电流不会流到IO口,(N-mos管截止了)直接流到外设。是不是增大了驱动能力了。(IO口的驱动能力有限,不能容忍大电流)。

    通过改变上拉电阻的大小和电压就能完成很多功能。

     


    4、 复用(推挽和开漏)输出


    复用

     

    复用推挽\开漏和(推挽\开漏输出)区别在于起点不一样,复用输出来源片上外设,比如IICSPI等。相信大家已经可以理解了,不做解释了。

     

     

    大家是不是觉得8中模式都会了呢?我一开始的问题GPIO输入和输出之间的影响?

     

    当我们设置为输入模式的时候,看上图“1”和“2”是线与的关系,如何你想要“1”对我们的输入没有影响,要么要“1”断开,要么让“1”高电平。比如键盘检测的时候,如何“1”是低电平的话。那么输入端会一直是低电平。我的开开发板PC5是键盘,如何我对输出端不做任何处理的话,即使我PC5输入设为上拉输入,输入寄存器一直是0。如果直接给ODR寄存器置1我的问题就解决了。

    问题我没有设置PC5的输出模式,直接给输出寄存器置1IO口的输出端是什么情况?STM32有没有默认的输出方式,这个要看输出寄存器复位的时候的值,来判断他的工作模式。。总之为了保险起见,应把输出寄存器置1。就和我们用51单片机IO作为输入的时候一定要先置一,一般系统复位后都是一。

     

    当我们设置为输出模式的时候,我们能不能读取数据(不设置输入模式),当我们设置为开漏模式的时候,外接上拉电阻过后,我们不用设置输入模式就可以读取IO的电平了。这个是唯一的全双工的方式,除了复用功能外。我猜想默认输入应该是浮空输入。

     

    哈哈其实GPIOx_CRX复位后值是0x44444444,即默认的输入是浮空输入模式,输出是推挽输出 

    !!

    展开全文
  • 本文主要讲了一下关于stc单片机io口模式设置方法,希望对你的学习有所帮助。
  • 单片机按键设计的四个方案

    万次阅读 2019-01-12 16:10:51
    单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上,一般有四种方案:一是GPIO直接检测单个按键,如图1.1所示;二是按键较多则使用矩阵键盘,如图1.2所...
  • STC单片机IO口模式配置

    千次阅读 2019-07-18 09:20:21
    一、先说模式类型吧 就是这几种了 二、设置模式方法 1.打开stc-isp软件 点击范例程序,选择自己用的芯片 2.点击打开,
  • 最近在做平衡车 ,关于平衡车的内容还未整理好,先来个不错的小技术贴! 认为好的可以关注我哦 知识在于交流 ...函数功能:按键扫描 入口参数:双击等待时间 返回 值:按键状态 0:无动作 1:单击 2:双击 key=0是按下
  • 单片机按键检测与执行的三种方式

    千次阅读 2019-05-12 12:23:22
    单片机按键检测与执行的三种方式 自己分别归纳为"while中检测while中执行",“中断中检测中断中执行”,“中断中检测中断中执行”, 先占坑,后面有时间再补充。 List item ...
  • 通过第一篇的驱动解析,我们大概能知道普通io口按键一般的分类以及工程中的实际原理图,第二个就是知道怎么利用芯片本身自带的定时器以及主循环中断来检测按键按下以及通过按下的时间以及松手的检测来判断。...
  • 基于STM32-按键输入与八种IO口模式

    千次阅读 2018-06-06 15:44:14
    这里再讲下八种IO口模式:1.模拟输入 我认为模拟输入最重要的一点就是。他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我认为这一点也是非常好理解的,由于输入数据...
  • 在我们的实际产品开发过程中,为了节省成本,常常会采用按键和LED复用,从而达到节省IO的目的。很多刚刚碰到这种情况的工程师,可能会不知道如何处理,PS:大神请自动略过。下面由我来给大家讲讲按键和LED复用IO...
  • 如果是刚入行的单片机工程师来说,写一个完整的具有实用性和稳定性和扩展性的按键驱动还是比较困难的,这篇博客主要是结合自己的实际经验之谈,解析一下普通的Io按键驱动如何写和实现,如果有大神看出有错误的东西,...
  • 应广单片机休眠和按键唤醒

    千次阅读 2020-03-27 12:50:45
    对应电池供电的产品,在不使用的时候,单片机和外设都应该进入休眠状态,用于减少对电池电量消耗.在使用的时候又能够通过按键,或是其他信号唤醒系统,然后进入正常工作状态.在电压V3.3V的情况下,应广单片机的休眠电流...
  • 输入是接在P32和P3^3的两个按键,输出是在1602显示屏上显示结果。程序在keil C51软件中编写调试。 二、硬件设计 主体是单片机一个,外围电路有晶振电路、复位电路、1602液晶显示屏、两个按钮开关按键。1602的VSS...
  • 蓝桥杯的独立按键包含在矩阵按键里,由按键右侧的跳线帽决定。 这是按键的原理图,一开始我以为是一个3*4的矩阵按键和四个独立按键,其实并不是这样,s4~s7这四个独立按键也是矩阵按键的一部分,它是一个4*4的矩阵...
  •   独立按键是直接用I/O线构成的单个按键电路,其特点式每个按键单独占用一根I/O线,每个按键的工作不会影响其他I/O线的状态。独立式按键电路配置灵活,软件结构简单。   独立键盘理想的波形是按下去时保持...
  • stm32f103 按键长短按得识别原理 需要一个定时器,用来计算按键按下的...比如我们需要4种模式,轻触,短按,长按,超级长按 #define clickTypeTouch 1 //轻触 #define clickTypeShort 2 //短按 #define clickType...
  • 51单片机IO输入输出方式

    万次阅读 2013-01-11 20:31:36
    传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路。 灌电流方式:LED正极接VCC,负极接IO。IO为高电平是LED两极电平相同,没有电流,LED熄灭;IO为低...
1 2 3 4 5 ... 20
收藏数 2,436
精华内容 974
关键字:

单片机 按键口模式