logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak poprawić kod w C++ dla 8051, by dioda migała po naciśnięciu przycisku?

cristof_w 30 Cze 2007 10:04 1605 3
REKLAMA
  • #1 4035000
    cristof_w
    Poziom 17  
    Posty: 338
    Pomógł: 3
    Ocena: 9
    Witam.
    Mam napisany w C++ działający progam, który realizuje:
    wciskam przycisk 1 dioda świeci
    wciskam przycisk 2 dioda nie świeci
    wciskam przycisk 3 didoa mruga sobie
    wciskam przycisk 4 dioda przestaje mrugać(nie świeci)

    Program działa, jednkaże chciałem go zrealizować w inny sposób, przerobić (ale ma robić dokładnie to samo) tylko, ze kod ma być inny i nie chce działać mruganie (reakcja na przycisk 1 i 2 działa, na 3 i 4 czyli mruganie, nie działa).
    na pierwszym listingu jest program działający, na drugim program, który nie działa.

     #include <8051.h> // kwarc 6 MHz srodowisko M-IDE programator ISPPROG
    #include <stdio.h>
    
    #define PrzyciskON1  P2_0	//przycisk 1	
    #define PrzyciskOFF1   P2_1	//przycisk 2
    #define PrzyciskON2   P2_2	//przycisk 3
    #define PrzyciskOFF2   P2_3	//przycisk 4
    #define PortLED  P2_5 //wyjscie diody 
    
    bit MIGANIE;
    bit ZAPALENIE;
    //Dwa przyciski, dioda mruga
    //dioda świeci ciągle
    //Funkcja Delay prawidłowa
    //pętla wykonywana jest time razy
    void Delay (unsigned int time)//funkcja delay(opoznienie)
    {
    	unsigned int j;
    	{
    			while (time >=1)
    			{
    			for (j=0; j<5; j++) //50 oznacza 5 sekund, 50*0.01
    				{
    				TH1 = 0xC350;
    				TL1 = 0;
    				TR1 = 1;
    				while (!TF1);
    	
    				TF1 = 0;
    				}
    				TR1 = 0;
    			time--;
    			}
    	}
    }
    
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void main(void) //program glowny
    
    {
    	TMOD = 0x10;
    	while(1)
    	{
    		
    				
        if(!PrzyciskON1){MIGANIE=1;} //włączenie migania 
        if(!PrzyciskOFF1){MIGANIE=0;}//wyłączenie migania 
        if(!PrzyciskON2){ZAPALENIE=1;}//zapelenie ciągłe diody 
        if(!PrzyciskOFF2){ZAPALENIE=0;}//gaszenie zapalonej ciągle diody 
      
        if(MIGANIE&&!ZAPALENIE){PortLED=0;Delay(1);PortLED=1;Delay(1);} //jesli jest miganie i nie ma zapalenia to migaj 
        else {Delay(0.4);}//opóźnienie dla klawiszy jak dioda nie miga 
        if(ZAPALENIE){PortLED=0;} 
        else {PortLED=1;} 
    
    


    #include <8051.h>
    #include <stdio.h>
    
    #define PrzyciskON1  P2_0	//przycisk 1	
    #define PrzyciskOFF1   P2_1	//przycisk 2
    #define PrzyciskON2   P2_2	//przycisk 3
    #define PrzyciskOFF2   P2_3	//przycisk 4
    #define PortLED  P2_5 //wyjscie diody 
    
    //Program dwa przyciski
    //Zapalenie/gaszenie diody jedna para przyciskow
    //Zapalenie/gaszenie diody druga para przyciskow
    bit ZAPALENIE;
    bit MIGANIE;
    
    void Delay(unsigned int time)
    	{
    	unsigned int j;
    	while (time >=1)
    	{
    	for (j=0;j<20;j++);
    	time--;
    	}
    	}
    
    void KeyPressed (void)	
    {					
    {ZAPALENIE=1;}
    if(ZAPALENIE){PortLED=0;} 
        
    }
    
    void KeyNotPressed(void)	
    {			
    {ZAPALENIE=0;}
    if(!ZAPALENIE){PortLED=1;}
    }
    
    void KeyPressed2(void)	
    {				
    {MIGANIE=1;}
    if(MIGANIE){PortLED=0;Delay(1);PortLED=1;Delay(1);}
    }
    
    void KeyNotPressed2(void)
    {				
    {MIGANIE=0;} 
    if(MIGANIE){PortLED=1;}
    }
    
    
    void main(void)
    {
    	while(1)
    	{
    		if (!PrzyciskON1)
    		{	
    			Delay(20);
    			if (!PrzyciskON1)
    			{
    				KeyPressed();
    				 
    			}				
    		}
    		
    		if (!PrzyciskOFF1)
    		{	
    			Delay(20);
    			if (!PrzyciskOFF1)
    			{
    				KeyNotPressed();
    				
    			}				
    		}
    		
    		
    		
    		if (!PrzyciskON2)
    		{	
    			Delay(20);
    			if (!PrzyciskON2)
    			{
    				KeyPressed2();				 
    			}				
    		}
    		
    		if (!PrzyciskOFF2)
    		{	
    			Delay(20);
    			if (!PrzyciskOFF2)
    			{
    				KeyNotPressed2(); 
    			}				
    		}
    		
    		
    		
    	}
    }
    
     


    Może wiecie w czym tkwi problem?
    Pozrdawiam.
  • REKLAMA
  • #2 4037448
    Booby
    Poziom 14  
    Posty: 159
    Pomógł: 14
    Ocena: 4
    Zacznij od tego, że w funkcji KeyNotPressed2
    powinno być chyba tak:
    if(!MIGANIE){PortLED=1;}
    zamiast
    if(MIGANIE){PortLED=1;}
  • REKLAMA
  • #3 4037716
    cristof_w
    Poziom 17  
    Posty: 338
    Pomógł: 3
    Ocena: 9
    Niestety nic to nie zmieniło.
    Cały czas nie ma możliwości włączania mrugania diody, zatem tymbardziej nie idze sprawdzć, czy zadziała wyłączenie.
    Pozdrawiam.
  • #4 4037910
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    cristof_w napisał:
    Niestety nic to nie zmieniło.
    Cały czas nie ma możliwości włączania mrugania diody, zatem tymbardziej nie idze sprawdzć, czy zadziała wyłączenie.
    Pozdrawiam.

    Twoja LED-ka będzie mrugać tylko wtedy , kiedy wciśniesz klawisz PrzyciskON2 , a kiedy go puścisz "umiera" :( Tak po prostu napisałeś program.Poza tym , Twój kod jest - jakby tu powiedzieć , mocno niekompletny :( Co ma się stać , jak w 1-szej kolejności wciśniesz PrzyciskON1 , a potem PrzyciskON2 :?: Dioda ma mrugać , czy świecić ciągle :?: Albo po wciśnięciu PrzyciskON1 , PrzyciskON2 i PrzyciskOFF1 , dioda ma się wyłączyć , czy mrugać , itd. :?: Powinieneś przewidzieć w programie wszystkie możliwości/kombinacje , bo każdy dobry program , powinien/musi być "idiotoodporny" ;)
    Przemyśl jeszcze raz algorytm działanie programu i zastanów się , czy nie lepiej wykorzystać przerwanie jednego z liczników , do sterowania LED-ką .

    Piotrek
REKLAMA