[C/µC] Problem mit Ports

yourhighness

Lt. Junior Grade
Registriert
Feb. 2006
Beiträge
297
hallo!

ich stehe gerade vor einen blöden problem. also auf P0 hängt eine 7-segment-anzeigen und gesteuert wird das ganze über P3 mittels den 8 schaltern, die betätigt werden können.

das ganze soll so funktionieren: binärcode der zahlen mit den schaltern bilden und die zahl soll dann ausgegeben werden (auf der 7-segment-anzeige). zbsp: letzte und vorletzte schalter gekippt (0000 0011) für die zahl 3 usw...
die abbruchbedingung is das kippen des erstesn schalters (1000 0000)

kann jemand einen fehler entdecken? es funktioniert nämlich nicht, also beim umlegen eines schalters passiert nichts... :(

bitte helft mir!


PHP:
#include <REG51F.H>

#define OFF 0x00
#define ON  0xFF


int a,x,dummy,i,d=10000,b=0;
unsigned char count;



void delay(int k);          /* Prototyp der Unterprogramms delay */
void init(void);


/*******************************************************************************************/
void main(void)
{
  	
  init();
  i=0; 
  do
  {	  
		switch(P3) {
		case 0x00:P0=~0x3F;break;
		case 0x01:P0=~0x06;break;
		case 0x02:P0=~0x5B;break;
		case 0x03:P0=~0x4F;break;
		case 0x04:P0=~0x66;break;
		case 0x05:P0=~0x6D;break;
		case 0x06:P0=~0x7D;break;
		case 0x07:P0=~0x70;break;
		case 0x08:P0=~0x7F;break;
		case 0x09:P0=~0x6F;break;
		default: P0=~0x3F;break;
		}
	delay(1000);
	 
  }
  while(((P3&0x80)==0x80));						/* Programm - Ende */

  EA = 0;						// Intr aus, stilles warten
  while(1);						// zum Auffangen

}


/*******************************************************************************************/
void delay(int k)
{
  int j,x;
  for(j=0;j<k;j++)
    {
     for(x=0;x<20;x++)
        dummy++;
    }
}


void init(void)
{
  P1 = 0x00;
  count = 0;
  P2 = OFF;
 // P3 = 0x00;
}


danke & grüße!
 
Normal sollte man die Ports auf I/O schalten koennen. Welcher uC ist es denn?

Schau mal in der Docu nach DDR (Data Direction Register) oder oft auch PDR(Port Data Register) genannt.

Ansonsten kann ich ohne Hardware nicht sehen ob der Code so richtig ist. Schonmal nen Oszi an den Port geschaltet?

Grus
 
Zuletzt bearbeitet:
Ich weiß ja nicht, ob das so gedacht ist, aber das programm wird nur so lange laufen wie der 8. Schalter "an" ist. Achso und das == 0x80 kannste dir sparen, weil alles größer 0 true ist.
 
danke schon mal für die antworten!

also, es ist ein 80C51. und die abbuchbedingung ist gewollt ;)

wie schalte ich die ports auf I/O?
 
Also ich hab das Datenblatt jetzt mal schnell überflogen. Wenn ich es richtig sehe, muss man keine Direction Register setzen. Hast du die Abbruchbedingung und/oder Abfragewerte schon mal invertiert? Vielleicht ist der Port auf active low bzw. active high geschaltet.
 
Zurück
Oben