witam,mam taki swój własny projekcik gdzie sercem układu jest atmega16, mam problem z częścią programu wyświetlającą czas na ekranie LCD alfanumerycznego.pomimo licznych poszukiwań znalazłam tylko poniższy kawałek programu. Pytanie brzmi jak zrobić by działał on na alfanumerycznym, a jeszcze lepiej by po prostu odliczył dokładny czas np. 10h (wiem że to dziwne dla niektórych ale mój program musi spełniać taką funkcję), w dodatku ważne by był w C, ponieważ w tym języku jest reszta programu. Proszę o pomoc w przeróbce bo jestem laikiem w C. Chcę wykorzystać do odliczania tego czasu 32,768 bo taki zamontowałam w płytce.
Porty od LCD-ka to odpowiednio PC3,PC2,PC1,PC0 -- D4,D5,D6,D7, E-PC4, RS-PC5
Gdzie w dodatku umieścić procedurę inicjalizacjiLCD i jak wysłać to już bezpośrednio na wyświetlacz
Z góry dzięki za wskazówki i mam nadzieję że wybaczycie mi mój słaby poziom.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define D1_ON PORTD &= 0xBF
#define D2_ON PORTD &= 0xDF
#define D3_ON PORTD &= 0xEF
#define D4_ON PORTD &= 0xF7
// tablica z kodami znaków dla wyświetlacza
char znaki[17] = {192,249,164,176,153,146,130,248,128,144,136,131,198,161,134,142,0};
// zmienna pomocnicza określająca którą cyfrę wyświetlacza w danym momencie należy wyświetlić
char wysw;
// zmianne licznikowe do odmierzania czasu
char jednostki_sekund = 9, dziesiatki_sekund = 5,
jednostki_minut = 9, dziesiatki_minut = 5,
jednostki_godzin = 3, dziesiatki_godzin = 2;
void aktualizuj_czas(void);
//
SIGNAL (SIG_OVERFLOW0)
{
TCNT0 = 250; // załadowanie do licznika wartości początkowej
PORTD = 0xFF; // wygaszenie wszystkich cyfr wyświetlacza
wysw++; // zwiększenie o 1 zmiennej wysw
// w zależności od wartości wysw włącz odpowiednią cyfrę na wyświetlaczu
switch(wysw){
case 1:
{
PORTB = *(znaki + dziesiatki_godzin); // na wyświetlaczu wyświetl odpowiedni
// znak pobrany z tablicy znaków
D1_ON; // włącz pierwszą cyfrę wyświetlcza
break; // opuść instrukcję switch
}
case 2:
{
PORTB = *(znaki + jednostki_godzin); // na wyświetlaczu wyświetl odpowiedni
// znak pobrany z tablicy znaków
D2_ON; // włącz drugą cyfrę wyświetlcza
break; // opuść instrukcję switch
}
case 3:
{
PORTB = *(znaki + dziesiatki_minut); // na wyświetlaczu wyświetl odpowiedni
// znak pobrany z tablicy znaków
D3_ON; // włącz trzecią cyfrę wyświetlcza
break; // opuść instrukcję switch
}
case 4:
{
PORTB = *(znaki + jednostki_minut); // na wyświetlaczu wyświetl odpowiedni
// znak pobrany z tablicy znaków
D4_ON; // włącz czwartą cyfrę wyświetlcza
break; // opuść instrukcję switch
}
case 5:
{
wysw = 0; // zeruj zmienną wysw
break; // opuść instrukcję switch
}
}
}
//
SIGNAL (SIG_OVERFLOW1)
{
TCNT1L = 0xDC; // załadowanie do licznika TIMER1 wartości początkowych
TCNT1H = 0x0B; // określających częstotliwość występowania przerwania
aktualizuj_czas(); // wywołanie procedury aktualizującej czas
}
// procedura aktualizująca czas
void aktualizuj_czas(void)
{
jednostki_sekund++; // zwiększ licznik jednostek sekund o 1
if(jednostki_sekund == 10) // jeśli licznik jednostek sekund osiągnął wartość 10 to
{
jednostki_sekund = 0; // wyzeruj licznik jednostek sekund
dziesiatki_sekund++; // zwiększ licznik dziesiątek sekund o 1
if(dziesiatki_sekund == 6) // jeśli licznik dziesiątek sekund osiągnął wartość 6 to
{
dziesiatki_sekund = 0; // wyzeruj licznik dziesiątek sekund
jednostki_minut++; // zwiększ licznik jednostek minut o 1
if(jednostki_minut == 10) //jeśli licznik jednostek minut osiągnął wartość 10 to
{
jednostki_minut = 0; // wyzeruj licznik jednostek minut
dziesiatki_minut++; // zwiększ licznik dzieisątekminut o 1
if(dziesiatki_minut == 6) // jeśli licznik dziesiątek minut osiągnął wartość 6 to
{
dziesiatki_minut = 0; // wyzeruj licznik dziesiątek minut
jednostki_godzin++; // zwiększ licznik jednostek godzin o 1
if((dziesiatki_godzin == 2) && (jednostki_godzin == 4)) // jeżeli jest północ to
{
dziesiatki_godzin = jednostki_godzin = 0; // zeruj licznik dziesiątek i jednostek godzin
}
if(jednostki_godzin == 10) // jeśli licznik jednostek godzin osiągnął wartość 10 to
{
jednostki_godzin = 0; // wyzeruj licznik jednostek godzin
dziesiatki_godzin++; // zwiększ licznik dziesiątek godzin o 1
}
}
}
}
}
}
// Program główny
int main(void)
{
// konfiguracja portów I/O
DDRB = 0xFF;
DDRD = 0xFC;
PORTB = 0xFF;
PORTD = 0xF7;
// ustawienie trybu pracy licznika
TCCR0 = 0x04;
TCCR1B = 0x03;
// wpisanie wartości początkowej
TCNT0 = 128;
// odblokowanie przerwania od licznika
TIMSK = 130;
// globalne odblokowanie przerwań
sei();
// pusta pętla nieskoczona
while(1);
return 0;
}Porty od LCD-ka to odpowiednio PC3,PC2,PC1,PC0 -- D4,D5,D6,D7, E-PC4, RS-PC5
Gdzie w dodatku umieścić procedurę inicjalizacjiLCD i jak wysłać to już bezpośrednio na wyświetlacz
Z góry dzięki za wskazówki i mam nadzieję że wybaczycie mi mój słaby poziom.