导航:首页 > 操作系统 > 单片机按键复用

单片机按键复用

发布时间:2023-05-15 13:41:31

单片机51,出现按一次按键,得到多次按键的情况,怎么解决

单片机51,出现按一次按键,得到多次按键的情况,是由于没有做“消抖”处理的结果,在软件上做一些延时消抖处理后,一般就可以解决这个问题。比如:

keyscan()
{
if(key==0)//当按键按下
{
delay(10);//延时消抖
if(key==0)//如果按键任然按下
{
while(key==0);//等待按键抬起
.......
}
}
}

❷ 51单片机C语言按键被重复执行

程序有些啰嗦,
voidmain()
{
while(1)key();//调用按键服宽仔陪兄务函数
}
voidkey()
{
if(S1==0)testone();
elseif(S2==0)testhold();
慎乱汪elseif(S3==0)noteup();
elseif(S4==0)notedown();
}

❸ 怎么解决单片机两个或多个键同时按下的情况

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

❹ 51单片机中如何通过一个按键实现暂停与恢复需要一个编程的思想

有以下几种情况:
1.循环查询按键。当按键按第一次时间,进入第一层循环查询语句内部,执行恢复。不跳出该层循环,继续查询按键。当第二次按下时间,进入第二层循环查询语句内部,执行暂停。循环结束。若想反复暂停和恢复,就在外面再加一层while(1)类似的死循环,反复执行其内部的两层循环查询语句。
2.用一个标志变量,记住按键的状态。初始化为个值,如“暂停”,按键之后检查标志变量,是“暂停”就执行“恢复”,再让它变为“恢复”说明当前已经执行了恢复。反之亦然。
3.掉电暂停。这样需要按键能触发cpu工作。所以,需要按键接到外部中断上面。中断后可以恢复CPU工作。在中断中再判断是否要让cpu掉电与否。
不知道这种方法你能接受不?还是用外部中断。此按键触发中断后,关掉所有其他的中断,也即EA=0(最好先用个变量记住EA,方便恢复),然后就一直在中断中等待该按键第二次按下再恢复EA,最后退出中断。

❺ 51单片机中如何通过一个按键实现暂停与恢复需要一个编程的思想

1、创建项目文件。

❻ 51单片机IO口的分时复用应用问题

可以复用,但是按键的时候灯是亮的。
复用方法有点类似动态显示扫描,读取按键之前,把P0.1置成高电平,即关灯,延时一点时间,读按键。读完按键,恢复显示内容。
由于按键读取不需要很频繁,比如说10ms才读一次,那么显示偶尔关一小会,比如说10us,肉眼感觉不到显示闪烁。

❼ 单片机按键复位电路各元件的作用

R17
C13组成止电复位电路,刚上电时,C13是电压为0,电源通过R17对电容充电,因此,RST引脚呈现高电平,高电平时间大于2个晶振周期,单片机复位
电容充电完毕,RST引脚呈现低电平,复位结束
按钮S22和R16组成手动复位电路
,按下S22,电源接通R16和
R17,由于R17阻值比较大,因此RST是高电平,同时电容通过R16迅速放电,即使按钮触点断开,电源也可对C13充电,使RST高电平稳定一段时间
,保证可靠复位。
C13容量较小时,R16可省掉,小电容短路放电不会损坏按钮触点

❽ 关于单片机IO口输入输出复用问题

首先电阻应该接电源正极,按键一端接地,但还不行,按键检测时,IO口先输出高电平,若有按键按下则检测到低电平,所以在你检测按键之前,LED已经处于亮态了,这和你检肢好塌测到按键按历圆下再亮是矛盾的

当按键不被按下时,IO口是高是低由程序决定的,复位时IO口袜庆黙认是作为输入用的,输出是高电平

但负载能力比较弱

将LED改为低电平驱动是可行的,平时IO时输出高平可作为输入,LED不亮,按下按键后,单片机检测到低电平,可输出低电平,LED就一直亮了(也可由程序控制亮一段时间灭,以便再次进行检测)

❾ 单片机独立键盘输入数码管显示 使用独立键盘输入,实现按键复用,并在数码管上显示。

这个就两个功能,一个是键盘扫描,二是数码管显示,这样的程序网上一大把,
按键程序
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar pre_peyno=16;keyno=16;
void delayms(int x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void ked_scan()
{
uchar m;
P2=0x0f;
if(P2&0x0f!=0x0f)
delayms(2);
if(P2&0x0f!=0x0f)
m=P2^0x0f;
switch(m)
{
case1:keyno=0;break;
case2:keyno=1;break;
case4:keyno=2;break;
case8:keyno=3;break;
default:keyno=16;
}
P2=0xf0;
delayms(1);
m=P2>>4^0x0f;
m=m+10;
switch(m)
{
case1:keyno=0;break;
case2:keyno=4;break;
case4:keyno=8;break;
case8:keyno=12;break;
}
}
main()
{
P2=0xff;
while(1)
{
uchar i;
switch(keyno)
{
case0:P2=0x00;break;
case1:P2=0xfe;for(i=0;i<7;i++){P2=_crol_(P2,1);delayms(150);}break;
case2:P2=0x7f;for(i=0;i<7;i++)P2=_cror_(p2,1);delayms(150);}break;
case16:P2=0xff;break;
}
}

数码管程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit la=P2^7;
sbit wela=P2^6;
unsigned char code num[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

#define uint unsigned int

void delay(uint x)
{
while(x--);
}

void main()
{
while(1)
{

P0=0xfe;
wela=1;
wela=0;
P0=num[1];
la=1;
la=0;
delay(1000);

P0=0xfd;
wela=1;
wela=0;
P0=num[2];
la=1;
la=0;
delay(1000);

}
}
以上两个程序是参考程序,不过还得根据自己的实际电路改改,不能直接运用。

阅读全文

与单片机按键复用相关的资料

热点内容
手游mc服务器怎么设置管理员 浏览:200
pso算法优化参数 浏览:606
java打开pdf文件怎么打开 浏览:369
用银行家算法拒绝死锁的例题 浏览:670
洗盘选股指标源码 浏览:705
百度云盘下载的压缩包怎么解压 浏览:737
加密类型是TKIP被我弄掉了 浏览:234
贝刻智能手环app如何下载 浏览:838
公司电脑上的加密文件解密 浏览:462
服务器怎么配置数据库 浏览:889
压缩机和制冷剂 浏览:182
树莓派手机版编程 浏览:926
谷歌编程挑战赛时间安排 浏览:438
自动学习机源码 浏览:938
明日之后星曳镇是什么服务器 浏览:474
编程学有年龄限制吗 浏览:571
工程可靠度pdf 浏览:900
包子解压玩具会爆吗 浏览:143
资治通鉴柏杨版pdf 浏览:852
跆拳道pdf 浏览:205