////////////////////////////////////////////////////////////////////////
///////////////////////////////////AUTORZY: TOMASZ SZUBRYT I PAWEŁ SZYROKI/////////
//////////////////////////////////////////////////////////////////////////////////
// KU EDUKACJI I ZROZUMIENIA JAK TO DZIAŁA////////////////////////////////
///////////////////////REJESTRY KONFIGURACYJNE ITP SĄ OPISANE W NOTACH KATALOGOWYCH///////
///////PROŹBA ANY TEGO BEZMYŚLNIE NIE KOPIOWAĆ, A JEDYNIE ZOBACZYĆ PRZYKŁAD I NAPISAĆ WŁASNY PROGRAM///
// POZDRAWIAM I MIŁEGO KODZENIA :)/////////
#INCLUDE
at 0x8000 xdata volatile char dane;
at 0x8001 xdata volatile char instr; // rejestr wyświetlacza
///////////////////////////////////////////////////////////////////////////
//deklaracja zmiennych:
///////////////////////////////////////////////////////////////////////////
char napis[30]="czesc :-)";
char x=0, y=0; //wspolzedne na wyswietlaczu
char i=0,j=0; //zmienne pomocnicze liczniki
char klawiatura=0; //odbior danych z kalwiatury
char kla_znak; //zatrzask danych z klawiatury
char kla=0; //flaga otrzymania znaku
char kla_licz=0; //licznik funkcji odbiory bitow z klawiatury
char letter=0;
char spi_dane=0;
////////////////////////////////////////////////////////////////////////////
// DEKLARACJA I DEFINICJA FUNKCJI///
///////////////////////////////////////
char SPI(char dane) // uniwersalna funkcja wysyłająca odbierająca po spi
{
char odb; //deklaracja zmiennej pomocniczej
SPIDAT=dane; //wpis w rejestr SPI danych
while (ISPI==0); //oczekiwanie aż mikrokontroler ustawi bit ISPI który mówi o końcu wysyłania
odb=SPIDAT; // przepisanie do zmiennej odb rejestru SPIDAT co również zeruje bit ISPI
return odb; //zwrot wartości odebranej
}
void SPI_konf (char adres, char dane) // funkcja do konfiguracji RTC wysyła najpierw adres a później konede, nie ważne co zwraca dlatego void
{
char odb;
T2EX=1; //ustawienie SS lub jak kto woli chipenable
odb=SPI(adres); // wyślij pierszy bajt
odb=SPI(dane); //wyślij drugi bajt
T2EX=0; // zerowanie ss lub chipenable
}
char SPI_odb (char adres) // funkcja do odbioru danych z RTC pierszy podaje adres z kąd ma pobrać drugie odbiera dane
{
char odb;
T2EX=1; //ustawienie SS lub jak kto woli chipenable
odb=SPI(adres); //wysłanie adresu
odb=SPI(0xFF); //odbiór danych (wysyłamy jakieś gówno le odbieramy konkret)
T2EX=0; //zerowanie ss
return odb; //zwórcenie bajtu odebranego
}
void LCD_dane(char bajt) //czeka na gotowosc i wystawia dane na port wyswietlacza
{
do {}
while((instr&0x02)!=0x02); // przemnożenie statusu wyświetlacza przez 2 bitowo i sprawdzenie,czy równy 2
//opcjonalnie while(!(instr&2));
dane=bajt;
}
void LCD_komendy(char bajt) //czeka na gotowosc i wystawia komendy na port wyswietlacza
{
do {}
while((instr&0x01)!=0x01);
instr=bajt;
}
void LCD_ZNAK(char znak) //wyswieitla pojedynczy znak
{
LCD_dane(znak-0x20);
LCD_komendy(0xC0);
}
void LCD_GOTO(char x,char y) //
{
LCD_dane(x);
LCD_dane(y);
LCD_komendy(0x24);
}
void LCD_CLEAR(void) //czysci caly ekran w trybie tekstowym
{
char i;
LCD_GOTO(0,0x10);
for(i=255; i>0; i--)
{
LCD_ZNAK(' ');
}
}
void INIT_LCD(void) //inicjalizacja
{
LCD_komendy(0x80);
LCD_dane(0x00);
LCD_dane(0x00);
LCD_komendy(0x42);
LCD_dane(0x1E);
LCD_dane(0x00);
LCD_komendy(0x43);
LCD_dane(0x00);
LCD_dane(0x10);
LCD_komendy(0x40);
LCD_dane(0x1E);
LCD_dane(0x00);
LCD_komendy(0x41);
LCD_komendy(0x94);
LCD_CLEAR();
}
void LCD_NAPIS(char *tekst) //wyswielta stringi
{
while(*tekst)
{
LCD_ZNAK(*tekst++);
}
}
void LCD_KURSOR(char x,char y)
{
LCD_dane(y*30+x);
LCD_dane(0x10);
LCD_komendy(0x24);
}
void LCD_wprawo(char x, char y, char dlugosc, char *tekst)
{
LCD_KURSOR(x,y);
for(i=dlugosc; i>0; i--)
{
LCD_ZNAK(' ');
}
LCD_KURSOR(x+1,y);
LCD_NAPIS(tekst);
}
void LCD_wlewo(char x, char y, char dlugosc,char *tekst)
{
LCD_KURSOR(x,y);
for(i=dlugosc; i>0; i--)
{
LCD_ZNAK(' ');
}
LCD_KURSOR(x-1,y);
LCD_NAPIS(tekst);
}
void LCD_wgore(char x, char y, char dlugosc,char *tekst)
{
LCD_KURSOR(x,y);
for(i=dlugosc; i>0; i--)
{
LCD_ZNAK(' ');
}
LCD_KURSOR(x,y-1);
LCD_NAPIS(tekst);
}
void LCD_wdol(char x, char y, char dlugosc,char *tekst)
{
LCD_KURSOR(x,y);
for(i=dlugosc; i>0; i--)
{
LCD_ZNAK(' ');
}
LCD_KURSOR(x,y+1);
LCD_NAPIS(tekst);
}
void ZNAK_KLA(char znak) // TŁUMACZY ZNAK Z KLAWIAURY NA ASCI
{
switch (znak)
{
case 0x1C: letter='a';
break;
case 0x32: letter='b';
break ;
case 0x21: letter='c';
break ;
case 0x23: letter='d';
break;
case 0x24: letter='e';
break;
case 0x2B: letter='f';
break;
case 0x34: letter='g';
break;
case 0x33: letter='h';
break;
case 0x43: letter='i';
break;
case 0x3B: letter='j';
break;
case 0x42: letter='k';
break;
case 0x4B: letter='l';
break;
case 0x3A: letter='m';
break;
case 0x31: letter='n';
break;
case 0x44: letter='o';
break;
case 0x4D: letter='p';
break;
case 0x15: letter='q';
break;
case 0x2D: letter='r';
break;
case 0x1B: letter='s';
break;
case 0x2C: letter='t';
break;
case 0x3C: letter='u';
break;
case 0x1D: letter='w';
break;
case 0x22: letter='x';
break;
case 0x35: letter='y';
break;
case 0x1A: letter='z';
break;
case 0x29: letter=' ';
break;
case 0x16: letter='1';
break;
case 0x1E: letter='2';
break;
case 0x26: letter='3';
break;
case 0x25: letter='4';
break;
case 0x2E: letter='5';
break;
case 0x36: letter='6';
break;
case 0x3D: letter='7';
break;
case 0x3E: letter='8';
break;
case 0x46: letter='9';
break;
case 0x45: letter='0';
break;
default: letter =0;
}
/*else
{
case 0x1C: letter='A';
case 0x32: letter='B';
case 0x21: letter='C';
case 0x23: letter='D';
case 0x24: letter='E';
case 0x2B: letter='F';
case 0x34: letter='G';
case 0x33: letter='H';
case 0x43: letter='I';
case 0x3B: letter='J';
case 0x42: letter='K';
case 0x4B: letter='L';
case 0x3A: letter='M';
case 0x31: letter='N';
case 0x44: letter='O';
case 0x4D: letter='P';
case 0x15: letter='Q';
case 0x2D: letter='R';
case 0x1B: letter='S';
case 0x2C: letter='T';
case 0x3C: letter='U';
case 0x1D: letter='W';
case 0x22: letter='X';
case 0x35: letter='Y';
case 0x1A: letter='Z';
}*/
}
void przerw_0 (void) interrupt 0 using 1
{
switch(kla_licz)
{
case 0: klawiatura=0;
break;
case 1: if (T2) klawiatura|= 1;
break;
case 2: if (T2) klawiatura|= 1<<1;
break;
case 3: if (T2) klawiatura|= 1<<2;
break;
case 4: if (T2) klawiatura|= 1<<3;
break;
case 5: if (T2) klawiatura|= 1<<4;
break;
case 6: if (T2) klawiatura|= 1<<5;
break;
case 7: if (T2) klawiatura|= 1<<6;
break;
case 8: if (T2) klawiatura|= 1<<7;
kla_znak=klawiatura;
kla=1;
break;
case 9:
break;
case 10:kla_licz=-1;
break;
}
kla_licz++;
}
void main()
{
PLLCON=0; //12,56MHz
SPICON=0x33; //konfiguracja SPI zpraszam do noty katalogowej
IE=IE|0x81; //wlaczenie przerwan
IT0=1; //przerwanie na zborzu opadajacym
INIT_LCD();
LCD_CLEAR();
LCD_KURSOR(0,0);
SPI_konf(0x8F,0X80); //wyłącza zegar i zabezpieczenie zapisu
SPI_konf(0x8F,0X80); // to samo dla pewności
SPI_konf(0x80,0x00); //ustaniie sekundy
SPI_konf(0x81,0x03); //minuty
SPI_konf(0x82,0x03); //godziny
SPI_konf(0X82,0x02); //dzień po szczeguły zapraszam do noty katalogowej RTC
SPI_konf(0X82,0x0C); //data
SPI_konf(0X82,0x0D); //rok
SPI_konf(0x8F,0X40); //włączenie zegara
//LCD_NAPIS(napis);
LCD_GOTO(0,0x10);
//LCD_NAPIS(napis);
while(1)
{
/*if(kla) //wyświetlenie jednego znaku z zatrzasku z pominięciem wyświetlania potwierdzenia
{
if(kla_znak==0xF0)
j=1;
else
{
if(j==0)
{
ZNAK_KLA(kla_znak);
LCD_ZNAK(letter);
kla=0;
}
if(j==1)
{
j=0;
kla=0;
}
}
}*/
spi_dane=SPI_odb(0x00); // odbiór kolejno sekund, minut, godzin, dnia,... wymaga konfersji na bardziej zrozumiałą formę
LCD_ZNAK(spi_dane);
spi_dane=SPI_odb(0x01);
LCD_ZNAK(spi_dane);
spi_dane=SPI_odb(0x02);
LCD_ZNAK(spi_dane);
spi_dane=SPI_odb(0x03);
LCD_ZNAK(spi_dane);
kla_znak=0;
LCD_GOTO(0,0x10);
}
}
Wyszukiwarka
Podobne podstrony:
programator do Amigi
program do sp
Darmowy program do projektowania szaf wnekowych
program do zabawy w czytanie
programiki do elektroniki SPIS
Program do obliczania pól figur geometrycznych Polek 1 2 pl
Program do projektowania ulozenia kostki brukowej
README program do nauki języka holenderskiego niderlandzkiego
program do nauki pytań z materiałoznastwa 7
Algorytmy i struktury danych Programy do wykladu 3
program do nauki pytań z materiałoznastwa save
więcej podobnych podstron