Program: #include // konfigurace PICu #include // konfigurace rand // základní konfigurace #pragma config FOSC=INTIO67,PLLCFG=OFF,PRICLKEN=OFF,FCMEN=OFF,IESO=OFF,PWRTEN=ON #pragma config BOREN=OFF,BORV=190,WDTEN=OFF,WDTPS=1,PBADEN=OFF,MCLRE=INTMCLR #pragma config STVREN=OFF,LVP=OFF,DEBUG=OFF,CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF #pragma config CPB=OFF,CPD=OFF,WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTC=OFF #pragma config WRTB=OFF,WRTD=OFF,EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF #define LCDE LATEbits.LATE1 //konfigurace portu #define LCDRS LATEbits.LATE0 //konfigurace portu #define TLL PORTBbits.RB0 //konfigurace portu #define TLS PORTBbits.RB1 //konfigurace portu #define TLP PORTBbits.RB2 //konfigurace portu #define BZU LATBbits.LATB3 //konfigurace portu unsigned char prikaz,chyba,obtiznost,H1min1,H1min0,H1sek1,H1sek0,H2min1,H2min0,H2sek1,H2sek0,cislo,K1,K2,K3,K4,K5,K6,dig1000,dig100,dig10,dig1,pocet,hod,kostek; //konfigurace proměnných od 0 do 255 unsigned int cas,cashr1,cashr2; //konfigurace proměnných od 0 do 65 000 signed int soucet,soucet2; //konfigurace proměnných od -32 500 do 32 500 unsigned long b; // konfigurace proměnných od 0 do 2 000 000 //konfigurace podprogramů: void PICinit(); void LCDdelay(unsigned long b); void LCDinit(); void LCDsend(unsigned char prikaz); void LCDzapis(unsigned char prikaz); void LCDpozice(unsigned char prikaz); void Sachy(); void Rkc(); void Vyberhry(); void Kostky(); //******************************************************************************* // INICIACE PICu void PICinit() //začátek podprogramu { BSR=15; //povinný příkaz PORTA=0; //všechny výstupy portu A se rovnají 0 LATA=0; //všechny vstupy portu A se rovnají 0 TRISA=0; //vše výstup ANSELA=0; //vše digitální, 0 = digi, 1 = analog PORTE=0; //všechny výstupy portu E se rovnají 0 LATE=0; //všechny vstupy portu E se rovnají 0 TRISE=0; //vše výstup ANSELE=0; //vše digitální, 0 = digi, 1 = analog PORTB=0; //všechny výstupy portu B se rovnají 0 LATB=0; //všechny vstupy portu B se rovnají 0 TRISB=0b00000111; //piny RB0,1,2 jsou vstupy, ostatní jsou výstupy ANSELB=0; //vše digitální, 0 = digi, 1 = analog INTCON2=0; //povolení k WPUB WPUB=0b00000111; //piny RB0,1,2 mají vnitřní odpory, ostatní vnitřní odpory nemají OSCTUNE=0b10000000; // nastavení nízké frekvence oscilátoru OSCCON=0b00110000; // 1MHz interní oscilátor } //******************************************************************************* // ČASOVACÍ PODPROGRAM void LCDdelay(unsigned long b) //začátek podprogramu { for(;b>0;b--); //cykluj dokut nebude b 0 & odečti od b 1 } //******************************************************************************* // INICIACE LCD DISPLEJE void LCDinit()//začátek podprogramu { LCDdelay(150); // čekej 17 ms pro stabilizaci napájení LCDRS=0; //žádné resetování prikaz=0b00110000; // nastavení Function Set pro 8bitů LCDsend(prikaz); LCDdelay(50); // čekej 6 ms prikaz=0b00110000; // nastavení Function Set pro 8bitů LCDsend(prikaz); prikaz=0b00110000; // nastavení Function Set pro 8bitů LCDsend(prikaz); prikaz=0b00111000; // 2řádkový displej, 5x8 bodů LCDsend(prikaz); prikaz=0b00001100; // displej on, kurzor, blikání LCDsend(prikaz); prikaz=0b00000001; // vymaž displej LCDsend(prikaz); LCDdelay(50); // čekej 6 ms prikaz=0b00000110; // pozice přičítány, shift off LCDsend(prikaz); } //********************************************************************************************** // OVLÁDÁNÍ LCD DISPLEJE void LCDpozice(unsigned char prikaz) { LCDRS=0; LCDsend(prikaz); } void LCDzapis(unsigned char prikaz) { LCDRS=1; LCDsend(prikaz); } void LCDsend(unsigned char prikaz) { LATA=prikaz; LCDE=1; LCDdelay(1); LCDE=0; LCDdelay(1); } int putc(char c,FILE *f) { LCDzapis(c); return c; } //******************************************************************************* // POČÁTEČNÍ VÝBĚR HRY void Vyberhry() { // Úvodní obrazovka - výběr hry LCDpozice(128+0); printf("Sachy Kostky Rkc"); LCDpozice(192+0); printf(" < v > "); while(TLL==1 && TLS==1 && TLP==1); } // ><= //******************************************************************************************** // HLAVNÍ MENU ŠACHY - VOLBA DÉLKY HRY void Sachy() { BZU=1; LCDdelay(500); BZU=0; LCDpozice(128+0); printf(" S A C H Y "); LCDpozice(192+0); printf("Doba hry: min"); cas=0; while(TLS==1) { cas++; LCDpozice(202); LCDzapis(((cas/10)%10)+48); LCDzapis((cas%10)+48); LCDdelay(10000); if(cas==100) cas=1; } cas=(cas*600); //******************************************************************************************** // NASTAVENÍ ČASU NA ŠACHOVÝCH HODINÁCH LCDpozice(128+0); printf("Hrac 1 Hrac 2"); cashr1=cas; cashr2=cas; LCDpozice(192+0); printf(" "); LCDpozice(192+0); H1min1=(cashr1/6000)%10; LCDzapis(H1min1+48); H1min0=(cashr1/600)%10; LCDzapis(H1min0+48); printf(":"); H1sek1=((cashr1-(H1min1*6000)-(H1min0*600))/100)%10; LCDzapis(H1sek1+48); H1sek0=((cashr1-(H1min1*6000)-(H1min0*600))/10)%10; LCDzapis(H1sek0+48); LCDpozice(192+10); H2min1=(cashr2/6000)%10; LCDzapis(H2min1+48); H2min0=(cashr2/600)%10; LCDzapis(H2min0+48); printf(":"); H2sek1=((cashr2-(H2min1*6000)-(H2min0*600))/100)%10; LCDzapis(H2sek1+48); H2sek0=((cashr2-(H2min1*6000)-(H2min0*600))/10)%10; LCDzapis(H2sek0+48); //******************************************************************************************* // PŘEPÍNÁNÍ ŠACHOVÝCH HODIN MEZI HRÁČI LCDpozice(192+0); printf(" "); while(1) { BZU=1; LCDdelay(500); BZU=0; //******************************************************************************************* // BĚŽÍ ČAS HRÁČI 1 while(TLL==1) { LCDpozice(192+0); H1min1=(cashr1/6000)%10; LCDzapis(H1min1+48); H1min0=(cashr1/600)%10; LCDzapis(H1min0+48); printf(":"); H1sek1=((cashr1-(H1min1*6000)-(H1min0*600))/100)%10; LCDzapis(H1sek1+48); H1sek0=((cashr1-(H1min1*6000)-(H1min0*600))/10)%10; LCDzapis(H1sek0+48); LCDpozice(192+10); H2min1=(cashr2/6000)%10; LCDzapis(H2min1+48); H2min0=(cashr2/600)%10; LCDzapis(H2min0+48); printf(":"); H2sek1=((cashr2-(H2min1*6000)-(H2min0*600))/100)%10; LCDzapis(H2sek1+48); H2sek0=((cashr2-(H2min1*6000)-(H2min0*600))/10)%10; LCDzapis(H2sek0+48); cashr1--; if(cashr1==0) { BZU=1; LCDdelay(10000); BZU=0; LCDdelay(5000); BZU=1; LCDdelay(10000); BZU=0; LCDdelay(5000); BZU=1; LCDdelay(10000); BZU=0; while(1); } LCDdelay(385); } BZU=1; LCDdelay(500); BZU=0; //******************************************************************************************** // BĚŽÍ ČAS HRÁČI 2 while(TLP==1) { LCDpozice(192+0); H1min1=(cashr1/6000)%10; LCDzapis(H1min1+48); H1min0=(cashr1/600)%10; LCDzapis(H1min0+48); printf(":"); H1sek1=((cashr1-(H1min1*6000)-(H1min0*600))/100)%10; LCDzapis(H1sek1+48); H1sek0=((cashr1-(H1min1*6000)-(H1min0*600))/10)%10; LCDzapis(H1sek0+48); LCDpozice(192+10); H2min1=(cashr2/6000)%10; LCDzapis(H2min1+48); H2min0=(cashr2/600)%10; LCDzapis(H2min0+48); printf(":"); H2sek1=((cashr2-(H2min1*6000)-(H2min0*600))/100)%10; LCDzapis(H2sek1+48); H2sek0=((cashr2-(H2min1*6000)-(H2min0*600))/10)%10; LCDzapis(H2sek0+48); cashr2--; if(cashr2==0) { BZU=1; LCDdelay(10000); BZU=0; LCDdelay(5000); BZU=1; LCDdelay(10000); BZU=0; LCDdelay(5000); BZU=1; LCDdelay(10000); BZU=0; while(1); } LCDdelay(385); } } } //******************************************************************************************** // PODPROGRAM HÁZENÍ 6 KOSTKAMI void Kostky() { // DEFINICE ZNAKŮ HOZENÝCH KOSTEK LCDpozice(64); // kostka 1 LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00001110); LCDzapis(0b00001110); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDpozice(72); //kostka 2 LCDzapis(0b00011000); LCDzapis(0b00011000); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00000011); LCDzapis(0b00000011); LCDpozice(80); //kostka 3 LCDzapis(0b00011000); LCDzapis(0b00011000); LCDzapis(0b00000000); LCDzapis(0b00001110); LCDzapis(0b00001110); LCDzapis(0b00000000); LCDzapis(0b00000011); LCDzapis(0b00000011); LCDpozice(88); //kostka 4 LCDzapis(0b00011011); LCDzapis(0b00011011); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00000000); LCDzapis(0b00011011); LCDzapis(0b00011011); LCDpozice(96); //kostka 5 LCDzapis(0b00011011); LCDzapis(0b00011011); LCDzapis(0b00000000); LCDzapis(0b00001110); LCDzapis(0b00001110); LCDzapis(0b00000000); LCDzapis(0b00011011); LCDzapis(0b00011011); LCDpozice(104); //kostka 6 LCDzapis(0b00011011); LCDzapis(0b00011011); LCDzapis(0b00000000); LCDzapis(0b00011011); LCDzapis(0b00011011); LCDzapis(0b00000000); LCDzapis(0b00011011); LCDzapis(0b00011011); kostek=6; hod=1; soucet2=0; //******************************************************************************************** // HOD KOSTKOU LCDpozice(128+0); printf(" Hry s kostkami "); LCDpozice(192); printf("< Hody Bandita >"); LCDdelay(10000); while(TLL==1 && TLP==1); if(TLL==0) { while(1) { while(TLP==1) { K1=0; K2=0; K3=0; K4=0; K5=0; K6=0; LCDpozice(192); printf(" >"); LCDpozice(128+0); printf(" "); LCDpozice(128); printf("Hod"); LCDpozice(131); LCDzapis(hod+48); printf(" "); for(b=0;b0) LCDzapis(dig1000+48); dig100=(soucet/100)%10; if((((soucet/100)%10)==0)&&(((soucet/1000)%10)==0)); else LCDzapis(dig100+48); dig10=(soucet/10)%10; if((((soucet/100)%10)==0)&&(((soucet/1000)%10)==0)&&(((soucet/10)%10)==0)); else LCDzapis(dig10+48); dig1=soucet%10; LCDzapis(dig1+48); printf("/"); dig1000=(soucet2/1000)%10; if(((soucet2/1000)%10)>0) LCDzapis(dig1000+48); dig100=(soucet2/100)%10; if((((soucet2/100)%10)==0)&&(((soucet2/1000)%10)==0)); else LCDzapis(dig100+48); dig10=(soucet2/10)%10; if((((soucet2/100)%10)==0)&&(((soucet2/1000)%10)==0)&&(((soucet2/10)%10)==0)); else LCDzapis(dig10+48); dig1=soucet2%10; LCDzapis(dig1+48); printf(" ("); LCDzapis(kostek-pocet+48); printf(")"); if (soucet2>=1000) { BZU=1; LCDdelay(10000); BZU=0; } if (soucet==0) { BZU=1; LCDdelay(1000); BZU=0; LCDdelay(1000); BZU=1; LCDdelay(1000); BZU=0; LCDdelay(1000); BZU=1; LCDdelay(1000); BZU=0; } while(TLL==1 && TLS==1); if(TLL==0 && soucet>0 && pocet"); LCDpozice(128+0); printf(" "); LCDpozice(132); for(b=0;b<3;) { cislo=rand()%10; if (cislo<6) { LCDzapis(cislo); printf(" "); b++; if(cislo==0) K1=K1+1; if(cislo==1) K2=K2+1; if(cislo==2) K3=K3+1; if(cislo==3) K4=K4+1; if(cislo==4) K5=K5+1; if(cislo==5) K6=K6+1; } } soucet=0; chyba=0; if(K1==3 || K2==3 || K3==3 || K4==3 || K5==3 || K6==3) soucet=10; for(b=(10000/obtiznost);b>0;b--) { if(TLP==0) chyba=1; } } if(soucet==0 && chyba==1) soucet=-10; if(soucet>0 && chyba==1) soucet=obtiznost*soucet; if(soucet>0 && chyba==0) soucet=-10; soucet2=soucet2+soucet; LCDpozice(192); printf("< "); LCDpozice(195); if(soucet>=0) { dig1000=(soucet/1000)%10; dig100=(soucet/100)%10; dig10=(soucet/10)%10; dig1=soucet%10; } else { dig1000=(-soucet/1000)%10; dig100=(-soucet/100)%10; dig10=(-soucet/10)%10; dig1=-soucet%10; } if(soucet<0) printf("-"); if(dig1000>0) LCDzapis(dig1000+48); if(dig100==0 && dig1000==0); else LCDzapis(dig100+48); if(dig100==0 && dig1000==0 && dig10==0); else LCDzapis(dig10+48); LCDzapis(dig1+48); printf("/"); if(soucet2>=0) { dig1000=(soucet2/1000)%10; dig100=(soucet2/100)%10; dig10=(soucet2/10)%10; dig1=soucet2%10; } else { dig1000=(-soucet2/1000)%10; dig100=(-soucet2/100)%10; dig10=(-soucet2/10)%10; dig1=-soucet2%10; } if(soucet2<0) printf("-"); if(dig1000>0) LCDzapis(dig1000+48); if(dig100==0 && dig1000==0); else LCDzapis(dig100+48); if(dig100==0 && dig1000==0 && dig10==0); else LCDzapis(dig10+48); LCDzapis(dig1+48); if (soucet2>=1000) { BZU=1; LCDdelay(10000); BZU=0; } if (soucet2<=-1000) { BZU=1; LCDdelay(1000); BZU=0; LCDdelay(1000); BZU=1; LCDdelay(1000); BZU=0; LCDdelay(1000); BZU=1; LCDdelay(1000); BZU=0; } while(TLL==1); } } //****************************************************************************************** void Rkc() { LCDpozice(128+0); printf("Rychlost reakce "); LCDpozice(192); printf("< Akust Vizual >"); LCDdelay(10000); while(TLL==1 && TLP==1); while(1) { if(TLL==0) { chyba=0; LCDpozice(128+0); printf("Stiskni prostr. "); LCDpozice(192); printf("tl. po zapipnuti"); for(b=10000;b>0;b--) { if(TLS==0) chyba=1; } cas=rand(); for(b=cas;b>0;b--) { if(TLS==0) chyba=1; } cashr1=0; while(TLS==1) { cashr1++; BZU=1; LCDdelay(8); } if(chyba==1) { BZU=0; LCDpozice(192); printf("Moc brzo,troubo!"); } else { BZU=0; LCDpozice(128+0); printf("Rychlost reakce:"); LCDpozice(192); printf(" "); LCDpozice(192); printf("< "); dig1000=(cashr1/1000)%10; LCDzapis(dig1000+48); dig100=(cashr1/100)%10; LCDzapis(dig100+48); dig10=(cashr1/10)%10; LCDzapis(dig10+48); dig1=cashr1%10; LCDzapis(dig1+48); printf(" ms"); } while(TLL==1); } //***************************************************************************************** // VIZUÁLNÍ REAKCE if(TLP==0) { chyba=0; LCDpozice(128+0); printf("Stiskni prostr. "); LCDpozice(192); printf("tlac. pri 5: "); for(b=10000;b>0;b--) { if(TLS==0) chyba=1; } cislo=0; while(cislo!=5) { for(b=10000;b>0;b--) { if(TLS==0) chyba=1; } cislo=rand()%10; LCDpozice(206); LCDzapis(cislo+48); } cashr1=0; while(TLS==1) { cashr1++; LCDdelay(8); } if(chyba==1) { LCDpozice(192); printf("Moc brzo,troubo!"); } else { LCDpozice(128+0); printf("Rychlost reakce:"); LCDpozice(192); printf(" "); LCDpozice(192); printf(" "); dig1000=(cashr1/1000)%10; LCDzapis(dig1000+48); dig100=(cashr1/100)%10; LCDzapis(dig100+48); dig10=(cashr1/10)%10; LCDzapis(dig10+48); dig1=cashr1%10; LCDzapis(dig1+48); printf(" ms >"); } while(TLP==1); } } while(1); } //********************************************************************************************* // HLAVNÍ PROGRAM void main() { PICinit(); LCDinit(); Vyberhry(); if(TLL==0) Sachy(); if(TLS==0) Kostky(); if(TLP==0) Rkc(); while(1); }