Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "HD44780.h"
- #include "derivative.h"
- char buffer1[21]; // buffer 1 wiersza
- char buffer2[21]; // buffer 2 wiersza
- char buffer3[21]; //buffer 3 wiersza
- char buffer4[21]; // buffer 4 wiersza
- volatile unsigned char LCD_refresh,start,tick,flagaPID;
- static volatile unsigned char i;
- void delay_ms(int liczba)
- {
- /*
- * FUNKCJA POMOCNICZA KTORA PRZY POMOCY ODLICZANIA CZASU ZA POMOCA SYSTICK
- * REALIZUJE OPOZNIENIA POTRZEBNE PRZY INICJALIZACJI LCD
- */
- unsigned char i=0;
- start = 1;
- for(i=0;i<=liczba;i++)
- {
- do {}
- while(start);
- }
- }
- void WRITE_TO_LCD (unsigned char x,unsigned char op)
- {
- unsigned char busy;
- LCD;
- asm("nop");
- asm("nop");
- if(x&0x10) SET_D4; else CLR_D4;
- if(x&0x20) SET_D5; else CLR_D5;
- if(x&0x40) SET_D6; else CLR_D6;
- if(x&0x80) SET_D7; else CLR_D7;
- asm("nop");
- asm("nop");
- CLR_E;
- asm("nop");
- asm("nop");
- if(op) SET_RS;else CLR_RS;
- asm("nop");
- asm("nop");
- CLR_RW;
- asm("nop");
- asm("nop");
- SET_E;
- asm("nop");
- asm("nop");
- CLR_E;
- asm("nop");
- asm("nop");
- if(x&0x01) SET_D4; else CLR_D4;
- if(x&0x02) SET_D5; else CLR_D5;
- if(x&0x04) SET_D6; else CLR_D6;
- if(x&0x08) SET_D7; else CLR_D7;
- asm("nop");
- asm("nop");
- SET_E;
- asm("nop");
- asm("nop");
- CLR_E;
- asm("nop");
- asm("nop");
- IN_D4;
- IN_D5;
- IN_D6;
- IN_D7;
- asm("nop");
- asm("nop");
- CLR_RS;
- asm("nop");
- asm("nop");
- SET_RW;
- asm("nop");
- asm("nop");
- do
- {
- asm("nop");
- asm("nop");
- SET_E;
- asm("nop");
- asm("nop");
- busy = IF_D7;
- CLR_E;
- asm("nop");
- asm("nop");
- SET_E;
- asm("nop");
- asm("nop");
- CLR_E;
- }while(busy);
- }
- void WRITE_TEXT( char *s)
- {
- unsigned char licznik=wiersze;
- while(licznik)
- {
- WRITE_TO_LCD(*s++,data) ;
- licznik--;
- }
- }
- void LCD_XY(unsigned char x , unsigned char y) // pierwszy argument to X drugi to Y
- {
- //WRITE_TO_LCD((y*0x40+x)|0x80,comm); wzór dobry dla lcd 2x16
- /*
- * PONIZEJ PODANE SA ADRESY POCZATKÓW KAZDEJ Z CZTERECH LINII WYWIETLACZA
- */
- switch( y )
- {
- case 1:
- WRITE_TO_LCD(0x80+x,comm );
- break;
- case 2:
- WRITE_TO_LCD(x+0xC0,comm );
- break;
- case 3:
- WRITE_TO_LCD(x+0x94 ,comm );
- break;
- case 4:
- WRITE_TO_LCD(x+0xD4,comm );
- break;
- }
- }
- void LCD_INIT (void)
- {
- /*
- * FUNKCJA INICJALIZUJĄCA WYSWIETLACZ LCD
- */
- delay_ms(160);
- LCD;
- STER;
- CLR_E;
- CLR_RS;
- CLR_RW;
- SET_D4;
- SET_D5;
- CLR_D6;
- CLR_D7;
- unsigned char i;
- for( i=0; i<3; i++)
- {
- asm("nop");
- asm("nop");
- SET_E;
- asm("nop");
- asm("nop");
- CLR_E;
- asm("nop");
- asm("nop");
- delay_ms(5);
- }
- CLR_D4;
- asm("nop");
- asm("nop");
- SET_E;
- asm("nop");
- asm("nop");
- CLR_E;
- asm("nop");
- asm("nop");
- delay_ms(1);
- WRITE_TO_LCD(0x28,comm);
- WRITE_TO_LCD(0x08,comm);
- WRITE_TO_LCD(0x01,comm);
- WRITE_TO_LCD(0x06,comm);
- WRITE_TO_LCD(0x0C,comm);
- delay_ms(100);
- bCLR(all);
- }
- void bCLR (unsigned char mode)
- {
- /*
- * FUNKCJA OBSŁUGI CZYSZCZENIA EKRANU LCD
- * RODZAJ CZYSZCZENIA ZALEZNY OD MODE, MOZNA CZYSCIC JEDNA LINIA, DRUGA LUB CAŁOSC
- * '1'->PIERWSZA LINIA
- * '2'->DRUGA LINIA
- * 'all'-> CALOSC
- */
- unsigned char i;
- switch (mode)
- {
- case 1:
- {
- for(i=0;i<20;i++)
- {
- buffer1[i] = 32;
- }
- buffer1[20] = 0;
- }
- break;
- case 2:
- {
- for(i=0;i<20;i++)
- {
- buffer2[i] = 32;
- }
- buffer2[20] = 0;
- }
- break;
- case 3:
- {
- for(i=0;i<20;i++)
- {
- buffer3[i] = 32;
- }
- buffer3[20] = 0;
- }
- break;
- case 4:
- {
- for(i=0;i<20;i++)
- {
- buffer4[i] = 32;
- }
- buffer4[20] = 0;
- }
- break;
- case 5:
- {
- for(i=0;i<20;i++)
- {
- buffer1[i] = 32;
- buffer2[i] = 32;
- buffer3[i] = 32;
- buffer4[i] = 32;
- }
- buffer1[21] = 0;
- buffer2[21] = 0;
- buffer3[21] = 0;
- buffer4[21] = 0;
- }
- break;
- }
- }
- void bRAM (char *txt, unsigned char Px,unsigned char Py,obiektLCD *obiekt)
- {
- /*
- * GŁÓWNA FUNKCJA - BUFFER ZAPISUJĄCA CIĄGI ZNAKÓW W BUFFERACH 1 I 2 KTÓRE NASTĘPNIE
- * WYSWIETLANE SA PRZEZ FUNKCJE LCD_DISP
- * Px ZAWIERA SIE W ZAKRESIE OD (0-15)
- * Py MOZE BYC ROWNE:
- * 1 DLA PIERWSZEJ LINII
- * 2 DLA DRUGIEJ LINII
- */
- unsigned char i,j;
- if(obiekt->Y ==1)
- {
- for(j=obiekt->X;j<((obiekt->X)+obiekt->pozkonc);j++) buffer1[j]=32;
- }
- obiekt->X = Px;
- obiekt->Y = Py;
- if(obiekt->Y ==2)
- {
- for(j=obiekt->X;j<((obiekt->X)+obiekt->pozkonc);j++) buffer2[j]=32;
- }
- obiekt->X = Px;
- obiekt->Y = Py;
- if(obiekt->Y ==3)
- {
- for(j=obiekt->X;j<((obiekt->X)+obiekt->pozkonc);j++) buffer3[j]=32;
- }
- obiekt->X = Px;
- obiekt->Y = Py;
- if(obiekt->Y ==4)
- {
- for(j=obiekt->X;j<((obiekt->X)+obiekt->pozkonc);j++) buffer4[j]=32;
- }
- obiekt->X = Px;
- obiekt->Y = Py;
- while(*txt&&(Px<20))
- {
- if (Py==1)
- {
- buffer1[Px++]=*txt++;
- i++;
- }
- if (Py==2)
- {
- buffer2[Px++]=*txt++;
- i++;
- }
- if (Py==3)
- {
- buffer3[Px++]=*txt++;
- i++;
- }
- if (Py==4)
- {
- buffer4[Px++]=*txt++;
- i++;
- }
- }
- obiekt->pozkonc = i;
- }
- void LCD_disp (void)
- {
- /*
- * FUNKCJA STEROWANA PRZEZ SYSTICK ZA POMOCA SYSTEMU FLAG LCD_REFRESH
- * EKRAN LCD ODSWIEZANY JEST CO 100ms
- */
- if(LCD_refresh)
- {
- LCD_refresh = 0 ;
- LCD_XY(0,1);
- WRITE_TEXT(buffer1);
- LCD_XY(0,2);
- WRITE_TEXT(buffer2);
- LCD_XY(0,3);
- WRITE_TEXT(buffer3);
- LCD_XY(0,4);
- WRITE_TEXT(buffer4);
- }
- }
- void SysTick_init(void)
- {
- SYST_RVR = clock; //wartosc od ktorej zlicza systick
- SYST_CVR = 0; // skasowanie wartosci licznika
- SYST_CSR |= SysTick_CSR_CLKSOURCE_MASK | SysTick_CSR_TICKINT_MASK | SysTick_CSR_ENABLE_MASK ; //zrodlo zegara-> procesor, wlaczenie systick,
- //pozwolenie na odliczanie
- /*
- * FUNKCJA ODLICZA W AKTUALNYM USTAWIENIU W PRZERWANIU 1ms.TAKTOWANIE SYGNAŁEM 48MHZ
- */
- }
- void SysTick_Handler()
- {
- if(start) start=0;
- /*
- * INICJALIZACJA FLAG ODMIERZAJACYCH 1MS
- */
- tick = 1;
- flagaPID=1;
- i++;
- if(i==100)
- {
- i=0;
- LCD_refresh = 1;
- }
- }
- void LCD_GPIO_INIT(void)
- {
- /*
- * FUNKCJA INICJALIZUJACA SYGNAŁY I MULTIPLEKSOWANIE PINOW PTORZEBNYCH
- * DO OBSLUGI WYSWIETLACZA LCD HD44780, TRYB PRACY 4 BITOWY Z OBSŁUGĄ BUSY FLAG
- * DO OBSŁUGI BUSY FLAG WYMAGANY JEST PIN R/W
- */
- SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK; //ustawienie sygnału zegarowego na port E
- PORTE_PCR20 = PORT_PCR_MUX(1) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; // włączenie multipleksowania dla wybranych pinów RW,RS,RE
- PORTE_PCR21 = PORT_PCR_MUX(1); // dodatkowo włączenie internal resistor(PE) i podciągniecie pull-up(PS)
- PORTE_PCR22 = PORT_PCR_MUX(1);
- PORTE_PCR2 = PORT_PCR_MUX(1); // włączenie multipleksowania dla pinów D4,D5,D6,D7
- PORTE_PCR3 = PORT_PCR_MUX(1);
- PORTE_PCR4 = PORT_PCR_MUX(1);
- PORTE_PCR5 = PORT_PCR_MUX(1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement