单片机的输入端_单片机输入端口扫描

hacker|
359

单片机端口位循环扫描

这里的R0,R1,R2,R3...是在恒定以里面已经定义好的,也就是说PORTDbits.R4是一个固定的硬件地址,所以不能这么写,不过像你这个函数,可以使用更简单的代码来代替,

if(PORTD0XF0)goto DE1;//这个语句就表示了,只要RD4~RD7任何一位为高电平就跳转到DE1处,跟你上面代码希望实现的功能是一摸一样的

求51单片机,io口按键防抖,中间插入一个时间,按键扫描的程序。

#include “reg51.h”

sbit KEY1=P3^3; //定义按键输入端口

sbit KEY2=P3^4; //定义按键输入端口

sbit LED=P1^2; //定义led输出端口

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

void main()

{

while(1)

{

if(!KEY1)

{

DelayMs(10); //延时去抖,一般10-20ms

if(!KEY1) //再次确认按键是否按下,没有按下则退出

{

while(!KEY1);//如果确认按下按键等待按键释放,没有释放则一直等待

LED = 0; //亮

}

}

if(!KEY2)

{

DelayMs(10); //延时去抖,一般10-20ms

if(!KEY2) //再次确认按键是否按下,没有按下则退出

{

while(!KEY2);//如果确认按下按键等待按键释放,没有释放则一直等待

LED = 1; //灭

}

}

}

}

单片机5个IO口扫描25个按键的程序,怎么只能扫描到下面5个键

本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考。在实际项目中我们经常会遇到有按键输入的需求,但有的时候为了节省资源成本,我们都会选择在不增加硬件的情况下使用最少的控制器IO驱动更多的按键,那么具体是怎么做的呢,下面我们就以用5个IO引脚为例,讲下怎么设计可以实现更多的按键?共有5种设计思路,下面依次介绍。

思路一

首先通常想到的可能是下面这样的设计:

上图形式的按键就是我们通常说的行列式按键,它的驱动思路是这样的:

1. 对IO1、2、3配置为推挽输出,依次只让其中一个输出为0其他输出为1。

2. 对IO4、5进行读操作,根据读出的结果判断哪个按键按下。

例如:配置IO1、2、3为011,读IO4、5,若IO4为0则SW14按下,若IO5为0则SW15按下;

依次的配置IO1、2、3为101,读IO4、5,若IO4为0则SW24按下,若IO5为0则SW25按下;

依次的配置IO1、2、3为110,读IO4、5,若IO4为0则SW34按下,若IO5为0则SW35按下;

思路二

但是我们在不知道行列式按键之前我们肯定是依次将IO口接一个按键到GND或者到VCC,然后去读IO口去判断哪个按键按下,这也是最简单的方法,但是很浪费IO口,下面这种就结合了这种简单方法和行列式的思路,实现了又多增加3个按键,如下图:

这里我们的思路是先依次读IO1、2、3的电平来识别S1、2、3,哪个按键按下,其后的流程和思路一是一样的,这样就可以识别11个按键了。

思路三

按照扫描的思想,某一时刻设置一个IO口为0,其他IO口读,如果有IO口读到0,则有对应按键按下。比如IO1为0,然后读到IO5也为0,那么K15就是按下的。对照这样的思路,我们可以有下面的设计:

这个电路按键识别思路是这样的:

1. 只配置IO1为0,其他IO读,若IO5读到0,则K15按下,若IO4读到0,则K14按下,依次识别K13,K12;

2. 只配置IO2为0,其他IO读,若IO5读到0,则K25按下,若IO4读到0,则K24按下,依次识别K23;

3. 只配置IO3为0,其他IO读,若IO5读到0,则K35按下,若IO4读到0,则K34按下;

4. 只配置IO4为0,其他IO读,若IO5读到0,则K45按下;

思路四

对于思路3我们发现,如果只配置IO5为0,其他IO读,若IO1读到0,则K15按下,若IO2读到0,则K25按下,依次可识别K35和K45。这样就存在重复,那么有么有好的方法,解决这样的重复呢?我们发现,若配置IO1为0,K15按下,电流流向IO1的,若配置IO5为0,同样K15按下,电流是流向IO5的。这样我们就可以通过区分电流的流向来避免重复。于是就有了下图的设计:

这样就可以避免重复,IO5为0时,按K15,IO1是读不到0的。那么怎样设计,IO5为0时对应一个按键按下IO1为0呢?如是就有人想到下面的设计:

这个电路按键识别思路是这样的:

1. 只配置IO1为0,其他IO读,若IO5读到0,则K51按下,若IO4读到0,则K41按下,依次识别K31,K21;

2. 只配置IO2为0,其他IO读,若IO5读到0,则K52按下,若IO4读到0,则K42按下,依次识别K32,K21';

3. 只配置IO3为0,其他IO读,若IO5读到0,则K53按下,若IO4读到0,则K43按下,依次识别K32’,K31';

4. 只配置IO4为0,其他IO读,若IO5读到0,则K54按下,若IO4读到0,则K43’按下,依次识别K42’,K41';

5. 只配置IO5为0,其他IO读,若IO4读到0,则K54’按下,若IO3读到0,则K53’按下,依次识别K52’,K51'。

思路五

很多人可能认为思路四已经识别20个按键了,但是真的就没有其他方法了吗?不要忘了,我们还没有将思路二你介绍的那种最简单的方法结合进去,于是又可以多5个按键,如下图:

这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、K05在5个IO口都为读取的情况下,就可以识别,不需要扫描识别处理,相当于这5个按键优先级高与其他按键。

总结

综合上述,5个IO口最多可以识别25个按键,思路五程序上处理比较麻烦,若实际中只按思路四设计,也可识别20个按键,那么如果有N个IO口可识别多少按键呢?这里给出如下公式:

假设有N个IO口按照思路三可以识别N*(N-1)/2个;

按照思路四可识别N*(N-1)个;

按照思路5可以识别N*(N-1)+N个。

最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?

如何对输入到单片机的方波信号采样

兄弟,你的方波信号频率1kHz没有变,变的是占空比。

不论你占空比怎么变化(大于0%,小于100%),每1ms你都会产生一次上升沿和1次下降沿~~~

也就是说你100ms内读取的脉冲与占空比无关,只于频率有关。

单片机输入捕捉功能

你的跳变频率不超过MCU的 应该可以实现的 首先上升沿触发 进入之后开启计时器,并改为下降沿触发,进入下降沿之后关闭计时器再改回上升沿

"单片机如何读入扫描码"p0端口取码,p2端口取码什么意思

"p0端口取码,p2端口取码“应该是指从端口读入数据,也就是把单片机P0、P2引脚的状态输入到单片机内部以供CPU按程序指令要求进行相应处理。

0条大神的评论

发表评论