一段令我费解好几天的PIC单片机程序,大家帮帮我啊~~~

[复制链接]
3773|14
 楼主| jiangxu87 发表于 2008-9-9 18:52 | 显示全部楼层 |阅读模式
#include <pic.h>
#include <pic1687x.h>
int i=1;
void main(void)
{while(1)
{if(PC1==0)
  {i++;
    if(i=4)
        {i=1;}
}
if(i==1)
{第一盏灯亮;}
if(i==2)
{第二盏灯亮;}
if(i==3)
{第三盏灯亮;}
}
}
灯和相关的管脚相连,具体程序不写了,也就是对应管脚的电平控制。PC1和按钮相连,按钮按下i加一,第一盏灯灭第二个灯亮,再按第二个灯灭第三个亮,这是这个程序想表达的,但是当第二个灯灭亮了以后不按按钮,过一会第一个灯就自己亮了,也就是i自己又变为1了,这是为什么呀,请各位赐教
 楼主| jiangxu87 发表于 2008-9-9 19:16 | 显示全部楼层

求救

没人看看吗?郁闷啊!!!
nigerboy 发表于 2008-9-9 21:23 | 显示全部楼层

{i++;
    if(i=4)
        {i=1;}这里有问题呀,i=4后就又直接将1赋i,所以第一个灯就亮了
zhaoyu2005 发表于 2008-9-10 08:56 | 显示全部楼层

LZ的输入接的哪个引脚?

加上拉没?还有就是你的程序缺少了按键去抖及释放检测
fsaok 发表于 2008-9-10 09:37 | 显示全部楼层

if (i == 4)

jode 发表于 2008-9-10 10:04 | 显示全部楼层

000

#include <pic.h>
#include <pic1687x.h>
int i=0;
void main(void)
{while(1)
{if(PC1==0)
  {++i;
    if(i==4)
        {i=0;}
}
if(i==1)
{第一盏灯亮;}
if(i==2)
{第二盏灯亮;}
if(i==3)
{第三盏灯亮;}
}
}
xwj 发表于 2008-9-10 10:07 | 显示全部楼层

要学会细心、学会用else if

chen_zn 发表于 2008-9-10 14:01 | 显示全部楼层

有同感

类似if(i=4)的问题我也碰到过,所以这种语句我都是这么写的:

if(4==i)

就算是写成if(4=i)编译器应该就自动报警了。

zidaozhou 发表于 2008-9-10 20:46 | 显示全部楼层

还有一个问题

除了以上讨论的问题之外,还有一个问题。
程序这样写的话,不同的人按键的反应是不同的,因为有的人按键时间长一点,有的人按键时间短一点。按键时间短的按一下加1,按键时间长的按一下可能加2或者3甚至是N,如果长按的话就成了流水灯了。
1248 发表于 2008-9-10 21:19 | 显示全部楼层

因为你的程序只是简单判断PC1==0

在死循环里面,只要PC1==0就会改变i的值,i的值改变了相应的灯也会亮。只要按键不松开,PC1就会一直为0,i的值就会不断改变,当然就成流水灯了。
ztzer 发表于 2008-9-11 14:45 | 显示全部楼层

同意4楼,

要加去抖
dcp 发表于 2008-9-11 14:51 | 显示全部楼层

要学会“对码”编程,写一对编译一次,运行睇睇结果

平川id 发表于 2008-9-11 22:24 | 显示全部楼层

碰到这样的问题在编译器里一步一步调试,应该就可以解决

hotpower 发表于 2008-9-11 22:30 | 显示全部楼层

看不明白,while(1)后的程序能运行????

54cards1 发表于 2008-9-12 12:25 | 显示全部楼层

嗯嗯

if(i=4)
        {i=1;}
改为if(i==4)
        {i=1;}

不然这个程序的第三个灯永远都不会亮的 if的条件中永远为真i=1的表达式每次都会执行,由于第二次来到这个位置的时候i++已经执行了一次 所以i 是可以等于2的 然后立即被复制为1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部