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