打印

关于不使用循环让灯闪烁的问题

[复制链接]
1226|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sengling001|  楼主 | 2016-11-14 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人设计了一个短按LED长亮  长按1S灯闪烁  长按2S熄灭  写到 这里就写不下去了 请问各位有什么办法能不使用循环让闪烁   中断时一种方法  但我这里该怎么搞啊  这个问题头疼了很久了
#include<reg52.h>
#include"c52.h"
#define uchar unsigned char
uchar a=0,b=0,c=0,d=0,e,f,g,h,i=0,num=0;
void ledflash ();
void main()
{
        EA=1;
        ET0=1;
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0xDC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;
//        ledflash ();

        for(;;)
        {
                if(b==1)
                {
                        b=0;
                        if(!K1)
                        {
                                a++;
                                c=0;
                                d=0;
                                if(a>=100&&d==0)
                                {
                                        ledflash ();       
                                        d=1;
                                        a=0;
                                }  
                        }
                        if(K1)
                        {
                               
                                if(1<a&&a<100&&c==0)
                                {
                                        LED0=~LED0;
                                        c=1;
                                        a=0;
                                }

                        }
                }
        }
}
void Timer (void) interrupt 1
{
        TL0 = 0x00;                //设置定时初值
        TH0 = 0xDC;       
        b=1;
        //h=1;
        i++;
        if(i==50)
        {
                num=1;
                i=0;
        }
        /*if(!K1)
        {
                a++;
                c=0;
                d=0;
                if(a>=100)//&&d==0)
                {
                        if(i==50)
                        {
                                i=0;
                                LED0=~LED0;
                                a=0;       
                        }
                }
         }*/
}
void ledflash ()
{
        while(1)
        {
                if(num==1)
                {
                        LED0=~LED0;
                        num=0;
                }
        }
}

相关帖子

沙发
sengling001|  楼主 | 2016-11-14 16:32 | 只看该作者
现在就一直卡在这个闪烁死循环中   想跳出来  试过 当按键时跳出来   但是好像失败了

使用特权

评论回复
板凳
NE5532| | 2016-11-14 16:41 | 只看该作者
别写程序了,画流程图吧,想清楚了再写。

使用特权

评论回复
地板
jekey| | 2016-11-14 16:57 | 只看该作者
设定一个灯的模式和计时变量, 时间到就根据灯设置的模式设置灯的亮灭。

使用特权

评论回复
5
coody| | 2016-11-14 17:26 | 只看该作者
可以使用一种叫做“定时器”的东东,然后使用一种叫做“状态机”的方法。。。

使用特权

评论回复
6
shisizai| | 2016-11-14 21:31 | 只看该作者
没看程序 如果是我写的话用两个中断,一个外部按键中断,一个定时器中断
1 当有按键按下时,进入中断,中断里判断按键类别(短 长1 长2)对相应标志位赋值
2 如果是短(d=1 l1 = 0 l2 = 0)点亮led 关闭定时器
3 如果是长1 (d=0 l1=1 l2 = 0)开启定时器 定时器中断中led取反
4 如果是长2 (d=0 l1=0 l2=1)关闭led 关闭定时器

使用特权

评论回复
7
技术小小兵| | 2016-11-14 23:43 | 只看该作者
coody 发表于 2016-11-14 17:26
可以使用一种叫做“定时器”的东东,然后使用一种叫做“状态机”的方法。。。 ...

正解,把按键状态机写在定时器里,MainLoop里面判断按键状态,做出动作

使用特权

评论回复
8
ayb_ice| | 2016-11-15 08:21 | 只看该作者
按键扫描放主循环,led控制放定时中断,主循环通过定时中断时间标志控制,这样可扩展性强,按键扫描对时间不敏感,LED显示对时间较敏感

使用特权

评论回复
9
icecut| | 2016-11-15 10:14 | 只看该作者
http://antriver.com/mcudoc/546330dea501fb6e04d74c3b
这里的代码是不闪烁的,自己看....视频特价中..源代码看不懂就去我签名找单片机视频培训
文件下载:https://bbs.21ic.com/icview-831950-1-1.html

使用特权

评论回复
10
lrhsx33| | 2016-11-16 09:44 | 只看该作者
所有的程序其实都是一个循环。
只是他们分时去处理不同的子程序。

使用特权

评论回复
11
JerryWu75| | 2016-11-16 10:13 | 只看该作者
你的ledflash都是死循环了,怎么跳出来啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝