Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <targets/AT91SAM7.h>
- #include "lcd.h"
- #define LCD_BACKLIGHT PIOB_SODR_P20 //Podświetlenie LCD
- #define AIC_PRIOR_HIGHEST (0x7 << 0) //priorytet przerwania
- #define AIC_SRCTYPE_INT_LEVEL_EDGE (0x1 << 5) //Rodzaj metody wyzwalania przerwania
- void PIT_interrupt(); //Prototyp procedury obsługującej przerwanie void interrupt_enable();
- void interrupt_enable(); //Prototyp procedury globalnego zezwolenia na przerwanie
- __attribute__ ((section(".fast")))
- void delay(int n) //procedura opoznienia
- {
- volatile int i;
- for(i=3000*n;i>0;i--)
- {
- __asm__("nop");
- }
- }
- unsigned int licznik=0;
- int main()
- {
- PMC_PCER=PMC_PCER_PIOB; //wlaczenie urzadzenia we/wy PIOB
- PIOB_OER=LCD_BACKLIGHT; //OUTPUT ENABLE
- PIOB_OWER = LCD_BACKLIGHT; //Ustawienie bitów maski rejestru
- PIOB_PER = LCD_BACKLIGHT;//Ustawienie linii podświetlenia wyświetlacza LCD
- PIOB_ODSR |= LCD_BACKLIGHT; //Włączenie podświetlenia LCD w rejestrze Output Data
- InitLCD(); //inicjalizacja LCD
- LCDSettings(); //ustawienie LCD
- LCDClearScreen();// Wyczyszczenie LCD
- PIT_MR = PIT_MR_PITEN | (0x249F0 & PIT_MR_PIV_MASK);// wlaczenie timera i ustawienie przepełnienia co ok. 50ms
- PIT_MR |= PIT_MR_PITIEN; //Włączenie przerwania od timera PIT
- AIC_IDCR = AIC_IDCR_SYS;//Wyłączenie przerwania od urządzeń peryferyjnych
- AIC_SVR1 = (unsigned long) PIT_interrupt; //Ustawienie wskaźnika do obsługi procedury przerwania
- AIC_SMR1 = AIC_PRIOR_HIGHEST | AIC_SRCTYPE_INT_LEVEL_EDGE; //Ustawienie priorytetu i metody wyzwalania przerwania
- AIC_ICCR = AIC_ICCR_SYS; //Wyczyszczenie flagi przerwania urządzeń peryferyjnych
- AIC_IECR = AIC_IECR_SYS; //Włączenie przerwania od urządzeń peryferyjnych
- interrupt_enable();//Globalne zezwolenie na przerwanie
- while(1) {}
- return 0;
- }
- void PIT_interrupt()//Procedura obsługująca przerwanie
- {
- if(PIT_SR_PITS)//Sprawdzenie, czy przerwanie pochodzi od timera PIT
- {
- licznik++;
- if(licznik==20)//czy upłynęła 1s, 50ms x 20
- {
- PIOB_ODSR ^= LCD_BACKLIGHT;//zaneguj LCD
- licznik = 0;
- }
- PIT_PIVR;//Wyzerowanie licznika PIT
- }
- AIC_EOICR;//Przekazanie informacji o zakończeniu obsługi przerwania
- }
- void interrupt_enable()
- {
- __asm__("MRS r1, CPSR"); //Odczyt rejestru CPSR
- __asm__("BIC r1, r1, #0x80"); //Instrukcja czyszcząca bit przerwania
- __asm__("MSR CPSR, r1"); //Skopiowanie ustawienia do rejestru CPSR
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement