找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9049|回复: 2
收起左侧

【求助】一个按键控制八个流水灯的不同工作状态时,单片机一直处于中断状态

[复制链接]
ID:100952 发表于 2015-12-28 22:23 | 显示全部楼层 |阅读模式
我想做的是:在不按键的情况下,八个LED流水灯形式工作;按键按下,第一个LED与第八个LED亮,然后第二个LED与第七个LED亮,以此类推。
现在的问题是,按键一次,切换成第二种工作状态,但是再按,就没办法切换到最初的流水灯形式,程序如下:
sbit run_flag = P3^2;
//延时函数,消除抖动
void Delay(uint16 count)
{
        uint8 i;
        while(--count != 0)
           for(i=0;i<125;i++);
       
}
/*按键的判断转化成中断处理,按下按键则意味着一次中断事件发生,
   单片机处理按键任务,即跳转到INT0中断处理程序中*/
void main()
{
        IT0 = 1;  //设置外部中断0触发方式位,1为边沿触发
        EX0 = 1;  //外部中断0中断允许位
        EA = 1;  //允许总中断标志位          
        while(1)
        {
                if(run_flag==0)  //判断运行标志位状态
                {
                        P1=led_light1[i++];
                        Delay(50);
                        if(i==4) i=0;
                }
               
                else
                {
                        P1=led_light2[i++];  //点亮LED流水灯
                        Delay(50);//点亮延时
                        if(i==8) i=0;
                }

        }
}


//中断程序
void int0() interrupt 0
//中断服务函数入口
{
        EX0=0;          //禁止INT0中断
        i=0;
    run_flag=~run_flag;

        EX0=1;  // 允许INT0中断
}  

我是初学者,还麻烦各位老师指点一下。卡在这个问题上好久了。谢谢
回复

使用道具 举报

ID:72781 发表于 2015-12-28 23:07 | 显示全部楼层
我简单看一下,很可能问题出在这一句 : run_flag=~run_flag;
“~”这个是按位取反,应该用“!”,是”非“的意思。按位取反,也就是如果你给的初值是1,2进制的数就是00000001,按位取反后就是11111110,在if中中还是第二种情况成立。
还有一点:你的两种情况的流水等用的都是同一个全局变量“i”,如果第二种灯的i运行到i=7的时候,产生中断,执行第一只种灯,这时候传递到led_light1[i++]这个数组的就是8。就会超过这个数组的范围,而你下面的  if(i==4) i=0;也不能把他变为0,所一两种改法:1、改成if(i>=4) i=0;并且放在刚进入那个IF的里面,第二中用两个变量。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:58502 发表于 2015-12-29 22:52 来自手机 | 显示全部楼层
楼上的说得不对,!通常是用于判断用的,而不是赋值用,他的程序问题出现在sbit run_flag=P3^2;这里,这个是位定义,也就是说把p3.2这个引脚命名为run_flag,所以run_flag就跟P3.2的状态有关了,而不是跟程序有关,正确的写法是改成 bit run_flag;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表