完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define uchar unsigned char #define uint unsigned int ***it K11=P3^7; uchar ajcsh,flag;//按键次数、标志位 bit ajzt;//按键状态 uint i; void yanshi(uint ms) { uchar t; while(ms--) for(t=0;t<120;t++); } xianshi1() { for(i=6;i>0;i--) { P2=0x00; yanshi(500); P2=0xff; yanshi(500); } } xianshi2() { for(i=6;i>0;i--) { P2=0xfe; yanshi(500); P2=0xff; yanshi(500); } } xianshi3() { for(i=6;i>0;i--) { P2=0xef; yanshi(500); P2=0xff; yanshi(500); } } void ajchuli()//按键处理,必须要等第一次按下执行完了才能执行后面按下执行的内容,这个应该怎么解决 { if(ajzt==0) { ajcsh=(ajcsh+1)%3; if(flag==0) {switch(ajcsh) { case 1:xianshi1();flag=0;break; case 2:xianshi2();flag=0;break; case 0:xianshi3();flag=0;break; } } }} main() { ajcsh=0; ajzt=1; while(1) { if(ajzt!=K11) { yanshi(10); ajzt=K11; ajchuli(); }}} |
|
相关推荐
7个回答
|
|
设置一个标记位,按一次 ++ 一次,然后判断自加了几次就好了,退出时可以修改标志位的值,或者清零或者改成其他的值
|
|
|
|
看标题和内容矛盾,不知道楼主是要求按下按键立即响应并终止正在执行的程序,还是要求等待正在执行的程序结束再响应按键?
|
|
|
|
本帖最后由 大兵0518 于 2017-6-6 15:35 编辑
是按下后立即停止并执行再次按下的内容 |
|
|
|
因为你用了软件延时循环,在循环没有结束时按键信息无法建立,建议把按键扫描程序放在中断里,并且在for循环里设置循环约束条件,一旦条件不满足立即跳出for循环。 |
|
|
|
根据你的程序只修改了显示程序,增加了定时器中断,完全满足你的要求。
#include #define uchar unsigned char #define uint unsigned int ***it K11=P3^7; uchar ajcsh,flag;//按键次数、标志位 bit ajzt;//按键状态 uint tim1=0; //中断计数 uchar tim2=0; //中断计数 void Timer0Init() //250微秒@11.0592MHz { TMOD = 0x02; //设置定时器自动重载模式 TL0 = 0x1A; //设置定时初值 TH0 = 0x1A; //设置定时重载值 TF0 = 0; //清除TF0标志 // TR0 = 1; //定时器0开始计时 EA=1; //开总中断 ET0=1; //开定时器0中断 } void yanshi(uint ms) { uchar t; while(ms--) for(t=0;t<120;t++); } void xianshi() //显示程序 { if((ajcsh==1)&&(flag==1)) { if((tim2==0)||(tim2==2)||(tim2==4)||(tim2==6)||(tim2==8)||(tim2==10)) P2=0x00; if((tim2==1)||(tim2==3)||(tim2==5)||(tim2==7)||(tim2==9)||(tim2==11)) P2=0xff; if(tim2>=12) { flag=0; tim1=0; tim2=0; TR0= 0; } } if((ajcsh==2)&&(flag==1)) { if((tim2==0)||(tim2==2)||(tim2==4)||(tim2==6)||(tim2==8)||(tim2==10)) P2=0xfe; if((tim2==1)||(tim2==3)||(tim2==5)||(tim2==7)||(tim2==9)||(tim2==11)) P2=0xff; if(tim2>=12) { flag=0; tim1=0; tim2=0; TR0= 0; } } if((ajcsh==0)&&(flag==1)) { if((tim2==0)||(tim2==2)||(tim2==4)||(tim2==6)||(tim2==8)||(tim2==10)) P2=0xef; if((tim2==1)||(tim2==3)||(tim2==5)||(tim2==7)||(tim2==9)||(tim2==11)) P2=0xff; if(tim2>=12) { flag=0; tim1=0; tim2=0; TR0= 0; } } } void ajchuli()//按键处理,必须要等第一次按下执行完了才能执行后面按下执行的内容,这个应该怎么解决 { if(ajzt==0) { ajcsh=(ajcsh+1)%3; flag=1; tim1=0; tim2=0; TR0= 1; //定时器0开始计时 } } void main() { ajcsh=0; ajzt=1; Timer0Init(); while(1) { if(ajzt!=K11) { yanshi(10); ajzt=K11; ajchuli(); } xianshi(); } } /********中断服务程序**********/ void timer0() interrupt 1 { tim1++; if(tim1>=2000) //0.5秒计时 { tim1=0; tim2++; } } |
|
|
|
程序进一步完善如下:
#include #define uchar unsigned char #define uint unsigned int ***it K11=P3^7; uchar ajcsh,flag;//按键次数、标志位 bit ajzt;//按键状态 uint tim1=0; //中断计数 uchar tim2=1; //中断计数 void Timer0Init() //250微秒@11.0592MHz { TMOD = 0x02; //设置定时器自动重载模式 TL0 = 0x1A; //设置定时初值 TH0 = 0x1A; //设置定时重载值 TF0 = 0; //清除TF0标志 // TR0 = 1; //定时器0开始计时 EA=1; //开总中断 ET0=1; //开定时器0中断 } void yanshi(uint ms) { uchar t; while(ms--) for(t=0;t<120;t++); } void xianshi() //显示程序 { if((ajcsh==1)&&(flag==1)) { if(tim2==13) { flag=0; tim1=0; tim2=1; TR0= 0; } else if((tim2%2)==1) P2=0x00; else P2=0xff; } if((ajcsh==2)&&(flag==1)) { if(tim2==13) { flag=0; tim1=0; tim2=1; TR0= 0; } else if((tim2%2)==1) P2=0xfe; else P2=0xff; } if((ajcsh==0)&&(flag==1)) { if(tim2==13) { flag=0; tim1=0; tim2=1; TR0= 0; } else if((tim2%2)==1) P2=0xef; else P2=0xff; } } void ajchuli()//按键处理 { if(ajzt==0) { ajcsh=(ajcsh+1)%3; flag=1; tim1=0; tim2=1; TR0= 1; //定时器0开始计时 } } void main() { ajcsh=0; ajzt=1; Timer0Init(); while(1) { if(ajzt!=K11) { yanshi(10); ajzt=K11; ajchuli(); } xianshi(); } } /********中断服务程序**********/ void timer0() interrupt 1 { tim1++; if(tim1>=2000) //0.5秒计时 { tim1=0; if(tim2<13) tim2++; } } |
|
|
|
漂亮,帅,问题已解决,谢谢抱拳 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 01:53 , Processed in 0.918954 second(s), Total 51, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号