/************************************************************/
/* Huomiovilkku-ohjelma                           HVILKKU.C */
/* vilkun LEDit on kytketty mikro-ohjaimen porttiin P1      */
/* 9.1.2000   J.Koskinen  Tietomyrsky Oy                    */
/************************************************************/

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

#define   OIK   0
#define   VAS   1

#define   SLEEP (PCON |= 0x01)    // nukuta prosessori


/***********************************************************/
/* Timer 0:n keskeytyspalveluohjelma                       */
/***********************************************************/
INTERRUPT(_TF0_) timerint0()
{
                          // ei tehdä mitään, herätään vain
}


/************************************************************/
/* timer_init alustaa timer0-keskeytyksen		  							*/
/************************************************************/
timer_init()
{
  TMOD &= 0xF0;      				        
  TMOD |= 0x00;           // Mode 0 = 13-bittinen toimintatila
  TH0 = TL0 = 0;          // 0...8192	 (1,3 ms @ 1,843 MHz)																			
  setbit(TCON.4);         // timer 0 käyntiin
  enable();
}                                 


/************************************************************/
/* Pääohjelma                                               */
/************************************************************/
void main(void)
{
  unsigned char luku;     // P1-porttiin tulostettava kuvio
  unsigned char suunta;   // 0 = oik. 1 = vas. 
    
  luku = 0x01;            // lähtään oieasta reunasta
  suunta = VAS;           // siirretään valoa vasemmalle
  
  timer_init();           // alusta ajastin 0

  while(1)
  {
    P1 = ~luku;           // LEDit palaa alatilassa (siksi ~)

    if(suunta == VAS)     // tutkitaan suunta
      luku <<= 1;         // siirretään kuviota vasemmalle
    else                  // tai
      luku >>= 1;         // oikealle
    
    if(!luku)             // ollaanko yli reunan?
    {
      if(suunta)
      {
        suunta = OIK;     // vaihdetaan suunta
        luku = 0x40;      // oikealle  
      }
      else
      {
        suunta = VAS;     // vaihdetaan suunta
        luku = 0x02;      // vasemmalle       
      } 
    }  
                          // nukutetaan mikro-ohjain 
	  setbit(IE.1);         // sallitaan timer 0 keskeytys
    SLEEP;                // mittauskierros kestää 8 ms
	  clrbit(IE.1);         // estä timer 0 keskeytys
  }   
}    

