daily pastebin goal
94%
SHARE
TWEET

Untitled

a guest Mar 21st, 2018 64 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /****************************************************************************/
  2. /*                   Program systemu prototypowego SP-AVR                   */
  3. /* Autor:                                                                   */
  4. /****************************************************************************/
  5.  
  6. #include <avr/io.h>                 // Rejestry mikrokontrolera ATmega32
  7. #include <avr/interrupt.h>          // Przerwania mikrokontrolera
  8. #include <stdio.h>                  // Standardowe I/O
  9. #include "key.h"                    // Obsługa przycisków (SW0...SW7)
  10. #include "led.h"                    // Obsługa diod LED (LD0...LD7)
  11. #include "lcd.h"                    // Obsługa wyświetlacza LCD 2x16 znaków
  12.  
  13. #define TCYKL   25                  // Czas cyklu obliczeń (25 x 4ms = 100ms)
  14.  
  15. volatile char cykl;                 // Odmierzanie czasu cyklu (pętli głównej)
  16. char buf[64];                       // Bufor komunikatów LCD
  17. //---------------------- Początek deklaracji użytkownika --------------------------------
  18.  
  19. char x1, x2, z1, z2, m, stan = 1, tim;
  20.  
  21.  
  22. //---------------------- Koniec deklaracji użytkownika ----------------------------------
  23. int main(void)
  24. {
  25.     DDRA  = 0xff;                   // Kierunek portu A (diody LED): port wyjściowy
  26.     DDRB  = 0x00;                   // Kierunek portu B (klawisze) : port wejściowy
  27.     PORTA = 0xff;                   // Port A (diody LED): ustaw "1" (wygaszone diody)
  28.     PORTB = 0xff;                   // Port B (klawisze) : aktywne rezystory podciągające
  29.    
  30.     TCCR0 = _BV(WGM01)|_BV(CS02);   // Timer/Counter 0: tryb CTC, dzielnik=256
  31.     OCR0  = 124;                    // Limit zliczania T0: 0.125us x 256 x (124+1) = 4ms
  32.     TIMSK = _BV(OCIE0);             // Odblokowanie przewań T0 (Output Compare Match)
  33.     sei();                          // Globalne włączenie obsługi przerwań
  34.  
  35.     LCD_init();
  36.    
  37.                         // Inicjowanie wyświetlacza LCD
  38.    
  39.    
  40.     while(1)
  41.     {
  42.         cykl = TCYKL;               // Deklarowany czas cyklu (TCYKL x 4ms)
  43.         KEY_read();                 // Odczyt stanu klawiszy aK1..aK4
  44.         //-------------- Początek kodu użytkownika --------------------------------------
  45.         x1=aK1;
  46.         x2=aK2;
  47.  
  48.         switch(stan){
  49.             case 1: z1=1; z2=0; m=0;
  50.             if(x1){stan=2; tim=30;};
  51.             break;
  52.            
  53.             case 2: z1=1; z2=0; m=0;
  54.             if(!tim){stan=3; tim=10;}
  55.             else if(x2){stan=4; tim=50;};
  56.             break;
  57.            
  58.             case 3: z1=0; z2=0; m=0;
  59.             if(!tim&&1){stan=2; tim=30;};
  60.             break;
  61.            
  62.             case 4: z1=0; z2=0; m=1;
  63.             if(!tim&&1) stan=5;
  64.             break;
  65.            
  66.             case 5: z1=0; z2=1; m=0;
  67.             if(!x1) stan=1;
  68.             break;
  69.         }
  70.            
  71.         L1=z1; L2=z2; L3=m;
  72.  
  73.         if(tim) --tim;
  74.        
  75.         //-------------- Wyświetlacz LCD --------------
  76.         sprintf(buf,"K1=%dK2=%dK3=%dK4=%d",(int)aK1,(int)aK2,(int)aK3,(int)aK4);
  77.         LCD_xy(0,0);                // Ustawienie kursora w linii 1
  78.         LCD_puts(buf);              // Wyświetlenie zawartości bufora
  79.         sprintf(buf,"L1=%dL2=%dL3=%dL4=%d",(int)L1,(int)L2,(int)L3,(int)L4);
  80.         LCD_xy(0,1);                // Ustawienie kursora w linii 2
  81.         LCD_puts(buf);              // Wyświetlenie zawartości bufora
  82.        
  83.         //-------------- Koniec kodu użytkownika ----------------------------------------
  84.         LED_set();                  // Ustawienie diod LED
  85.         //KEY_mem();                // Zapamiętanie stanu klawiszy w pK1..pK4
  86.        
  87.         while(cykl);                // Oczekiwanie na koniec cyklu oblicz.
  88.     }
  89.     return 0;
  90. }
  91.  
  92. //---------------------- Funkcje obsługi przerwań ---------------------------------------
  93.  
  94. ISR(TIMER0_COMP_vect)               // Przerwanie od Timer/Counter 0 (co 4ms)
  95. {
  96.     if(cykl) --cykl;                // Odmierzanie czasu cyklu pętli głównej
  97. }
RAW Paste Data
Top