Zegarek naręczny z wyświetlaczem binarno-widmowym - listingi, wykaz elementów

Powrót do artykułu Zegarek naręczny z wyświetlaczem binarno-widmowym z EdW 7/2011

Listing 1

#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\sleep.h>
#include <util\delay.h

// Definicje wyprowadzeń portu C
#define H01 0
#define H02 1
#define H04 2
#define H08 3

// Definicje wyprowadzeń portu D
#define KEY 2

#define M32 1
#define M16 3
#define M08 4
#define M04 5
#define M02 7
#define M01 6

// typ czas
typedef struct
{
  uint8_t Sec;
  uint8_t Min;
  uint8_t Hour;
} Time;

// czas
volatile Time g_CurrTime;

// wyczyść wyświetlacz
void ClearDisplay(void)
{
  PORTC = _BV(H01) | _BV(H02) | _BV(H04) | _BV(H08);
  PORTD = _BV(M01) | _BV(M02) | _BV(M04) | _BV(M08) |
      _BV(M16) | _BV(M32) | _BV(KEY);
}

//funkcja main
int main(void)
{
  //konfiguracja portów - wyjść
  DDRC = _BV(H01) | _BV(H02) | _BV(H04) | _BV(H08);
  DDRD = _BV(M01) | _BV(M02) | _BV(M04) | _BV(M08) | _BV(M16) | _BV(M32);

  //wyłączenie komparatora analogowego (oszczędność prądu)
  ACSR = _BV(ACD);

  //ustawienie timera 2 do obsługi zliczania czasu z zewnętrznego kwarcu w trybie asynchronicznym
  TIMSK = _BV(TOIE2);      //Obsługa T/C Overflow Interrupt Enable
  ASSR = _BV(AS2);
  TCNT2 = 0x00;
  TCCR2 = _BV(CS22) | _BV(CS21); //prescaler/256 -2sek

  //umożliwienie usypiania
  MCUCR = _BV(SE);

  //czas początkowy
  g_CurrTime.Sec=0;
  g_CurrTime.Min=50;
  g_CurrTime.Hour=9;

  ClearDisplay();

  //globalne zezwolenie na przerwania
  sei();

  for(;;)
  {
   //obsługa klawisza
   if(!(PIND & _BV(KEY))) //czy wcisniety
   {
     _delay_ms(10);
     //nadal wciśnięty
     while (!(PIND & _BV(KEY)))
     {
      _delay_ms(10);
     }
   }
   //przygotowanie do uśpienia
     //ustawinie obsługi przerwania Int0...
     GICR = _BV(INT0);
     //zgaszenie wyświetlacza
     ClearDisplay();

   //przejście w uśpienie
     set_sleep_mode(SLEEP_MODE_PWR_SAVE);
     sleep_mode();

  }
  return 0;
}


Listing 2

// Ustaw wyświetlacz
void ShowDisplay(void)
{
  uint8_t h08,h04,h02,h01;
  uint8_t m32,m16,m08,m04,m02,m01;

  h08 = ((g_CurrTime.Hour & (1<<3))>>3);
  h04 = ((g_CurrTime.Hour & (1<<2))>>2);
  h02 = ((g_CurrTime.Hour & (1<<1))>>1);
  h01 = (g_CurrTime.Hour & (1<<0));

  m32 = ((g_CurrTime.Min & (1<<5))>>5);
  m16 = ((g_CurrTime.Min & (1<<4))>>4);
  m08 = ((g_CurrTime.Min & (1<<3))>>3);
  m04 = ((g_CurrTime.Min & (1<<2))>>2);
  m02 = ((g_CurrTime.Min & (1<<1))>>1);
  m01 = (g_CurrTime.Min & (1<<0));

  PORTC = ~(h01*_BV(H01) | h02*_BV(H02) |
       h04*_BV(H04) | h08*_BV(H08));

  PORTD = ~(m01*_BV(M01) | m02*_BV(M02) |
       m04*_BV(M04) | m08*_BV(M08) |
       m16*_BV(M16) | m32*_BV(M32));
}

// Obsluga przycisku
SIGNAL(SIG_INTERRUPT0)
{
  //wyłączenie obsługi przerwania INT0
  GICR = 0;

  //wyświetlenie czasu
  ShowDisplay();
}

// Obsługa upływu czasu
SIGNAL(SIG_OVERFLOW2)
{
  //inkrementacja bieżącego czasu
  g_CurrTime.Sec+=2;

  if(g_CurrTime.Sec>=60)
  {
   g_CurrTime.Sec=g_CurrTime.Sec-60;
   g_CurrTime.Min++;
  }
  if(g_CurrTime.Min>=60)
  {
   g_CurrTime.Min=g_CurrTime.Min-60;
   g_CurrTime.Hour++;
  }
  if(g_CurrTime.Hour>12)
  {
   g_CurrTime.Hour=g_CurrTime.Hour-12;
  }
}


Wykaz elementów

R1-R10 . . . . . . . . . . . . 220R-470R (smd 0603)
(Wartość dobrać w zależności od koloru zastosowanych diod LED
Dla diod czerwonych - 470R, niebieskich - 330R, zielonych - 220R)
C1 . . . . . . . . . . . . . . . . 100nF (smd 1206)
D1-D10 . . . . . . . . . . . . diody LED (smd 1206)
U1 . . . . .ATmega8A lub ATmega8L (w obudowie TQFP)
Q1 . . . . . . . . . . . . .Kwarc zegarkowy 32768Hz
BTN . mikroswitch prostokątny (przewlekany lub smd)

Brak komentarzy:

Prześlij komentarz