完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近想做一个多路抢答器,想实现的功能是可以设置倒计时的时间,设置完后按照设置的时间进行倒计时并抢答,倒计时和抢答的程序已经好了,就是时间设定的部分有问题,我想了两种:1;用中断,但是进去可以加减时间,但一退出来时间就变成0了,而且不能抢答。2:用一个子程序,但是进去可以加减时间,就是退不出来。想了好几天都没有结果,所以向各位大神求助了。帮帮忙啊!谢谢了!
新建 WinRAR ZIP 压缩文件.zip
(2.13 KB, 下载次数: 21
)
下面是我的程序: #include #include #define uint unsigned int #define uchar unsigned char unsigned char code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //时间设定 unsigned char code LED[] = {~0x6F,~0x7F,~0x07,~0x7D,~0x6D,~0x66,~0x4F,~0x5B,~0x06,~0x3F,}; //倒计时 unsigned char code jianpan[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; //键盘号码 unsigned char code jishi[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,}; uchar dis_buf; //显示缓存 uchar temp; ***it P34=P3^4; ***it P35=P3^5; ***it P36=P3^6; ***it P37=P3^7; uint i=0; uchar key,num,flag,tt,stop; void keydown(void); void keyscan(void); void beep(); void timeset(); void delay(uchar x) { uchar j; while((x--)!=0) { for(j=0;j<125;j++) {;} } } void main() { flag=0; tt=0; TMOD=0x01; TH0=(65535-5000)/256; TL0=(65535-5000)%256; EA=1; //开定时器中断和开外部中断 ET0=1; TR0=1; while(1) { timeset(); keydown(); if(flag==1) //若标志位为1,退出计时,显示抢答成功的选手号码 { flag=0; TR0=0; P0 = jianpan[dis_buf%16]; //%16表示输出16进制 delay(2000); while(1) { beep(); } } else //若标志位为0,继续计时, if(tt==20) { tt=0; if(num>=10) num=0; P0=LED[num]; num++; if(num==10) TR0=0; } } } void timer0() interrupt 1 //计时中断 { TH0=(65535-50000)/256; TL0=(65535-50000)%256; tt++; } //键盘扫描 void keyscan(void) { temp = 0; P1=0xF0; //高四位输入 行为高电平 列为低电平 delay(1); temp=P1; //读P1口 temp=temp&0xF0; //屏蔽低四位 temp=~((temp>>4)|0xF0); if(temp==1) // p1.4 被拉低 key=1; else if(temp==2) // p1.5 被拉低 key=2; else if(temp==4) // p1.6 被拉低 key=3; else if(temp==8) // p1.7 被拉低 key=4; P1=0x0F; //低四位输入 列为高电平 行为低电平 delay(1); temp=P1; //读P1口 temp=temp&0x0F; temp=~(temp|0xF0); if(temp==2) // p1.1 被拉低 key=key+0; else if(temp==4) // p1.2 被拉低 key=key+4; else if(temp==8) // p1.3 被拉低 key=key+8; else key=16; dis_buf = key; //键值入显示缓存 dis_buf = dis_buf & 0x0f; }//以上是键盘扫描 //判断是否按下 void keydown(void) { P1=0xF0; if(P1!=0xF0) //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口 { flag=1; keyscan(); //调用按键扫描程序 } } void beep() //蜂鸣器间断响 { P34=1; delay(150); P34=0; delay(150); } void timeset() //时间设定:P34开始设定,P35退出设定,P36时间加,P37时间减 { while(P34==0) { delay(5); if(P34==0) { if(P35==0) { delay(5); if(P35==0) break; } if(P36==0) { delay(5); if(P36==0) { i++; delay(200); if(i>=9) i=9; } } else { if(P37==0) { delay(5); if(P37==0) { i--; delay(200); if((i<=0)||(i>9)) i=0; } } } P0=~tab; } } 这是中断的 void counter0(void) interrupt 0 { EX0=0; while(flag==1) { if(P35==0) flag=0; if(P36==0) { delay(5); if(P36==0) { i++; delay(200); if(i>=9) i=9; } } else { if(P37==0) { delay(5); if(P37==0) { i--; delay(200); if((i<=0)||(i>9)) i=0; } } } P0=~tab; num=i; } EX0=1; } } |
|
相关推荐
4个回答
|
|
自己先顶一个
|
|
|
|
挺好的,但有没有汇编语言编的啊
|
|
|
|
|
|
不错的文件,值得收藏
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
195 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
172 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
453 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
697 浏览 2 评论
602 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11983 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 03:38 , Processed in 1.033438 second(s), Total 83, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号