Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<msp430x14x.h>
- #include "lcd.h"
- #include "portyLcd.h"
- #include "uart.h"
- #include "portyUart.h"
- #include <time.h>
- #include <stdio.h>
- #include <stdlib.h>
- #define STATUS_ON P2OUT&=~BIT1
- #define STATUS_OFF P2OUT|=BIT1
- #define BUZ1_HI P4OUT|=BIT2
- #define BUZ1_LOW P4OUT&=~BIT2
- #define BUZ2_HI P4OUT|=BIT3
- #define BUZ2_LOW P4OUT&=~BIT3
- #define FREQ_BUZ 2000
- #define LIGHT 2
- #define BUZZER 2
- #define IloscZyc 4
- #define B1 P4IN&BIT4
- #define B2 P4IN&BIT5
- #define B3 P4IN&BIT6
- #define B4 P4IN&BIT7
- #include "portyUart.h"
- #include "uart.h"
- char poziomy_trudnosci1[] = { 'D', 'i', 'f', 'f', 'i', 'c', 'u', 'l', 't', 'y', ':' };
- char opis_gry[] = { 'D', 'i', 'f', 'f', 'i', 'c', 'u', 'l', 't', 'y', ':' };
- char macierz[][16] = {
- { 'G','a','m','e',' ','d','e','s','c','r','i','p','t','i','o','n'},
- { 'T','h','e',' ','g','a','m','e',' ','i','s',' ','t','o',' ',' ' },
- { 'r','e','p','e','a','t',' ','a',' ','s','e','q','u','e','n','-' },
- { 'c','e','s',' ','o','f',' ','n','u','m','b','e','r',' ',' ',' ' },
- { 'u','s','i','n','g',' ','b','u','t','t','o','n','s','.',' ',' ' },
- { ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ' },
- };
- int goToDraw = 1;
- char Bufor[30]; // bufor odczytywanych danych
- int low = 0; // znacznik począteku danych w buforze
- int high = 0;
- //---------------- zmienne globalne -------------
- char napis[] = { 'P', ':', 'H', ':' };
- unsigned int i = 0;
- unsigned int sekundy = 0;
- unsigned int licznik = 0;
- int Punkty = 0;
- int przycisniety_przycisk = 0;
- int iteracja = 0;
- int wynik[4];
- int czas = 1, zycia = IloscZyc, StanGry = 1;
- int czy_chcemy_wyswietlac = 1;
- char GameOver[] = { 'G', 'a', 'm', 'e', ' ', 'O', 'v', 'e', 'r' };
- char opisgry[] = { 'P', 'l', 'a', 'y', ' ', '1', ' ', 'S', 'c', 'o', 'r', 'e', 's', ' ', '2' };
- char opisgry1[] = { 'D', 'e', 's', 'c', 'r', 'i', 'p', ' ', '3', ' ', 'L', 'e', 'v', 'e', 'l', '4' };
- int max1 = 0;
- int max2 = 0;
- int max3 = 0;
- void initPortyUart(void)
- {
- P3SEL |= Tx + Rx;
- P3DIR |= Tx;
- P3DIR &= ~Rx;
- }
- void initUart(int Speed)
- {
- int i;
- BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL 8MHz
- do
- {
- IFG1 &= ~OFIFG; // Czyszczenie flgi OSCFault
- for (i = 0xFF; i > 0; i--) ; // odczekanie
- }
- while ((IFG1 & OFIFG)); // dopóki OSCFault jest ci1gle ustawiona
- BCSCTL2 |= SELM1 + SELM0; // MCLK =LFXT1
- switch (Speed)
- {
- case 1200:
- {
- ME1 |= UTXE0 + URXE0; // W31czenie USART0 TXD/RXD
- UCTL0 |= CHAR; // 8-bitów
- UTCTL0 |= SSEL0; // UCLK = ACLK
- UBR00 = 0x0A; // 8MHz/Speed in Bauds
- UBR10 = 0x1A; //
- UMCTL0 = 0x5B; // Modulation
- UCTL0 &= ~SWRST; // Inicjalizacja UARTA
- IE1 |= URXIE0; // W31czenie przerwan od RX
- break;
- }
- }
- }
- //---------------- wysy3anie znaku ---------
- void UartCharTransmit(unsigned char znak)
- {
- while ((IFG1 & UTXIFG0) == 0) ; // gdy uk31d nie jest zajety
- TXBUF0 = znak; // wysy3amy znak
- }
- //---------------- wysy3anie napisu ----------
- void UartStringTransmit(char* napis)
- {
- while (*napis)
- UartCharTransmit(*napis++);
- }
- void Clock(void);
- void delay(unsigned int n)
- {
- unsigned int i;
- for (i = 0; i < n; i++) { };
- }
- void draw()
- {
- for (int i = 0; i < 4; i++)
- {
- Delayx100us(5); Delayx100us(5); Delayx100us(5); Delayx100us(5); Delayx100us(5); Delayx100us(5);
- wynik[i] = (rand() % 4) + 1;
- Delayx100us(5);
- }
- for (int p = 0; p < 200; p++)
- {
- Delayx100us(5);
- }
- for (int i = 0; i < 4; i++)
- {
- SEND_CMD(CUR_SHIFT_LEFT);
- }
- SEND_CMD(DD_RAM_ADDR);
- }
- void gameDescription()
- {
- clearDisplay();
- SEND_CMD(DD_RAM_ADDR);
- for (int o = 0; o < 6; o++)
- {
- SEND_CMD(DD_RAM_ADDR);
- for (int j = 0; j < 16; j++)
- SEND_CHAR(macierz[o][j]);
- SEND_CMD(DD_RAM_ADDR2);
- o++;
- for (int j = 0; j < 16; j++)
- SEND_CHAR(macierz[o][j]);
- for (int o = 0; o < 60; o++)
- Delay(40000);
- clearDisplay();
- }
- }
- void wypisz()
- {
- for (int o = 0; o < 3; o++)
- SEND_CHAR(' ');
- for (int o = 0; o < 2; o++)
- SEND_CHAR(napis[o]);
- printDecDigit(Punkty / 10);
- printDecDigit(Punkty % 10);
- SEND_CHAR(' ');
- for (int o = 2; o < 4; o++)
- SEND_CHAR(napis[o]);
- printDecDigit(zycia);
- }
- void inscriptionLevelsOfDifficulty()
- {
- SEND_CMD(DD_RAM_ADDR);
- for (int o = 0; o < 11; o++)
- SEND_CHAR(poziomy_trudnosci1[o]);
- SEND_CMD(DD_RAM_ADDR2);
- SEND_CHAR(' ');
- printDecDigit(1);
- for (int o = 0; o < 3; o++)
- SEND_CHAR(' ');
- printDecDigit(2);
- for (int o = 0; o < 3; o++)
- SEND_CHAR(' ');
- printDecDigit(3);
- for (int o = 0; o < 3; o++)
- SEND_CHAR(' ');
- printDecDigit(4);
- for (int o = 0; o < 3; o++)
- SEND_CHAR(' ');
- for (int o = 0; o < 60; o++)
- Delay(4000);
- }
- void theBestResults()
- {
- clearDisplay();
- SEND_CMD(DD_RAM_ADDR);
- printDecDigit(max3 / 10);
- printDecDigit(max3 % 10);
- SEND_CHAR(' ');
- for (int o = 0; o < 30; o++)
- Delay(40000);
- printDecDigit(max2 / 10);
- printDecDigit(max2 % 10);
- SEND_CHAR(' ');
- for (int o = 0; o < 30; o++)
- Delay(40000);
- printDecDigit(max1 / 10);
- printDecDigit(max1 % 10);
- SEND_CHAR(' ');
- for (int o = 0; o < 60; o++)
- Delay(40000);
- clearDisplay();
- }
- void buzz()
- {
- P2DIR |= 0x02; // ustawienie P2.1 jako wyjocie
- P4DIR |= BIT2 | BIT3; // P4.2 i P4.3 wyjocia
- BUZ1_LOW;
- BUZ2_LOW;
- int k = 0;
- for (;;)
- {
- for (i = 0; i < BUZZER; i++) //uruchomienie brzeczyka
- {
- BUZ1_LOW;
- BUZ2_HI;
- delay(FREQ_BUZ);
- BUZ1_HI;
- BUZ2_LOW;
- delay(FREQ_BUZ);
- }
- BUZ1_LOW;
- k++;
- if (k == 50)
- break;
- }
- }
- //----------------- main program -------------------
- void main(void )
- {
- P2DIR |= BIT1;
- P4DIR &= ~BIT4;
- P4DIR &= ~BIT5;
- P4DIR &= ~BIT6;
- P4DIR &= ~BIT7;
- WDTCTL = WDTPW + WDTHOLD; // wyłączenie WDT
- InitPortsLcd(); // inicjalizacja portów LCD
- InitLCD(); // czyszczenie wyświetlacza
- initPortyUart(); // inicjalizacja LCD
- clearDisplay(); // czyszczenie wyświetlacza
- srand(time(NULL));
- // Basic Clock Module ustawiamy na ACLK(zegar 8 MHz ) i dzielimy częstotliwość przez 2 (4 MHz)
- BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL 8MHz
- do
- {
- IFG1 &= ~OFIFG; // Czyszczenie flgi OSCFault
- for (int i = 0xFF; i > 0; i--) ; // odczekanie
- }
- while ((IFG1 & OFIFG) == OFIFG); // dopóki OSCFault jest ciągle ustawiona
- //BCSCTL1 |= DIVA_1; // ACLK=8 MHz/2=4 MHz
- BCSCTL2 |= SELM0 | SELM1; // MCLK= LFTX1 =ACLK
- // Timer_A ustawiamy na 500 kHz
- // a przerwanie generujemy co 100 ms
- TACTL = TASSEL_1 + MC_1 + ID_3; // Wybieram ACLK, ACLK/8=500kHz,tryb Up
- CCTL0 = CCIE; // włączenie przerwań od CCR0
- CCR0 = 50000; // podzielnik 50000: przerwanie co 100 ms
- ME1 |= UTXE0 + URXE0; // W31czenie USART0 TXD/RXD
- UCTL0 |= CHAR; // 8-bitów
- UTCTL0 |= SSEL0; // UCLK = ACLK
- UBR00 = 0x0A; // 8MHz/Speed in Bauds
- UBR10 = 0x1A; //
- UMCTL0 = 0x5B; // Modulation
- UCTL0 &= ~SWRST; // Inicjalizacja UARTA
- IE1 |= URXIE0;
- _EINT();
- clearDisplay();
- P2OUT |= BIT1;
- while (1)
- {
- while (1)
- {
- if ((B1) && (B2) && (B3) && (B4))
- {
- SEND_CMD(DD_RAM_ADDR);
- for (int p = 0; p < 15; p++)
- SEND_CHAR(opisgry[p]);
- SEND_CMD(DD_RAM_ADDR2);
- for (int p = 0; p < 16; p++)
- SEND_CHAR(opisgry1[p]);
- }
- else if (!(B1))
- {
- clearDisplay();
- break;
- }
- else if (!(B2))
- {
- theBestResults();
- }
- else if (!(B3))
- {
- gameDescription();
- }
- else if (!(B4))
- {
- clearDisplay();
- inscriptionLevelsOfDifficulty();
- while (1)
- {
- if (!(B1))
- {
- czas = 8;
- for (int o = 0; o < 60; o++)
- {
- Delay(4000);
- }
- break;
- //goto start;
- }
- if (!(B2))
- {
- czas = 4;
- for (int o = 0; o < 60; o++)
- {
- Delay(4000);
- }
- break;
- //goto start;
- }
- if (!(B3))
- {
- for (int o = 0; o < 60; o++)
- {
- Delay(4000);
- }
- czas = 2;
- break;
- //goto start;
- }
- if (!(B4))
- {
- for (int o = 0; o < 60; o++)
- {
- Delay(4000);
- }
- czas = 1;
- break;
- //goto start;
- }
- }
- }
- }
- for (int o = 0; o < 5; o++)
- Delay(40000);
- for (int p = 0; p < 200; p++)
- {
- Delayx100us(5);
- }
- for (; ; )
- {
- if (goToDraw == 1)
- {
- draw();
- goToDraw = 0;
- }
- _BIS_SR(LPM3_bits); // przejscie do trybu LPM3
- if (czy_chcemy_wyswietlac == 1)
- Clock();
- if (czy_chcemy_wyswietlac == 0)
- {
- SEND_CMD(DD_RAM_ADDR);
- if (!(B1) && wynik[iteracja] == 1)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- printDecDigit(wynik[iteracja]);
- UartStringTransmit("1");
- wypisz();
- iteracja++;
- P2OUT &= ~BIT1;
- Delayx100us(500);
- P2OUT |= BIT1;
- SEND_CMD(CUR_SHIFT_RIGHT);
- }
- else if (!(B1) && wynik[iteracja] != 1)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- if (zycia != 0)
- zycia--;
- SEND_CHAR(' ');
- wypisz();
- buzz();
- }
- if (!(B2) && wynik[iteracja] == 2)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- printDecDigit(wynik[iteracja]);
- UartStringTransmit("2");
- wypisz();
- iteracja++;
- SEND_CMD(CUR_SHIFT_RIGHT);
- P2OUT &= ~BIT1;
- Delayx100us(500);
- P2OUT |= BIT1;
- }
- else if (!(B2) && wynik[iteracja] != 2)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- if (zycia != 0)
- zycia--;
- SEND_CHAR(' ');
- wypisz();
- buzz();
- }
- if (!(B3) && wynik[iteracja] == 3)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- printDecDigit(wynik[iteracja]);
- UartCharTransmit('3');
- wypisz();
- iteracja++;
- SEND_CMD(CUR_SHIFT_RIGHT);
- P2OUT &= ~BIT1;
- Delayx100us(500);
- P2OUT |= BIT1;
- }
- else if (!(B3) && wynik[iteracja] != 3)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- if (zycia != 0)
- zycia--;
- SEND_CHAR(' ');
- wypisz();
- buzz();
- }
- if (!(B4) && wynik[iteracja] == 4)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- printDecDigit(wynik[iteracja]);
- UartStringTransmit("4");
- wypisz();
- iteracja++;
- SEND_CMD(CUR_SHIFT_RIGHT);
- P2OUT &= ~BIT1;
- Delayx100us(500);
- P2OUT |= BIT1;
- }
- else if (!(B4) && wynik[iteracja] != 4)
- {
- for (int o = 0; o < 5; o++)
- Delay(40000);
- if (zycia != 0)
- zycia--;
- SEND_CHAR(' ');
- wypisz();
- buzz();
- }
- while (high != low) // gdy odebrano dane
- {
- putc(Bufor[low]); // wypisanie danych na wyświetlaczu
- low = (++low) % 30; // inkrementowanie znaczika początka danych
- }
- if (iteracja == 4)
- {
- czy_chcemy_wyswietlac = 1;
- iteracja = 0;
- UartStringTransmit(" ");
- Punkty++;
- clearDisplay();
- goToDraw = 1;
- //goto nowe_losowanie;
- }
- if (zycia <= 0)
- {
- clearDisplay();
- for (int j = 0; j < 9; j++)
- {
- SEND_CHAR(GameOver[j]);
- StanGry = 0;
- }
- UartCharTransmit('\n');
- if (Punkty > max3) { max3 = Punkty; }
- else if (Punkty <= max3 || Punkty > max2) { max2 = Punkty; }
- else if (Punkty <= max2 || Punkty > max1) { max1 = Punkty; }
- for (int o = 0; o < 40; o++)
- Delay(40000);
- StanGry = 1;
- czy_chcemy_wyswietlac = 1;
- zycia = IloscZyc;
- Punkty = 0;
- break;
- }
- //SEND_CMD(CUR_SHIFT_RIGHT );
- }
- }
- }
- }
- void Clock(void)
- {
- if (licznik % 10 == 0 && czy_chcemy_wyswietlac == 1) // jesli minie sek
- {
- licznik = 0; //zapal diodę
- // licz sekundy
- if (sekundy == czas) //jesli skonczy sie czas od zycia
- {
- clearDisplay();
- czy_chcemy_wyswietlac = 0;
- sekundy = 0;
- return;
- }
- sekundy = sekundy % czas;
- for (int i = 0; i < 4; i++)
- printDecDigit(wynik[i]); //wyswietl liczbe sekund
- ++sekundy;
- SEND_CMD(CUR_SHIFT_LEFT); // wróć kursorem na początek
- SEND_CMD(CUR_SHIFT_LEFT);
- SEND_CMD(CUR_SHIFT_LEFT);
- SEND_CMD(CUR_SHIFT_LEFT);
- }
- }
- // procedura obsługi przerwania od TimerA
- #pragma vector=TIMERA0_VECTOR
- __interrupt void Timer_A(void)
- {
- ++licznik;
- _BIC_SR_IRQ(LPM3_bits);
- // wyjście z trybu LPM3
- }
- // procedura obsługi przerwania UART
- #pragma vector=UART0RX_VECTOR
- __interrupt void usart0_rx(void)
- {
- Bufor[high] = RXBUF0; // wpisanie odebranych danych do bufora
- high = (++high) % 30; // inkrementowanie znacznika końca danych
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement