一、郭天祥51单片机问题,为什么key2长按后松开再按下,图上只有最右边的数码管仍在计数。 不知道哪出问题了

你的key2检测有点复杂了 中间多了两(10);应该和正常检测一样即 检测--延时--再检测--等待按键抬起--执行按键功能或 检测--延时--再检测--执行按键功能-- if (key2==0) {delay(10);if (key2==0){   while(!key2);if(s==1){s=0;TR1=0;}else{TR1=1;s=1;}}}为了防止按键按下一次而被当作多次按下的话,一定要加按键抬起检测 即wy2);但长时间按下不丢,你想让它怎么样?这是你的程序决定的,无非是立即停止或等你抬起后再停止 如果要立即停,可将 if(s==1)判断语句放在 while(!key2)语句之前,这时只停止定时器,按键未抬起时,数码管已停止显示了(最后一位还亮,因扫并没有关闭数码管,连续扫描时看不出来),按键松开后数码管又全亮了,此时显示的数据便停在你按键若再次按下KEY2键,立即工作了,中断程序也可发生,但按键未抬起时结果你是看不到的,等一会儿按键抬起,你会发现数码管显示的数据会变化很多,这也是正常的

谢谢了,我把防抖完善了。我调试了下找到问题的所在了,就是if (num==100) {num=0; num1++;} 郭天祥51单片机问题,为什么key2长按后松开再按下,图上只有最右边的数码管仍在计数。不知道哪出问题了
if (num1==60) {num1=0;} 这里出了问题,在按键过程中,中断发生两次以上时而中断中num又刚好值超过100.

二、郭天祥51单片机问题,为什么key2长按后松开再按下,图上只...

我写过8位的,带有删除功能,这是自己写的东西。我单片机有外接753芯片的,相当于io口扩展,所以可以用8个io口控制8跟数码管。输出为p1,程序里的latch1和latch2是用来控制753芯片的。我的数码管是动态扫描显示的,不知道你单片机的电路长啥样。不过大致原理就是在main函数里不断扫描按键,如果有扫描到按键,就更新我所要显示的变量(val[i])。然后用定时器(scheduler())的部分来动态扫描我的数码管,每隔2.4微妙切换到下一个数码管(我用12兆晶振)。我是没试过,不过我估计也可以用定时器来安排按键扫描,然后在main循环里面扫描数码管。或者更牛的就是两项工作全部弄在一个定时器里,这种方法叫做scheduler,可以用来做简单的多任务单片机。#include unsigned char code tubepos[] = {0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1}; unsigned char code tubenum[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//0xff为不显示 sbit latch1 = p2^0; sbit latch2 = p2^1; sbit latch3 = p3^5; int i,j,pos,val[8]={16,16,16,16,16,16,16,16}; //8个数码管都不显示 unsigned char k; void shift(num) { for(k=7;k>0;k--) { val[k]=val[k-1]; } val[0]=num; } void delete() { for(k=0;k7) { pos=0; } } i++; if(i>9) { i=0; } }

三、关于郭天祥51单片机教程视频课后题 同时用两个定时器控制蜂鸣器的提问?

频率这个变量应该就是用于查看的,没有起到控制作用,起码你分享的部分代码里面没有使用。

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。