佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1344|回复: 24

latching 和state control 里的 looping 问题

[复制链接]
发表于 13-8-2009 08:59 AM | 显示全部楼层 |阅读模式
各位大大,小弟我又有一个简单的问题解决不到,希望各位能够帮帮我。
我想了几天,但还是想不到解决方法。

我想要弄一个程式,用push button (Pin C0)来让它前进。我是用latching state control 的方法。

(1) 按第一次,LED1 (Pin B1)会亮(HIGH)LED2 (Pin B2) 会灭 (LOW),然后倒反,LED2 (Pin B2)
会亮(HIGH)LED1 (Pin B1) 会灭 (LOW)不断的重复直到再按多一次push button

(2) 按第二次LED1 (Pin B1)LED2 (Pin B2) 都会灭 (LOW)。然后再按 push button 的话就重复回(1)


我只能弄到(1) 的不能重复,直接停在那,等到的二次的push button

我的程式如下:


////////////////////////////////////////////////////////////////////////////////
//OUTPUT//
//PIN B1 = LED1
//PIN B2 = LED2
//INPUT//
//PIN C0 = Push Button (Active LOW)
////////////////////////////////////////////////////////////////////////////////


#include <16f876a.h> //Accepts 16f876a.h files and decrypt them asthey are read
#fuses hs,nowdt,noprotect,brownout,nolvp
//preprocessor directive that defines the fuses
#use delay(clock=20000000)
//Setups clock as 20.00 MHz
#byte PORTB=6
//Define PORT Baddress
#byte PORTC=7
//Define PORT Caddress

int status;

void LED1()

{


output_low(pin_b2); //LED2 LOW

output_high(pin_b1); //LED1 HIGH

}


void LED2()

{

output_low(pin_b1); //LED1 LOW

output_high(pin_b2); //LED2 HIGH

}



void main()
{


int status=0, status1=0;



set_tris_b(0x00); //Set all port B as output

set_tris_c(0x01); //Set port C0 as input



PORTB=0; //Initial value PORTB=0

PORTC=0; //Initial value PORTC=0



do

{


if(input(pin_c0)==0&&status1==0)  //If push buttonis pressed,


{

if(status==0)

{

LED1(); //Call LED1() function
                                                                   这边需要重复
LED2(); //Call LED2() function   

status=1;  //proceed to next state


}

else if(status==1)
{

output_low(pin_b2); //LED2 LOW

output_low(pin_b1); //LED1 LOW

status=0;  //Return to first state

}

status1=1; //End the program of first push button pressed
}

else if(input(pin_c0)==1&&status1==1)   //If push button is released,

{
status1=0;  //Enable the program back to firststate
delay_ms(100);

}

}while(1);
}

请问各位大大能帮助我吗?谢谢大家。。。

[ 本帖最后由 Ha_He_Hi_Ho_Hu 于 13-8-2009 09:05 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 13-8-2009 05:17 PM | 显示全部楼层

回复 1# Ha_He_Hi_Ho_Hu 的帖子

我是用keil 来写的,我没看你的因为懒得看, 看一看我的吧:
#include<reg52.h>
#define RUN 1
#define        STOP 0
void Delay2 ();
unsigned int counter=0;
sbit button = P0^0;
sbit led1 = P0^1; //  led turn on when 1 and turn off when 0
sbit led2 = P0^2;

void main (void)
{
        button = 1;// active low
        led1 = 0; // Initialy turn off led
        led2 = 0;
        counter = 0;
        while(1)
        {
                if ( button == 1)
                {
                        counter ++;
                }
                if ( counter == 1)
                {
                        led1 = 1;
                        led2 = 0;
                        Delay2 ();
                        led1 = 0;
                        led2 = 1;       
                        Delay2 ();
                }
                if ( counter == 2)
                {
                        led1 = 0;
                        led2 = 0;
                        counter = 0;
                }


        }
}

void Delay2 ()
{
        unsigned int i;
        TMOD = 0x01;
        TH0 = 0xE7;
        TL0 = 0x00;
        IE = 0x82;
        IP = 0x04;
        TR0 = RUN;
        for (i = 1; i <= 2000; i++)
        {
      TH0 = 0xFC;
      TL0 = 0x18;
      TR0 = 1;

      while (!TF0);
      TF0 = 0;
      TR0 = 0;
   }
}

评分

参与人数 1积分 +100 收起 理由
fritlizt + 100

查看全部评分

回复

使用道具 举报

发表于 13-8-2009 05:20 PM | 显示全部楼层

回复 1# Ha_He_Hi_Ho_Hu 的帖子

idea 就是分几个state depends on counter...
if button pressed then moves forward to another state.
if counter reach the last state then reset the counter.
了解吧?
回复

使用道具 举报

发表于 13-8-2009 05:48 PM | 显示全部楼层

回复 1# Ha_He_Hi_Ho_Hu 的帖子

你的code 有问题。。。

LED1(); //Call LED1() function
                                                                   这边需要重复
LED2(); //Call LED2() function   

led1() 和led2 ()中间要有delay 不然的话太快了

[ 本帖最后由 本弘 于 13-8-2009 05:50 PM 编辑 ]
回复

使用道具 举报

发表于 13-8-2009 05:56 PM | 显示全部楼层

回复 2# 本弘 的帖子

if(input(pin_c0)==0&&status1==0)  //If push buttonis pressed,

其实不需要这样写,分开会比较好。而且button 和state 分开的话会比较好认。

用一个status 就好, 用那么多干身么??status 是可以在if (status == XX)里面在set value 的。
回复

使用道具 举报

发表于 13-8-2009 10:47 PM | 显示全部楼层
原帖由 本弘 于 13-8-2009 05:17 PM 发表
我是用keil 来写的,我没看你的因为懒得看, 看一看我的吧:
#include
#define RUN 1
#define        STOP 0
void Delay2 ();
unsigned int counter=0;
sbit button = P0^0;
sbit led1 = P0^1; //  led turn on whe ...


不错。 idea是在那边。 不过你的program有一点点bug.
我simulate了。。。。。只能闪烁, 按button没反应。
我想是delay那边出了问题吧。。。。当你delay2的时候, 你是在loop 2000次。 在这个period里, 没有check button.
所以, 闪烁一次, 用4s........这个4s里, 按button是没反应的。。。
而且, 由于你的button是active low.,所以要用button来switch state,应该是 if (button == 0)?
个人认为你的program还可以再改善一点, 加油
回复

使用道具 举报

Follow Us
发表于 13-8-2009 10:52 PM | 显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 13-8-2009 08:59 AM 发表
各位大大,小弟我又有一个简单的问题解决不到,希望各位能够帮帮我。
我想了几天,但还是想不到解决方法。

我想要弄一个程式,用push button (Pin C0)来让它前进。我是用latching 和state control 的方法。

...


楼主, 你先写一个program可以一直重复10,01,10,01,10,01.
然后再给你tips.
回复

使用道具 举报

发表于 14-8-2009 02:45 AM | 显示全部楼层

回复 6# fritlizt 的帖子

lol... 都没有用interrupt 还要求led blinking 时的反应。。。

[ 本帖最后由 本弘 于 14-8-2009 02:46 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 14-8-2009 02:48 AM | 显示全部楼层
原帖由 fritlizt 于 13-8-2009 10:47 PM 发表


不错。 idea是在那边。 不过你的program有一点点bug.
我simulate了。。。。。只能闪烁, 按button没反应。
我想是delay那边出了问题吧。。。。当你delay2的时候, 你是在loop 2000次。 在这个period里, 没有c ...

对, button 是 0.写错了。。。
回复

使用道具 举报

发表于 14-8-2009 02:57 AM | 显示全部楼层

回复 9# 本弘 的帖子

应该ok 了:
#include<reg52.h>
#define RUN 1
#define        STOP 0
void Delay2 ();
unsigned int counter=0;
sbit button = P0^0;
sbit led1 = P0^1; //  led turn on when 1 and turn off when 0
sbit led2 = P0^2;


void main (void)
{
        led1 = 0; // Initialy turn off led
        led2 = 0;
        button = 1;// active low
        T2CON = 0x00;
        RCAP2H = 0xF8;        // 1 milisec        F8CD
        RCAP2L = 0xCD;
        IE = 0xA0;                // Timer 2 interrupt enabled
        TR2 = 1;                // Turn on Timer 2
        while(1)
        {
                if ( button == 0)
                {
                        counter ++;
                }
        }
}
void Timer2 (void) interrupt 5 using 1
{
        if ( counter == 1)
        {
                led1 = 1;
                led2 = 0;
                Delay2 ();
                led1 = 0;
                led2 = 1;       
                Delay2 ();
        }
        if ( counter == 2)
        {
                led1 = 0;
                led2 = 0;
                counter = 0;
        }
        TF2 = 0;
}
void Delay2 ()
{
        unsigned int i;
        TMOD = 0x01;
        TH0 = 0xE7;
        TL0 = 0x00;
        IE = 0x82;
        IP = 0x04;
        TR0 = RUN;
        for (i = 1; i <= 2000; i++)
        {
      TH0 = 0xFC;
      TL0 = 0x18;
      TR0 = 1;

      while (!TF0);
      TF0 = 0;
      TR0 = 0;
   }
}
回复

使用道具 举报

发表于 14-8-2009 03:01 AM | 显示全部楼层
原帖由 本弘 于 14-8-2009 02:57 AM 发表
应该ok 了:
#include
#define RUN 1
#define        STOP 0
void Delay2 ();
unsigned int counter=0;
sbit button = P0^0;
sbit led1 = P0^1; //  led turn on when 1 and turn off when 0
sbit led2 = P0^2;

...


用timer interrupt 2 来check 每 1ms 可以了吧。。。
回复

使用道具 举报

发表于 14-8-2009 03:04 AM | 显示全部楼层

回复 11# 本弘 的帖子

delay 时间set 0.5 second 的话应该是ok 了。。。
回复

使用道具 举报

发表于 14-8-2009 09:51 AM | 显示全部楼层
原帖由 本弘 于 14-8-2009 03:04 AM 发表
delay 时间set 0.5 second 的话应该是ok 了。。。

button 都不用debounce 的吗?
回复

使用道具 举报

发表于 14-8-2009 10:00 AM | 显示全部楼层
原帖由 pic 于 14-8-2009 09:51 AM 发表

button 都不用debounce 的吗?

请问 可以放 cap做hardware debounce 的吗?
回复

使用道具 举报

发表于 14-8-2009 11:22 AM | 显示全部楼层
Err... 我想 pic 大大的意思不是 debounce 吧。他的意思应该是我们必须等 user release button,然后才 counter ++。好像这样:

if ( button == 0) {
    while (button == 0);
    counter ++;
}
回复

使用道具 举报

 楼主| 发表于 14-8-2009 11:23 AM | 显示全部楼层
不好意思。。。现在才回复大家。

原帖由 本弘 于 13-8-2009 05:17 PM 发表
我是用keil 来写的,我没看你的因为懒得看, 看一看我的吧:
#include
#define RUN 1
#define        STOP 0
void Delay2 ();
unsigned int counter=0;
sbit button = P0^0;
sbit led1 = P0^1; //  led turn on whe ...


嗯。。。我会好好研究下的。但我不会interupt。。。要学下了。

原帖由 本弘 于 13-8-2009 05:48 PM 发表
你的code 有问题。。。

LED1(); //Call LED1() function
                                                                   这边需要重复
LED2(); //Call LED2() function   

led1() 和led2 ()中间要有d ...


嗯。我也发现到了。谢谢你的提醒。

原帖由 本弘 于 13-8-2009 05:56 PM 发表
if(input(pin_c0)==0&&status1==0)  //If push buttonis pressed,

其实不需要这样写,分开会比较好。而且button 和state 分开的话会比较好认。

用一个status 就好, 用那么多干身么??status 是可以在if (sta ...


我只是想到酱来debounce button哦。。。


原帖由 fritlizt 于 13-8-2009 10:52 PM 发表


楼主, 你先写一个program可以一直重复10,01,10,01,10,01.
然后再给你tips.



你的意思是酱吗?:

while(1)
{
       output_low(pin_b2); //LED2 LOW
      output_high(pin_b1); //LED1 HIGH
       delay_ms(500);
      
       output_low(pin_b1); //LED1 LOW
      output_high(pin_b2); //LED2 HIGH
       delay_ms(500);
}
回复

使用道具 举报


ADVERTISEMENT

发表于 14-8-2009 12:21 PM | 显示全部楼层

回复 13# pic 的帖子

我没有写debounce 的。。。原来那个是debounce 的。。。
回复

使用道具 举报

发表于 14-8-2009 12:24 PM | 显示全部楼层
原帖由 waiweng83 于 14-8-2009 11:22 AM 发表
Err... 我想 pic 大大的意思不是 debounce 吧。他的意思应该是我们必须等 user release button,然后才 counter ++。好像这样:

if ( button == 0) {
    while (button == 0);
    counter ++;
}


这个加进去就对了。。。lol
回复

使用道具 举报

发表于 14-8-2009 03:31 PM | 显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 14-8-2009 11:23 AM 发表
不好意思。。。现在才回复大家。



嗯。。。我会好好研究下的。但我不会interupt。。。要学下了。



嗯。我也发现到了。谢谢你的提醒。



我只是想到酱来debounce button哦。。。





你的意思 ...


对。 你现在用interrupt做, 不要用delay.看做到吗。
10ms interrupt一次。
然后check 如果overflow 50次, 就toogle led.
回复

使用道具 举报

发表于 14-8-2009 03:56 PM | 显示全部楼层

回复 19# fritlizt 的帖子

aiya...hint是:在timer interrupt 那里set tick ...每interrupt 一次就tick++...
在check tick 的condition...if (tick ==50)then continue else perform nothing.
这个是将interrupt 变成timer 和interrupt 的2 in 1 用法。试试看吧.
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 20-4-2024 11:22 PM , Processed in 0.074076 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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