Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.48 KB | None | 0 0
  1. #include <targets/AT91SAM7.h>
  2. #include "lcd.h"
  3.  
  4. #define LCD_BACKLIGHT PIOB_SODR_P20 //Podświetlenie LCD
  5. #define AIC_PRIOR_HIGHEST (0x7 << 0)  //priorytet przerwania
  6. #define AIC_SRCTYPE_INT_LEVEL_EDGE (0x1 << 5) //Rodzaj metody wyzwalania przerwania
  7.  
  8. void PIT_interrupt(); //Prototyp procedury obsługującej przerwanie void interrupt_enable();
  9. void interrupt_enable(); //Prototyp procedury globalnego zezwolenia na przerwanie
  10.  
  11.  
  12. __attribute__ ((section(".fast")))
  13. void delay(int n) //procedura opoznienia
  14. {
  15.   volatile int i;
  16.  
  17.   for(i=3000*n;i>0;i--)
  18.   {
  19.     __asm__("nop");
  20.   }
  21. }
  22.  
  23. unsigned int licznik=0;
  24.  
  25. int main()
  26. {
  27.   PMC_PCER=PMC_PCER_PIOB; //wlaczenie urzadzenia we/wy PIOB
  28.   PIOB_OER=LCD_BACKLIGHT; //OUTPUT ENABLE
  29.   PIOB_OWER = LCD_BACKLIGHT; //Ustawienie bitów maski rejestru
  30.   PIOB_PER = LCD_BACKLIGHT;//Ustawienie linii podświetlenia wyświetlacza LCD
  31.   PIOB_ODSR |= LCD_BACKLIGHT; //Włączenie podświetlenia LCD w  rejestrze Output Data
  32.  
  33.   InitLCD(); //inicjalizacja LCD
  34.   LCDSettings(); //ustawienie LCD
  35.   LCDClearScreen();// Wyczyszczenie LCD
  36.  
  37.   PIT_MR = PIT_MR_PITEN | (0x249F0 & PIT_MR_PIV_MASK);// wlaczenie timera i ustawienie przepełnienia co ok. 50ms
  38.   PIT_MR |= PIT_MR_PITIEN; //Włączenie przerwania od timera PIT
  39.  
  40.   AIC_IDCR = AIC_IDCR_SYS;//Wyłączenie przerwania od urządzeń peryferyjnych
  41.   AIC_SVR1 = (unsigned long) PIT_interrupt; //Ustawienie wskaźnika do obsługi procedury przerwania
  42.   AIC_SMR1 = AIC_PRIOR_HIGHEST | AIC_SRCTYPE_INT_LEVEL_EDGE; //Ustawienie priorytetu i metody wyzwalania przerwania
  43.   AIC_ICCR = AIC_ICCR_SYS; //Wyczyszczenie flagi przerwania urządzeń peryferyjnych
  44.   AIC_IECR = AIC_IECR_SYS; //Włączenie przerwania od urządzeń peryferyjnych
  45.  
  46.   interrupt_enable();//Globalne zezwolenie na przerwanie
  47.  
  48.   while(1) {}
  49.  
  50.   return 0;
  51. }
  52.  
  53. void PIT_interrupt()//Procedura obsługująca przerwanie
  54.   {
  55.     if(PIT_SR_PITS)//Sprawdzenie, czy przerwanie pochodzi od timera PIT
  56.       {
  57.       licznik++;
  58.       if(licznik==20)//czy upłynęła 1s, 50ms x 20
  59.         {
  60.             PIOB_ODSR ^= LCD_BACKLIGHT;//zaneguj LCD
  61.             licznik = 0;
  62.         }
  63.       PIT_PIVR;//Wyzerowanie licznika PIT
  64.       }
  65.       AIC_EOICR;//Przekazanie informacji o zakończeniu obsługi przerwania
  66.   }
  67.  
  68.   void interrupt_enable()
  69.   {
  70.     __asm__("MRS r1, CPSR"); //Odczyt rejestru CPSR
  71.     __asm__("BIC r1, r1, #0x80"); //Instrukcja czyszcząca bit przerwania
  72.     __asm__("MSR CPSR, r1"); //Skopiowanie ustawienia do rejestru CPSR
  73.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement