Guest User

Untitled

a guest
Feb 18th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.56 KB | None | 0 0
  1. /***********************************************************************
  2. clock.c                                           ( zegar elektroniczny)
  3.  
  4. Program demonstruje działanie elektronicznego zegara. Jest on
  5. modyfikacją programu źródłowego prezentowanego przez firmę
  6. Keil. Komunikaty zegara wyprowadzane są na wyświetlacz LCD lub
  7. złącze SIO transmisji szeregowej z użyciem funkcji z biblioteki stdio.h.
  8. Podczas obsługi wyświetlacza dodano obsługę znaku nowej linii \n w
  9. zbiorze LCD_comm.c. Poprawiono także zbiór KEYB.c aby dostosować
  10. klawiaturę telefoniczno do programu obsługi zegara.
  11. ***********************************************************************/
  12. //#define LCD           // usuń całą linie dla transmisji szeregowej SIO
  13. #include "51xD2.h"
  14. #include <stdio.h>
  15. #include "sio_init.h"
  16. #include "lcd.h"
  17. #define FREQ   24000000L     // częstotliwość oscylatora kwarcowego w Hz
  18.  
  19. #define PERIOD  200        // liczba autoprzeładowania dla układu Timer0
  20. #define SECOND  FREQ/(12*PERIOD) // czas jednej sekundy: liczba przerwań
  21.  
  22. struct time  {
  23.     BYTE   hour;                                              // godziny
  24.     BYTE   min;                                                // minuty
  25.     BYTE   sec;                                               // sekundy
  26. } clk_time;                                             // aktualny czas
  27.  
  28. //----------------------------------------------------------------------
  29. // Podprogram przerwania od układu Timer0 odlicza godziny, minuty, sek.
  30. //----------------------------------------------------------------------
  31. void T0_int (void) interrupt 1 using 1 {
  32.   WORD  count;                    // licznik wywołania przerwania Timer0
  33.   if (++count == SECOND)  {                  // zwiększ licznik przerwań
  34.     count = 0;                      // Zmiana czasu następuje co sekundę
  35.     if (++clk_time.sec == 60)  {               // zwiększ licznik sekund
  36.       clk_time.sec = 0;                      // ustaw licznik minut na 0
  37.       if (++clk_time.min == 60)  {              // zwiększ licznik minut
  38.         clk_time.min = 0;                   // ustaw licznik godzin na 0
  39.         if (++clk_time.hour == 25)  {          // zwiększ licznik godzin
  40.           clk_time.hour = 1;
  41.         }
  42.       }
  43.     }
  44.   }
  45. }
  46.  
  47. // Wyświetlanie repertuaru możliwości zegara.---------------------------
  48. // Podprogram zwraca znak wybranej funkcji zegara.
  49. //----------------------------------------------------------------------
  50. char menu(void) {
  51.   printf ("\nClock");                               // wyświetl nagłówek
  52.   printf ("\n0-disp *-set");               // wyświetl możliwości zegara
  53.   return (_getkey());                   // pobierz znak - bez echa znaku
  54. }
  55.  
  56. // Uaktualnij czas dnia ------------------------------------------------
  57. void update (struct time *dtime) {
  58.   printf("\r%02bd:%02bd:%02bd   ", dtime->hour,dtime->min,dtime->sec );
  59. }
  60.  
  61. // Wyświetlanie czasu dnia co jedna sekundę.----------------------------
  62. // Wciśnięcie dowolnego przycisku powoduje zakończenie tej procedury.
  63. //----------------------------------------------------------------------
  64. void display(void) {
  65.   unsigned char last = 0xFF;             // ostatnio wyświetlona sekunda
  66.  
  67.   printf("\nTIME/#-menu\n");
  68.  
  69.   while (1)  {
  70.  
  71.        #ifdef LCD
  72.          P1 &=0x0f;
  73.          if ( P1 !=0x0f  )  { P1=0xff; break; }           //dowolny znak
  74.        #else
  75.          if ( RI   ) {RI=0; break;}                      // dowolny znak
  76.        #endif
  77.  
  78.        if (last != clk_time.sec)  {   // sprawdzenie czy uaktualnić czas
  79.        update(&clk_time);                          // wyświetl nowy czas
  80.        last = clk_time.sec;
  81.      }
  82.   }
  83. }
  84.  
  85.  
  86. // Ustawianie czasu-----------------------------------------------------
  87. // Wciśnięcie przycisku CR powoduje zakończenie tej procedury
  88. //----------------------------------------------------------------------
  89. set_time (struct time *dtime ) {
  90.   struct time setuptime;
  91.   setuptime.hour = dtime->hour;                            // kopiowanie
  92.   setuptime.min  = dtime->min;
  93.   setuptime.sec  = dtime->sec;
  94.  
  95.   printf ("\n123:T/#-Strt/*-Quit\n");         // Naciśnij 123 dla zmiany
  96.                                              //... godzin, minut, sekund.
  97.                                              // Naciśnij # aby uruchomić
  98.                                                      //... zegar - start.
  99.                                              //  Naciśni * aby zakończyć
  100.                                                //... wprowadzanie - Quit.
  101.   update(&setuptime);                            // uaktualnij czas dnia
  102.  
  103.   while (1)  {
  104.     switch (_getkey())  {                     // pobierz znak - bez echa
  105.  
  106.       case '#':                           // ustaw aktualny czas gdy "#"
  107.         dtime->hour = setuptime.hour;
  108.         dtime->min  = setuptime.min;
  109.         dtime->sec  = setuptime.sec;
  110.         return;
  111.  
  112.       case '1':                       // zmień godziny gdy wciśnięto "1"
  113.         if (++setuptime.hour == 25)  setuptime.hour = 1;
  114.         break;
  115.  
  116.       case '2':                       // zmień minuty gdy wciśnięto  "2"
  117.         if (++setuptime.min == 60)  setuptime.min = 0;
  118.         break;
  119.  
  120.       case '3':                       // zmień sekundy gdy wciśnięto "3"
  121.         if (++setuptime.sec == 60)  setuptime.sec = 0;
  122.         break;
  123.  
  124.       default:
  125.         continue;
  126.     }
  127.     update(&setuptime);                            // skoryguj czas dnia
  128.   }
  129. }
  130.  
  131. //----------------------------------------------------------------------
  132. void main(void) {
  133.   clk_time.hour = 12;                         // inicjalizacja zmiennych
  134.  
  135.   #ifdef LCD
  136.     LCD_init;                                       // inicjalizacja LCD
  137.   #else
  138.     SIO_initT1;                                     // inicjalizacja SIO
  139.   #endif
  140.  
  141.  
  142.   TL0 =TH0 = -PERIOD;       // ustawienie okresu działanie układu Timer0
  143.   TMOD = TMOD | 0x02;            // tryb Timer0: MODE2 autoprzeładowanie
  144.   TR0 = 1;                                       // uruchom układ Timer0
  145.   ET0 = 1;                  // zezwolenie na przerwania od układu Timer0
  146.   EA  = 1;                             // zezwolenie na obsługę przerwań
  147.  
  148.  
  149.   while (1)  {                                        // pętla bez końca
  150.  
  151.     switch (menu())  {                    // repertuar możliwości zegara
  152.       case '0': display();                         // wyświetl czas dnia
  153.                 break;
  154.       case '*': set_time(&clk_time);                    // zmień czas dnia
  155.                 break;
  156.       default:  break;
  157.     }
  158.   }
  159. }
Add Comment
Please, Sign In to add comment