怎样让单片机实现按下按键加1的程序在数码管中不闪烁 代码如下,求大神解答

作者&投稿:全荣 (若有异议请与网页底部的电邮联系)
51单片机中如何按下按键时数码管正常显示而不闪烁,并且实现长按连续~

你好,我也遇到这样的问题,经过一周的研究,问之前的前辈得出结果,希望对你有帮助
char scan_k(char k)
{
int i=0;//定义一个变量用来累计长按的时间
if((KEY1&&KEY2&&KEY3&&KEY4&&KEY5&&KEY6)==0)//如果有按键按下
{
while(!KEY1)//如果按键1按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=11;//按键1长按
}
else
{
k=1;//按键1短按
}

}
i=0;
while(!KEY2)//如果按键2按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=21;//按键2长按
}
else
{
k=2;//按键2短按
}

}
i=0;//在下一个按键按下之前清空i的值
while(!KEY3)//如果按键3按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=31;//按键3长按
}
else
{
k=3;//按键3短按
}

}
i=0;
while(!KEY4)//如果按键4按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=41;//按键4长按
}
else
{
k=4;//按键4短按
}

}
i=0;
while(!KEY5)//如果按键5按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=51;//按键5长按
}
else
{
k=5;//按键5短按
}

}
i=0;
while(!KEY6)//如果按键6按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=61;//按键6长按
}
else
{
k=6;//按键6短按
}

}
i=0;

}
return k;//返回按键的值
}
以上代码,不带操作系统,不包含中断,请根据实际情况调整你想要的长按时间,按键按下的时候,如果你的消抖时间太长,数码管会有明显的闪烁或者变暗,请根据自己的需求进行调整

程序清单如下:
#include // 51单片机头文件
#define uchar unsigned char// 宏定义,用uchar替代无符号字符型
#define uint unsigned int// 宏定义,用uint 替代无符号整数型
sbit Key = P2 ^ 7;
uchar Count = 0;
uchar code DataChar[10] = // 定义数码管的段码 '0'~'9'、'-'、' ' 'P'
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
};//延时N毫秒
void DelayNms( uint N )// 利用x、y作简单的自减运算,消耗单片机指令周期,达到延时的目的
{
uint x,y;
for( x=N; x>0; x-- )
for( y=110; y>0; y-- );
}
//数码管显示 // 显示方式为动态扫描,视觉暂留原理
void Display( uchar Num )// *p指向Main函数中的数组ShowNum的首地址
{
P0 = DataChar[ Num ];// 向P0赋段码值
DelayNms(2);// 短暂的延时
P0 = 0x00;// 让数码管熄灭,否则会造成数字重叠
}
void main( void )
{
while(1)
{
if( Key == 0 )
{
DelayNms(30);
if( Key == 0 )
{
Count += 1;
Count = (Count>9)? 0 : Count;
}
while( !Key );
}
Display( Count );
}
}

扩展资料
8051单片机具有如下功能:
8位CPU·4kbytes程序存储器(ROM) (52为8K)
128bytes的数据存储器(RAM) (52有256bytes的RAM)
32条I/O口线·111条指令,大部分为单字节指令
21个专用寄存器
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
参考资料来源:百度百科-51单片机

#include <AT89X52.H>
ys(int y)
{int x;
 for (x=0;x<y;x++);
}

main()
   
{
  bit P3_2_P,P3_3_P,P3_4_P,P3_2_P;
  char a,b,c,d;
  char xq[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79,0x71} ;
  a=0;b=0;c=0;d=0;

 while(1)
 
  {
    P2=0xff;P0=xq[a];P2_3=0;ys(10);
    P2=0xff;P0=xq[b];P2_2=0;ys(10);
    P2=0xff;P0=xq[c];P2_1=0;ys(10);
    P2=0xff;P0=xq[d];P2_0=0;ys(8);
   
  if (P3_2==0 && P3_2_P==1){a++;ys(20);}   //如果p3.2==0那么a=0依次加1
  P3_2_P=P3_2;
if (P3_3==0 && P3_3_P==1){b++;ys(20); }   
  P3_3_P=P3_3;
  if (P3_4==0 && P3_4_P==1){c++;ys(20); }
  P3_4_P=P3_4;
if (P3_5==0 && P3_5_P==1){d++;ys(20); }
P3_5_P=P3_5;

  }
}


首先,你最好进行按钮的去抖处理,否则 你按一下P3_2
,a会加好几次

其次 ys(20000) 延时的时间短一点试试


单片机如何模拟手按下触摸开关的功能?
2.模拟触摸信号:单片机可以通过模拟触摸开关的电容变化来实现模拟手按下的功能。这可以通过改变触摸板上的电容值来实现,例如通过单片机控制一个外部电路来改变触摸板上的电容。3.软件模拟:在软件层面,单片机可以通过编程来模拟触摸事件。例如,如果触摸开关连接到单片机的一个输入引脚,单片机可以定期向该引...

单片机中怎么样实现按键按下计数
void main (void){ unsigned char num=0;KEY_ADD=1; \/\/按键输入端口电平置高 KEY_DEC=1;while (1) \/\/主循环 { if(!KEY_ADD) \/\/如果检测到低电平,说明按键按下 { DelayMs(10); \/\/延时去抖,一般10-20ms if(!KEY_ADD) \/\/再次确认按键是否按下,没有按下则退出 { while(!

此单片机代码,怎么实现按下key1后一直执行,而不是松开就不执行了_百...
按下KEY1,一直做KEY1里面的代码,按下KEY2,就一直做KEY2的代码是不是,看的出来,你的里面是要点亮数码管的。很简单,改一下就可以了。如下面,可以实现:当按下KEY1,显示KEY1对应的内容,按下KEY2,显示KEY2对应的内容,当都不按时,什么都不显示。include<reg51.h> int i;sbit led1=P2...

单片机C语言如何实现按键按一下的时候加一,长按的时候连加。_百度知...
这个可以通过定时器来实现,比如当按键时间小于2秒时,按一次加1,当超过2秒时,没50毫秒加1实现连加功能。例程如下:include<reg51.h> unsigned int a;unsigned char times;sbit key=P1^0;void t0isr() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;times++;if(times>40){...

在单片机里面有没有方法可以不用按键释放实现按下按键直接加一,不需...
== 0)break;\/\/ 读取按键 \/\/ keyError = (P1 & 0xFF)\/\/ 没有按键按下 \/\/ if(keyError == 0xFF){ \/\/ 清除状态 \/\/ keyStatus = 0xFF;break;\/\/ } \/\/ 检测长按 \/\/ if(keyStatus == keyError)break;\/\/ 更新按键状态 \/\/ keyStatus = keyError;\/\/ 处理数据 \/\/ \/\/ }while(0);

怎么让单片机按一下按键执行一个程序,再按一下执行另一个程序
第一次按下,会到这里,执行下功能 置起一个标志位。如SETB FLAG.0 RET 这样就这实现了一键两功能,如果要更多,就设置一个寄存器,每次加1,对比。是那个执行那个程序,最多一个按键可以做到255种功能。当然你肯定用不了这么多。满意给我加分吧,只能给你思路,给你完整程序是害你的。

AVR 单片机C语言怎样实现按键按一下led灯闪烁 再按一下led灯灭如此反复...
用状态机写:函数1:LED闪烁 main(){ while(1){ if(KEY)State = ~State;if(State)LED闪烁 else LED熄灭 } }

在单片机编写走马灯程序中,怎样实现当按下一个键使八个灯全亮,当松开...
这个程序结构的问题,有很多种方法,这里提供两种做为参考,一,以按键为条件做个分支(就是if else语句),按键无按下时运行跑马灯,有按键时输出全亮。这是初学者最容易理解的。二,程序的结构调整一下,做一个输出的BUF,按键按下时填BUF全亮的数据,这时跑马灯的数据是停在那里的,不按下时BUF...

这个按键如何用单片机编程实现按一下通电?
这是单片机的复位电路。按键按下后,会给单片机复位脚一段时间的高电平,使单片机复位。不需要单片机编程,由硬件实现。

如何实现51单片机按下k2灯从上往下亮,按下k3熄灭,按k4从下往上亮,按...
{ while(k4==0); mode=3; } if(k5==0) { while(k5==0); mode=4; } switch(mode) { case 1:P0=led;led=_crol_(led,1);delay(200);break;

张掖市17868473903: 单片机C语言如何实现按键按一下的时候加一,长按的时候连加. -
仍鲍正清: 这个可以通过定时器来实现,比如当按键时间小于2秒时,按一次加1,当超过2秒时,没50毫秒加1实现连加功能.例程如下: #include<reg51.h> unsigned int a; unsigned char times; sbit key=P1^0; void t0isr() interrupt 1 { TH0=(65536-50000)/...

张掖市17868473903: 单片机 按键 按一下加一,长按自加 的程序怎么写? 是这样么? if(s2==0) { delay1ms(5); if(s2==0) delay
仍鲍正清: if(s2==0) { delay1ms(5); //按键去抖动 if(s2==0) { Ldata++;//加一 for(i=0;i&lt;1000;i++)//此处为等待键释放,每个循环都看键是否释放,在这段时间内释放则算一次按键,此处i的大小根据需要确定 if(!s2==0) break; //如果键释放则退出 else {if(i=...

张掖市17868473903: 单片机怎么用键盘中断实现按住按键,使内部RAM中的一个数据不停加1? -
仍鲍正清: 你既能够实现按一下,数据加1的话,那就差一点就可以实现你所说的功能了. 不过还要看你的中断是边沿触发呢,还是电平触发? 如果是边沿触发呢,每次进入中断的时候把一个位变量置1,并且保存外部中断口的电平.然后我们在主程序中读取这个位变量,如果位变量为1说明已经有铵键被按下.然后开如计时,并将位变量清零.当时间达到某一个值(如:200ms)我们就让计数寄存器加1,以此类推,当时间达到另一个值时(如:400ms),再将计数据器加1.不过,当主程序中再次读到位变量被置1时,我们要停止计时.并判断时间是否达到设定值,如果比设定值小的话,就视为干扰信号.这时清除计时器.这样就能实现连续加1的功能. 希望能让你得到启发.祝你好运!

张掖市17868473903: 怎样让单片机实现按下按键加1的程序在数码管中不闪烁 代码如下,求大神解答 -
仍鲍正清: 首先,你最好进行按钮的去抖处理,否则 你按一下P3_2 ,a会加好几次 其次 ys(20000) 延时的时间短一点试试

张掖市17868473903: avr单片机中如何实现按下1次按键计数加1求代码
仍鲍正清: 1种简单的方法是,把这个按键放到单片机的1个中断口上(降落沿触发),然后建1个变量,放到该中断函数中,进行加1运算主函数voidmain(void){unsignedcharnum=0;KEY_ADD=1;//按键输入端口电平置高KEY_DEC=1;while(1)//主循环{if(!...

张掖市17868473903: 单片机中利用中断程序做出按键按下显示数字,逐次加一,从一到九 -
仍鲍正清: #include<reg51.h>#define uchar unsigned char; uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar dat; void t1isr() interrupt 0 { dat++; dat%=10; P0=distab[dat]; } main() { IT0=1; EX0=1; EA=1; while(1); }

张掖市17868473903: 如何在单片机中不用中断而实现加一 -
仍鲍正清: 可以的,你增加一个临时变量,保存当前开关状态前一个状态的;当下时,当前状态是有效按下,前一个状态是未按下,那么加1.更新状态,下一个循环来时,由于两个状态都是按下,不执行加1即可.

张掖市17868473903: 需要一小段单片机程序 实现按键之后,八段管数字+1的效果 -
仍鲍正清: 可以设计个循环 通过读取P0口的值 若是0FEH,则可知是P0.0按下 用CJNE 指令判断 若是 则跳入 执行+1并显示的子程序 ,同理 若是0FDH,则跳入-1并显示子程序 ,(你的按下是使接口为低电平吧),通过单片机的话 键盘是自己设定的 对任意键 你希望是什么就可以设置成什么 比如 你可以把 4X4矩阵键盘定义为 0-9,A-F 或者 加减乘除运算符 等等 具体情况视所编键盘程序而定

张掖市17868473903: 在单片机里面有没有方法可以不用按键释放实现按下按键直接加一,不需要等待释放后再加一. -
仍鲍正清: 给你你写一个按键检测程序,不占用CPU资源循环查询,有长按检测u8 keyError;u8 keyStatus;u8 keyTimer;do{// 读取按键 //keyError = (P1 & 0xFF)// 延时消抖 //if(++keyTimer >= 100)keyTimer = 0;// 等待消抖 //if(keyTimer == 0)break;// 读取按键 //...

张掖市17868473903: 单片机按键按一下,数字只加一. -
仍鲍正清: 这样不是很好吗,按下只要没放就在那等待,如果不等待,又会进入下一次按键的判断,这样可能不是我们想要要的结果,如果你不想在那等,就不用while(!KEY),程序执行完这个Key的过程后,可能会立马又进入了Key函数,那么,你本来想...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网