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