Programación para 8051: instrucciones SFR como argumentos

1

Actualmente estoy haciendo un juego muy simple de Tic-Tac-Toe con un AT89C51RC2 y tengo problemas para obtener el botón de entrada correcto.

Básicamente, la entrada es una Matriz de botones 3x3 que quiero utilizar al escanear las filas con un pulso mientras se comprueban las columnas para una conexión; bastante básico Sin embargo, la forma en que quería hacer esto fue mediante la creación de un método único de scroll que recibió el parámetro de la fila y lo configuró en ALTO en consecuencia.

Ya tengo

sbit R1 = P1^0; 

todo a través de las entradas necesarias, pero no estoy seguro de si esto es correcto.

Luego, en mi método principal, ejecuto algo como

while(TRUE)
{
    scroll(R1);
}

que se llama scroll, tengo esto

void scroll (bit P)
{
   P = HIGH; //Sets the row being checked to HIGH (HIGH is already defined as a 1). Same goes with the aformentioned TRUE
   ...
}

Por lo tanto, esto no está funcionando. Sé que no estoy haciendo esto bien, pero tuve que empezar en alguna parte. ¿Es lo que estoy tratando de hacer posible? ¿Enviar una sola dirección de Pin como una sobrecarga para un método? Si es así, ¿qué tipo de datos debería ser? Estaba haciendo malabares entre Char y Bit pero no puedo conformarme.

Espero que mi pregunta sea comprensible! Si no, con mucho gusto elaboraré y tal vez publique todo el código (aunque es bastante desordenado). Gracias a todos, por adelantado!

    
pregunta BretonDP

1 respuesta

0

Editar: cambié el ejemplo de código para responder mucho mejor a tu pregunta

Nunca usé ese chip, pero parece una variante de 8 bits del 8051, por lo que haría la siguiente conjetura: su puerto se define como "sfr". Por lo general, el archivo de cabecera de MCU contiene definiciones como:

sfr P1=0x90;

Según la hoja de datos de su chip en la página 5, P1 está en la dirección 0x90. Eso significa que podrías escribir algo así:

unsigned char scroll(sbit pin);

int main(int argc,char** argv)
{
 sbit pinMap[3]={P0^6,P0^7,P1^0}; // P0.6, P0.7 and P1.0.
 char keyboardRows[3]; // Keyboard layout is: one row per byte.  Column are mapped on 0 to 2.
 int i;

 while(1)
 {
  for(i=0;i<3;++i)
  {
   scroll(pinMap[i]);
  }
 }

 return 0;
}

unsigned char scroll(sbit pin)
{
 unsigned char rowState;
 pin=1; // or HIGH.

 // Save your column state in rowState here.

 pin=0; // or LOW?

 return rowState;
}

Ahora, usted no dijo qué tipo de problema estaba teniendo. Necesitamos más información para ayudarte.

  1. ¿Es software o podría ser hardware? software

  2. ¿Qué tipo de error está obteniendo? Todavía no estoy seguro de que no funcione

  3. ¿No compila? Está bien.

  4. ¿No hace lo que espera ? Todavía no sé lo que obtienes en comparación con lo que esperas.

  5. ¿Es una matriz personalizada? Sí y funciona.

  6. Es así, ¿ha utilizado resistencias de activación para establecer un estado definido cuando no se presionan los botones? Está bien.

  7. ¿Tiene que poner diodo para evitar que aparezcan las teclas fantasma (al presionar varias teclas a la vez)? Está bien.

Edit: Ok, a tu compilador no le gusta sbit como parámetro, así que puedes intentar esto:

unsigned char scroll(unsigned char* port,unsigned char pin);

int main(int argc,char** argv)
{
 unsigned char* portAddr={&P0,&P1,&P2}; // Put whatever here.
 unsigned char pin[3]={0x40,0x80,0x01}; // P0.6, P0.7 and P1.0.
 char keyboardRows[3]; // Keyboard layout is: one row per byte.  Column are mapped on 0 to 2.
 int i;

 while(1)
 {
  for(i=0;i<3;++i)
  {
   scroll(portAddr[i],pinMap[i]);
  }
 }

 return 0;
}

unsigned char scroll(unsigned char* port,unsigned char pin)
{
 unsigned char rowState;
 *port|=pin; // Let the bus weak pull-up pull the bus up.

 // Save your column state in rowState here.

 *port&=~pin; // Drive low the output.

 return rowState;
}

Si realmente insiste en usar sbit y esas cosas, podría hacer una declaración global como esta:

sbit RowPins[3]={P0^6,P0^7,P1^0};

unsigned char scroll(int rowIndex);

int main(int argc,char** argv)
{
 char keyboardRows[3]; // Keyboard layout is: one row per byte.  Column are mapped on 0 to 2.
 int i;

 while(1)
 {
  for(i=0;i<3;++i)
  {
   scroll(i);
  }
 }

 return 0;
}

unsigned char scroll(int rowIndex)
{
 RowPins[i]=HIGH;

 // Read stuff here and put in "column".

 RowPins[i]=LOW;

 return column;
}
    
respondido por el Mishyoshi

Lea otras preguntas en las etiquetas