完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
看了几个数码管显示时钟的程序,发现在调整时间的功能上都是在主函数里不停地扫描按键。请问可以不可以把按键扫描功能放到中断函数里,主函数只负责显示时间。进入中断函数后,在中断函数中,扫描按键,调整时间?
#include #define GPIO_DIG P0 //数码段数据 ***it LSA=P2^2; //位选控制口 ***it LSB=P2^3; ***it LSC=P2^4; ***it K1=P3^0; //选择调时位 ***it K2=P3^1; //+1 ***it K3=P3^2; //K3暂停,进入调时状态 unsigned int time; //用来计时间的值 unsigned char SetPlace; //设置修改位 unsigned char hour=10,minute=59,second=55; unsigned char code DIG_CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码 void Delay1ms(unsigned int c) //误差 0us { ......... } void TimerConfiguration() { TMOD = 0x02; //选择工作方式2,自动赋初值 TH0 = 0x06; //设置初始值 250 us TL0 = 0x06; EA = 1; //打开总中断 ET0 = 1; //打开定时器0中断 TR0 = 1; //启动定时器0 } void Timer0() interrupt 1 { Time++; } void Int0Configuration() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 } void Int0() interrupt 0 { if(K3==0) Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=1; } } void DigDisplay() { ....... } void main(void) { unsigned char i; TimerConfiguration(); Int0Configuration(); while(1) { /*计时函数*/ if(Time>=3997) //一秒钟,改变数值 { Time=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; } } } } DigDisplay(); //--显示时钟--// if(TR0==0) { if(K1==0) //检测按键K1是否按下 { Delay1ms(10); //消除抖动 if(K1==0) { SetPlace++; Delay1ms(100); if(SetPlace>=3) SetPlace=0; } while((i<50)&&(K1==0)) //检测按键K1是否松开 { Delay1ms(1); i++; } i=0; } switch(SetPlace) {case 0 : { if(K2==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { second++; Delay1ms(100); if(second>=60) second=0; } } DigDisplay(); }break; case 1 : { if(K2==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { minute++; Delay1ms(100); if(minute>=60) minute=0; } } DigDisplay(); }break; case 2 : { if(K2==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { hour++; Delay1ms(100); if(hour>=24) hour=0; } } DigDisplay(); }break; } } } } 可以不可以把按键扫描功能放到中断函数里,主函数只负责显示时间。进入中断函数后,在中断函数中,扫描按键,调整时间?这种思路可以实现吗? void Int0() interrupt 0 { if(K3==0) Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=1; } if(K1==0) //检测按键K1是否按下 { Delay1ms(10); //消除抖动 if(K1==0) { SetPlace++; Delay1ms(100); if(SetPlace>=3) SetPlace=0; } while((i<50)&&(K1==0)) //检测按键K1是否松开 { Delay1ms(1); i++; } i=0; } switch(SetPlace) {case 0 : { if(K2==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { second++; Delay1ms(100); if(second>=60) second=0; } } DigDisplay(); }break; case 1 : { if(K2==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { minute++; Delay1ms(100); if(minute>=60) minute=0; } } DigDisplay(); }break; case 2 : { if(K2==0) //检测按键K2是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { hour++; Delay1ms(100); if(hour>=24) hour=0; } } DigDisplay(); }break; } } |
|
相关推荐
4个回答
|
|
不太合适,按键操作虽然只是扫描了再判断键值,做对应操作,似乎很少,很快,但是需要做防抖,做按键释放判断,重复按键,快速按键等等判断,如果放在中断里,会有影响其他各中断的可能,以及出现中断嵌套的情况,处理起来反而会复杂了,而且也违背了中断本身的意义,中断本身就是用来处理一些临时性或定期性的事件,基本都是以设置代表性的标志等为主,争取在短时间内处理完中断事件,尽量不影响其他中断处理以及主程序的运行。
在较小的应用里这种影响还不明显,在大到一定程度或一些对中断依赖性较强的应用里,影响就很大了。 |
|
|
|
人中狼 发表于 2017-6-5 20:47 受教了,感谢, 那么,在中断中,只控制关键性的标志位,剩下的判断,及相应 的控制 还是老老实实地放到其它控制部分去处理吧。 void Int0() interrupt 0 { if(K3==0) Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=1; } } |
|
|
|
csz9981 发表于 2017-6-5 20:56 数码管动态显示对时序要求比较高,容易受其他任务的干扰引起闪烁或亮度不均匀,在按键扫描程序中不宜使用普通延时消抖,要用计数方式延时消抖。如果因为需要按键及时响应可以把按键扫描程序放在中断里,并且把按键扫描程序拆分为两块,按键扫描放在中断里只输出键值,不处理任务,按键任务放在主程序中处理。 void Int0() interrupt 0 //200us 中断 { if(K3==0) { count3++; //消抖计数3自+1 if(count3>=100) //20ms { count3=100; //防止计数溢出 if(key3_sign==0) //按键3自锁标志为0 { key3_sign=1; //按键3自锁标志置1 KeySec=3; //输出键值3 } } } else { key3_sign=0; //按键3自锁标志清0 count3=0; //消抖计数3清0 } } |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
770 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
544 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
677 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
904 浏览 2 评论
649 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11991 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 18:40 , Processed in 0.788141 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号