Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /***********************************************************************
- clock.c ( zegar elektroniczny)
- Program demonstruje działanie elektronicznego zegara. Jest on
- modyfikacją programu źródłowego prezentowanego przez firmę
- Keil. Komunikaty zegara wyprowadzane są na wyświetlacz LCD lub
- złącze SIO transmisji szeregowej z użyciem funkcji z biblioteki stdio.h.
- Podczas obsługi wyświetlacza dodano obsługę znaku nowej linii \n w
- zbiorze LCD_comm.c. Poprawiono także zbiór KEYB.c aby dostosować
- klawiaturę telefoniczno do programu obsługi zegara.
- ***********************************************************************/
- //#define LCD // usuń całą linie dla transmisji szeregowej SIO
- #include "51xD2.h"
- #include <stdio.h>
- #include "sio_init.h"
- #include "lcd.h"
- #define FREQ 24000000L // częstotliwość oscylatora kwarcowego w Hz
- #define PERIOD 200 // liczba autoprzeładowania dla układu Timer0
- #define SECOND FREQ/(12*PERIOD) // czas jednej sekundy: liczba przerwań
- struct time {
- BYTE hour; // godziny
- BYTE min; // minuty
- BYTE sec; // sekundy
- } clk_time; // aktualny czas
- //----------------------------------------------------------------------
- // Podprogram przerwania od układu Timer0 odlicza godziny, minuty, sek.
- //----------------------------------------------------------------------
- void T0_int (void) interrupt 1 using 1 {
- WORD count; // licznik wywołania przerwania Timer0
- if (++count == SECOND) { // zwiększ licznik przerwań
- count = 0; // Zmiana czasu następuje co sekundę
- if (++clk_time.sec == 60) { // zwiększ licznik sekund
- clk_time.sec = 0; // ustaw licznik minut na 0
- if (++clk_time.min == 60) { // zwiększ licznik minut
- clk_time.min = 0; // ustaw licznik godzin na 0
- if (++clk_time.hour == 25) { // zwiększ licznik godzin
- clk_time.hour = 1;
- }
- }
- }
- }
- }
- // Wyświetlanie repertuaru możliwości zegara.---------------------------
- // Podprogram zwraca znak wybranej funkcji zegara.
- //----------------------------------------------------------------------
- char menu(void) {
- printf ("\nClock"); // wyświetl nagłówek
- printf ("\n0-disp *-set"); // wyświetl możliwości zegara
- return (_getkey()); // pobierz znak - bez echa znaku
- }
- // Uaktualnij czas dnia ------------------------------------------------
- void update (struct time *dtime) {
- printf("\r%02bd:%02bd:%02bd ", dtime->hour,dtime->min,dtime->sec );
- }
- // Wyświetlanie czasu dnia co jedna sekundę.----------------------------
- // Wciśnięcie dowolnego przycisku powoduje zakończenie tej procedury.
- //----------------------------------------------------------------------
- void display(void) {
- unsigned char last = 0xFF; // ostatnio wyświetlona sekunda
- printf("\nTIME/#-menu\n");
- while (1) {
- #ifdef LCD
- P1 &=0x0f;
- if ( P1 !=0x0f ) { P1=0xff; break; } //dowolny znak
- #else
- if ( RI ) {RI=0; break;} // dowolny znak
- #endif
- if (last != clk_time.sec) { // sprawdzenie czy uaktualnić czas
- update(&clk_time); // wyświetl nowy czas
- last = clk_time.sec;
- }
- }
- }
- // Ustawianie czasu-----------------------------------------------------
- // Wciśnięcie przycisku CR powoduje zakończenie tej procedury
- //----------------------------------------------------------------------
- set_time (struct time *dtime ) {
- struct time setuptime;
- setuptime.hour = dtime->hour; // kopiowanie
- setuptime.min = dtime->min;
- setuptime.sec = dtime->sec;
- printf ("\n123:T/#-Strt/*-Quit\n"); // Naciśnij 123 dla zmiany
- //... godzin, minut, sekund.
- // Naciśnij # aby uruchomić
- //... zegar - start.
- // Naciśni * aby zakończyć
- //... wprowadzanie - Quit.
- update(&setuptime); // uaktualnij czas dnia
- while (1) {
- switch (_getkey()) { // pobierz znak - bez echa
- case '#': // ustaw aktualny czas gdy "#"
- dtime->hour = setuptime.hour;
- dtime->min = setuptime.min;
- dtime->sec = setuptime.sec;
- return;
- case '1': // zmień godziny gdy wciśnięto "1"
- if (++setuptime.hour == 25) setuptime.hour = 1;
- break;
- case '2': // zmień minuty gdy wciśnięto "2"
- if (++setuptime.min == 60) setuptime.min = 0;
- break;
- case '3': // zmień sekundy gdy wciśnięto "3"
- if (++setuptime.sec == 60) setuptime.sec = 0;
- break;
- default:
- continue;
- }
- update(&setuptime); // skoryguj czas dnia
- }
- }
- //----------------------------------------------------------------------
- void main(void) {
- clk_time.hour = 12; // inicjalizacja zmiennych
- #ifdef LCD
- LCD_init; // inicjalizacja LCD
- #else
- SIO_initT1; // inicjalizacja SIO
- #endif
- TL0 =TH0 = -PERIOD; // ustawienie okresu działanie układu Timer0
- TMOD = TMOD | 0x02; // tryb Timer0: MODE2 autoprzeładowanie
- TR0 = 1; // uruchom układ Timer0
- ET0 = 1; // zezwolenie na przerwania od układu Timer0
- EA = 1; // zezwolenie na obsługę przerwań
- while (1) { // pętla bez końca
- switch (menu()) { // repertuar możliwości zegara
- case '0': display(); // wyświetl czas dnia
- break;
- case '*': set_time(&clk_time); // zmień czas dnia
- break;
- default: break;
- }
- }
- }
Add Comment
Please, Sign In to add comment