一个51单片机如何同时响应两个以上按键输入信号

也就是当key1(带自锁)作为51单片机输入信号被按下时,再按key2(不带自锁)时,响应就有问题了。请问这个问题要如何解决?工业上会遇到这种情况的。请问如何用程序将key1的电平信号在程序里面变为脉冲形式?也就是说不论你按下多久,单片机只扫描一次!
我是用C语言编程。

所谓的同时响应是不可能的,无论是扫描还是中断都有分先后。

你的问题可以参考以下解决方法:
扫描时先记录KEY1的状态,如果为按下则无论下次扫描到什么状态都不执行动作,如果是放开的记录为放开,再次扫描到如果为按下则执行动作。这个扫描可以同时应用于KEY2两个不相冲突。追问

可以给个例子吗?我刚刚接触单片机。谢谢。

追答

#include
#define uchar unsigned char
#define uint unsigned int
sbit P0_0=P0^0;//key1
sbit P0_1=P0^1;//key2
int i,j;
if (P0_0==0) i=0;//记录key1为按下
else i=1;//记录KEY1为放开

if (P0_1==0) j=0;//记录key1为按下
else j=1;//记录KEY2为放开
int scanf1(); //扫描key1
int scanf2();//扫描key2
int scanf1()
{
if ( i=1 )//如果之前的状态为放开就判断是否有按下,如果有按下则执行相应的动作。
{
if (P0_0==0)
{
i=0;
key1dowm();
}
}
else//如果之前的状态是按下则只判断有没有放开,不论有没有放开都不执行按键动作。
{
if (P0_0==1)
{
i=1;
}
}
int scanf2()
{
if ( j=1 )//如果之前的状态为放开就判断是否有按下,如果有按下则执行相应的动作。
{
if (P0_0==0)
{
j=0;
key2dowm();
}
}
else//如果之前的状态是按下则只判断有没有放开,不论有没有放开都不执行按键动作。
{
if (P0_1==1)
{
j=1;
}
}
key1dowm()
{
}
key2dowm()
{
}

main()
{
scanf1(); //扫描key1
scanf2(); //扫描key2
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-05-07
如果是轮询按键的话,可以按下key1以后将一个变量i置一,直到松开变量i清零,这样再按key2的时候进去先检测i是否为0,为0才能进行下一步
第2个回答  2014-05-07
不明白你说的追问

也就是当一个按键一直被按下的时候,在没有松开之前你再去按第二个按键就会出现不响应现象。

追答

应该是无论key1是否按下,只要有按下key2就立刻反应?

一个51单片机如何同时响应两个以上按键输入信号
扫描时先记录KEY1的状态,如果为按下则无论下次扫描到什么状态都不执行动作,如果是放开的记录为放开,再次扫描到如果为按下则执行动作。这个扫描可以同时应用于KEY2两个不相冲突。

51单片机怎样用两个以上按键同时控制相应程序的执行
回答:按键按下,给一标志位,子函数 通过识别 标志位,判断是否 执行流水。 猜测:又一个受 郭大侠荼毒的孩子!

怎么解决单片机两个或多个键同时按下的情况?
1)当key1(带自锁)作为51单片机输入信号被按下时,再按key2(不带自锁)时,响应就有问题了;2)如果是先判断key1的话,加个延时,然后再判断key2的电平,理论上没问题的;3)或者如果你key1自锁的时候为高电平,直接 while(key1){;}。

51单片机双键同时识别(长按)判断程序怎么编?
假设“1”表示键按下,那么双键同时按,肯定端口有两个“1”,只有一个键按则只有一个“1”,当然“0”表示按下的话,取反就是了。这样就好办了,将这个有效键位值赋值给累加器A,根据奇偶标志“P"的值就可以判断是单键还是双键了。

51单片机矩阵键盘如何实现两个键同时按下的时候显示其他数字,用c语言...
用普通的按键扫描程序,当扫描到有按键按下的时候。按键键的值写入缓冲区。继续扫描直到完成。然后返回缓冲区地址就可以得到多个按键的数据了。这样只要定义16字节的缓冲区全部按键都能检测到。(一般不需要那么多6个足够)还有一种方式 是 如果只返回2个按键的话。可以这样 常规按键扫描 返回范围在0-15...

单片机用一个IO口采集多个按键信号如何实现
上图中有10个按键,对应电阻值按照ADCIN处的电压分别为Vref的x\/10(x=1,2,3...9,10)倍算好,使用的电阻值也已经按照最小误差定的,可直接使用。不同按键按下,ADCIN处的电压不同,单片机ADC模块读出ADC值,从而识别对应哪个按键按下。上图中电阻使用串联的方式接在电路中,这样也就有一个电阻...

c51单片机怎么用两个按键控制两个数码管的加减,加到99就好,求程序_百 ...
1、首先先在proteus画出仿真图,方便仿真程序。2、接着来编写程序,先来写入头函数。2、根据自己在proteus画的图,定义一下管脚根据你的原理图进行编写。3、然后写一个延时函数,来调节流水灯的时间间隔延时时间自己定义。4、下图就是主函数,包括流水灯的反复循环和j流水灯的方向。5、检查没有错误,...

如何用C51单片机实现P0口接两个按键,P1口接8个LED灯。key1按下左移动...
给个四路:定意一个变量;if(按键1按下)变量为1;if(按键2按下)变量为2;if(变量==1){ 左移控制;} else if(变量==2){ 右移控制;}

51单片机一个按键控制两个输出端交替产生脉冲
硬件就不说了,直接点来软件,外部中断配置好,然后在中断函数里面判断是第几次按下(用一个变量,进入一次中断变量加一,奇数表示第一次,偶数就表示第二次了,就这样循环啦),然后根据奇偶性选择引脚控制,相信延迟(要精确就用定时器,控制TRx位就行),IO口拉高拉低你应该会的 兄弟,加油^0^~...

51单片机4*4矩阵键盘如何同时实现单击+双击的功能?
我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零。这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作...

相似回答