[APL] Vidéo avec Arduino, afficher sur moniteur

#define _SYNC 0x00
#define _BLACK  0x01
#define _GRAY  0x02
#define _WHITE  0x03

#define _LONG_SYNC 19
#define _SHORT_SYNC 2
#define _LONG_SYNC_DELAI 2
#define _SHORT_SYNC_DELAI 30

#define _NB_PIXELS 29
#define _NB_LIGNES 19

#define _COMPENS_BOUCLE 7
#define _COMPENS_IF_SERIAL 17

byte memVideo[_NB_PIXELS][_NB_LIGNES];
byte index, index2;
byte shift;

void SPI_MasterInit(void)
{
  /* Set MOSI and SCK output, all others input */
  DDRD = (1<<DDB0)|(1<<DDB1);
  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}


void setup()
{
  pinMode (8, OUTPUT);
  pinMode (9, OUTPUT);
  digitalWrite (8, HIGH);
  digitalWrite (9, HIGH);
//  SPI_MasterInit();
  Serial.begin(19200);
  Serial.print ("GO");
  Serial.print (13, BYTE);
  
  for (index2 = 0; index2 < _NB_LIGNES; index2++)
     for (index = 0; index < _NB_PIXELS; index++)
       memVideo[index][index2] = _BLACK;
       /*memVideo[index][index2] = (index + index2) % 3 + 1;*/
       
  memVideo[0][0] = _WHITE;
}

int ligne;
char c;
int cx=0, cy=0;
byte couleur = _BLACK;

void loop()
{
  // SYNC VERT A
  
  // ligne 1 LONG SYNC
  PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
  PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
  PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);
  
  // ligne 2 LONG SYNC
  PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
  PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
  PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);
  
  // ligne 3 MIXTE SYNC
  PORTB = _SYNC; delayMicroseconds(_LONG_SYNC);
  PORTB = _BLACK; delayMicroseconds(_LONG_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);
  
  // ligne 4 SHORT SYNC
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

  // ligne 5 SHORT SYNC
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI-_COMPENS_BOUCLE);
  
  // IMAGE
   
  for (ligne = 0; ligne < 304; ligne++)
  {
    //** synchro

    // HSync
    PORTB = _SYNC;
    delayMicroseconds(4);
    
    // Black
    PORTB = _BLACK;
    delayMicroseconds(4);
    
    //** image ligne 52 uS
    
    for (index = 0; index < _NB_PIXELS; index++)
    {
      PORTB = memVideo[index][ligne>>4];
      PORTB = PORTB;
      PORTB = PORTB;
    }
        
    delayMicroseconds(2); // 4 uS
    
    PORTB = _BLACK;
    PORTB = _BLACK;
    PORTB = _BLACK;
    PORTB = _BLACK;
    PORTB = _BLACK;
    
    PORTB = _BLACK;
    PORTB = _BLACK;
    PORTB = _BLACK;
    PORTB = _BLACK;

  }

  // SYNC VERT B
  
  // ligne 310 LONG SYNC
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);

  // ligne 311 SHORT SYNC
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);
  
  // ligne 312 SHORT SYNC
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI);
  
  PORTB = _SYNC; delayMicroseconds(_SHORT_SYNC);
  PORTB = _BLACK; delayMicroseconds(_SHORT_SYNC_DELAI-_COMPENS_BOUCLE-_COMPENS_IF_SERIAL);
  
  if (Serial.available())
  {
    c = Serial.read ();
    switch (c)
    {
      case '4' : if (cx>0) cx--; break;
      case '6' : if (cx<29) cx++; break;
      case '8' : if (cy>0) cy--; break;
      case '2' : if (cy<18) cy++; break;
      case '5' : memVideo[cx][cy] = couleur; break;
      case 'n' : couleur = _BLACK; break;
      case 'g' : couleur = _GRAY; break;
      case 'b' : couleur = _WHITE; break;
    }
  }


}