/************************************************************/
/* Pistematriisinäytön ohjaus               PISTE2.C        */
/*                                                          */
/* 15.2.2000   J.Koskinen  Tietomyrsky Oy                   */
/************************************************************/

#include <8051reg.h>
#include <8051bit.h>
#include <2051int.h>
#include <8051io.h>

#define   BUT1  (~P3 & 0x01)    // näppäinmäärittelyt
#define   BUT2  (~P3 & 0x02)
#define   BUT3  (~P3 & 0x04)
#define   BUT4  (~P3 & 0x08)

#define   ROW0  (P3 |= 0x00)
#define   ROW1  (P3 |= 0x10)
#define   ROW2  (P3 |= 0x20)
#define   ROW3  (P3 |= 0x30)
#define   ROW4  (P3 |= 0x80)
#define   ROW5  (P3 |= 0x90)
#define   ROW6  (P3 |= 0xA0)
#define   ROW7  (P3 |= 0xB0)


register unsigned char row;
register unsigned char dispmem[8];


/***********************************************************/
/* Timer 0:n keskeytyspalveluohjelma                       */
/***********************************************************/
INTERRUPT(_TF0_) timerint0()
{
  row++;                  // seuraava rivi
  row &= 0x07;            // varmista, että rivi on 0...7
  
  P1 = 0xFF;              // ensin pimeäksi
  P3 &= 0x0F;

  switch (row)            // aktivoi oikea rivi
  {
    case 0: ROW7;
            break;
    case 1: ROW6;
            break;
    case 2: ROW5;
            break;
    case 3: ROW4;
            break;
    case 4: ROW3;
            break;
    case 5: ROW2;
            break;
    case 6: ROW1;
            break;
    case 7: ROW0;
            break;
  }

  P1 = dispmem[row];      // laita rivin tieto näyttöön

  TH0 = 0xF8;             // lyhennetään keskeytysväliä
}



/************************************************************/
/* timer_init alustaa timer0-keskeytyksen		  							*/
/************************************************************/
timer_init()
{
  TMOD &= 0xF0;      				        
  TMOD |= 0x01;           // Mode 1 = 16-bittinen toimintatila
  setbit(TCON.4);         // timer 0 käyntiin
  IE |= 0x02;             // sallitaan Timer0-keskeytys
  enable();               // keskeytykset ovat mahdollisia
  row = 0;
}                                 


/************************************************************/
/* clrdot sammuttaa LEDin pisteessä x, y                    */
/************************************************************/
void clrdot(unsigned char x, unsigned char y)
{
  dispmem[y] |= 0x80 >> x;
}


/************************************************************/
/* setdot sytyttää LEDin pisteessä x, y                     */
/************************************************************/
void setdot(unsigned char x, unsigned char y)
{
  dispmem[y] &= ~(0x80 >> x);
}


/************************************************************/
/* clr tyhentää näytön (sammuttaa kaikki LEDit)             */
/************************************************************/
void clr(void)
{
  unsigned char i;
  
  for(i=0; i<8; i++)
    dispmem[i] = 0xFF;
}




/************************************************************/
/* Pääohjelma                                               */
/************************************************************/
void main(void)
{
  unsigned char i, j;
 
  timer_init();           // alusta ajastin 0

  clr();                  // sammuta kaikki LEDit

  while(1)
  {   
    i = TL0%8;
    j = TL0%8;
    setdot(i, j);         // sytytä satunnainen LED
    i = TL0%8;
    j = TL0%8;
    clrdot(i, j);         // sammuta satunnainen LED

    if (BUT4)             // jos BUT1-näppäintä painetaan 
    {
      P3 = 0xFF;          // jostain kumman syystä ???
      clr();              // tyhjennetään koko näyttö
    }

    delay(50);
  }   
}   
 

