Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.71 KB | None | 0 0
  1. #include<msp430x14x.h>
  2. #include "lcd.h"
  3. #include "portyLcd.h"
  4. //---------------- zmienne globalne -------------
  5. unsigned int i=0;
  6. unsigned int sekundy=0;
  7. unsigned int licznik=0;
  8. int tablica[2][16];
  9. char polozenie = 'R';
  10. int wynik = 0;
  11. int tablicaWynikowa[4] = {0,0,0,0};
  12. int tablicaBEST[4] = {0,0,0,0};
  13. int FlagaPozycji = 1;
  14. int best = 0;
  15. int trudnosc = 4;
  16.  
  17. #define     POS                 0x00
  18.  
  19. void defineChars() {
  20.     //statek
  21.     SEND_CMD(0x40); SEND_CHAR(0x01); SEND_CMD(0x41); SEND_CHAR(0x03); SEND_CMD(0x42); SEND_CHAR(0x07);
  22.     SEND_CMD(0x43); SEND_CHAR(0x1C); SEND_CMD(0x44); SEND_CHAR(0x1C); SEND_CMD(0x45); SEND_CHAR(0x07);
  23.     SEND_CMD(0x46); SEND_CHAR(0x03); SEND_CMD(0x47); SEND_CHAR(0x01);
  24.        
  25.         // przeszkoda
  26.     SEND_CMD(0x48); SEND_CHAR(0x00); SEND_CMD(0x49); SEND_CHAR(0x04); SEND_CMD(0x4A); SEND_CHAR(0x0E);
  27.     SEND_CMD(0x4B); SEND_CHAR(0x1F); SEND_CMD(0x4C); SEND_CHAR(0x1F); SEND_CMD(0x4D); SEND_CHAR(0x0E);
  28.     SEND_CMD(0x4E); SEND_CHAR(0x04); SEND_CMD(0x4F); SEND_CHAR(0x00);
  29.        
  30.    
  31. }
  32.  
  33.  
  34. int _random(void){
  35.     ADC12CTL0 |= ADC12SC;           //starting single ADC conversion
  36.  
  37.     while(ADC12CTL1 & ADC12BUSY);   //wait unill conversion ends
  38.     return ADC12MEM0 % 256;
  39. }
  40.  
  41.  
  42.  
  43. void RuszLewo(){
  44.     polozenie = 'L';
  45. }
  46.  
  47. void RuszPrawo(){
  48.     polozenie = 'R';
  49. }
  50.  
  51. void Generuj(){
  52.  
  53.     static int zmienna, ile;
  54.     zmienna=!zmienna;
  55.  
  56.     if(zmienna){
  57.         int los = _random()%2;
  58.         int los2 = ile++ % 4 == 3 ? 0 : _random()%10;
  59.  
  60.         tablica[los][0] = los2 && los2 > 3 ? 1 : 0;
  61.         tablica[!los][0] = 0;
  62.     }
  63.    
  64.     else{
  65.         tablica[0][0] = tablica[1][0] = 0;
  66.     }
  67. }
  68.  
  69. void PrzesunTor(){
  70.  
  71.     for(int i=15; i>=0; i--){
  72.         if(tablica[0][i]==1){
  73.            
  74.             if(i == 15)
  75.                 tablica[0][i] = 0;
  76.            
  77.             else{
  78.                 tablica[0][i+1]=1;
  79.                 tablica[0][i]=0;
  80.             }
  81.         }
  82.  
  83.         if(tablica[1][i]==1){
  84.            
  85.             if(i == 15)
  86.                 tablica[1][i] = 0;
  87.            
  88.             else{
  89.                 tablica[1][i+1]=1;
  90.                 tablica[1][i]=0;
  91.             }
  92.  
  93.         }
  94.     }
  95. }
  96.  
  97.     void WyswietlStatek(){
  98.         if(polozenie == 'L'){
  99.             SEND_CMD(DD_RAM_ADDR2);
  100.             int i = 15;
  101.             while(i--)
  102.                 SEND_CMD(CUR_SHIFT_RIGHT);
  103.         SEND_CHAR(0x00);
  104.         }
  105.        
  106.         if(polozenie == 'R'){
  107.             SEND_CMD(DD_RAM_ADDR);
  108.             int i = 15;
  109.             while(i--)
  110.                 SEND_CMD(CUR_SHIFT_RIGHT);
  111.         SEND_CHAR(0x00);
  112.         }
  113.     }
  114.    
  115.     void Bestuj(){
  116.         if(wynik > best){
  117.             best = wynik;
  118.             tablicaBEST[3]=tablicaWynikowa[3];
  119.             tablicaBEST[2]=tablicaWynikowa[2];
  120.             tablicaBEST[1]=tablicaWynikowa[1];
  121.             tablicaBEST[0]=tablicaWynikowa[0];
  122.         }
  123.     }
  124.        
  125.        
  126.        
  127.        
  128.        
  129.    
  130. void WyrzucTorNaEkran(){
  131.     SEND_CMD(DD_RAM_ADDR);
  132.     for (int i = 0; i <= 16; i++)
  133.         SEND_CHAR(tablica[0][i] ? 0x01 : ' ');
  134.  
  135.     SEND_CMD(DD_RAM_ADDR2);
  136.     for (int i = 0; i <= 16; i++)
  137.         SEND_CHAR(tablica[1][i] ? 0x01 : ' ');
  138.    
  139.     WyswietlStatek();
  140. }
  141.  
  142. void LiczWynik(){
  143.     if(tablica[0][15] == 1 || tablica[1][15])
  144.         wynik++;
  145.  
  146. }
  147.  
  148. int CzyGameOver(){
  149.     if(tablica[0][15] == 1 && polozenie == 'R')
  150.         return 1;
  151.     if(tablica[1][15] == 1 && polozenie == 'L')
  152.         return 1;
  153.     return 0;
  154. }
  155.  
  156.  
  157. void MenuStart(){
  158.    
  159.     SEND_CMD(DD_RAM_ADDR);
  160.     SEND_CHAR(' ');
  161.      SEND_CHAR(' ');
  162.      SEND_CHAR('S');
  163.      SEND_CHAR('A');
  164.      SEND_CHAR('M');
  165.      SEND_CHAR('O');
  166.      SEND_CHAR('C');
  167.      SEND_CHAR('H');
  168.      SEND_CHAR('O');
  169.      SEND_CHAR('D');
  170.      SEND_CHAR('Z');
  171.      SEND_CHAR('I');
  172.      SEND_CHAR('K');
  173.      SEND_CHAR('I');
  174.      
  175.     SEND_CMD(DD_RAM_ADDR2);
  176.     SEND_CHAR('P');
  177.     SEND_CHAR('R');
  178.     SEND_CHAR('E');
  179.     SEND_CHAR('S');
  180.     SEND_CHAR('S');
  181.     SEND_CHAR(' ');
  182.     SEND_CHAR('3');
  183.     SEND_CHAR(' ');
  184.     SEND_CHAR('T');
  185.     SEND_CHAR('O');
  186.     SEND_CHAR(' ');
  187.     SEND_CHAR('S');
  188.     SEND_CHAR('T');
  189.     SEND_CHAR('A');
  190.     SEND_CHAR('R');
  191.     SEND_CHAR('T');
  192.    
  193.     for( ;; ){
  194.         if((BIT6&P4IN)==0)
  195.             break;
  196.     }
  197. }
  198.  
  199. void GameOver(){
  200.     Bestuj();
  201.      SEND_CMD(DD_RAM_ADDR);
  202.      SEND_CHAR('R');
  203.      SEND_CHAR('E');
  204.      SEND_CHAR('S');
  205.      SEND_CHAR('U');
  206.      SEND_CHAR('L');
  207.      SEND_CHAR('T');
  208.      SEND_CHAR('=');
  209.      printDecDigit(tablicaWynikowa[0]);
  210.      printDecDigit(tablicaWynikowa[1]);
  211.      printDecDigit(tablicaWynikowa[2]);
  212.      printDecDigit(tablicaWynikowa[3]);
  213.      SEND_CHAR(' ');
  214.      SEND_CHAR(' ');
  215.      SEND_CHAR(' ');
  216.      SEND_CHAR('4');
  217.      SEND_CHAR(' ');
  218.      
  219.      
  220.      SEND_CMD(DD_RAM_ADDR2);
  221.      SEND_CHAR('R');
  222.      SEND_CHAR('E');
  223.      SEND_CHAR('C');
  224.      SEND_CHAR('O');
  225.      SEND_CHAR('R');
  226.      SEND_CHAR('D');
  227.      SEND_CHAR('=');
  228.      printDecDigit(tablicaBEST[0]);
  229.      printDecDigit(tablicaBEST[1]);
  230.      printDecDigit(tablicaBEST[2]);
  231.      printDecDigit(tablicaBEST[3]);
  232.      SEND_CHAR(' ');
  233.      SEND_CHAR(' ');
  234.      SEND_CHAR('R');
  235.      SEND_CHAR('E');
  236.      SEND_CHAR('S');
  237.      
  238.      
  239.          
  240.      for(;;){
  241.          if((BIT7&P4IN)==0){
  242.              for(int i = 16; i > 0; i--){
  243.                  tablica[0][i] = 0;
  244.                  tablica[1][i] = 0;
  245.              }wynik = 0; trudnosc = 4; break;
  246.          }
  247.      }
  248.              
  249.              
  250.          
  251.          
  252. }
  253.      
  254.     void PrzepiszWynikNaTablica(){
  255.         wynik -= 1;
  256.         tablicaWynikowa[3]=wynik%10;
  257.         tablicaWynikowa[2]=wynik%100/10;
  258.         tablicaWynikowa[1]=wynik%1000/100;
  259.         tablicaWynikowa[0]=wynik%10000/1000;
  260.     }
  261.    
  262.  
  263.    
  264.     void ZmienPozycja(){
  265.         if((BIT4&P4IN)==0) polozenie = 'L';
  266.         if((BIT5&P4IN)==0) polozenie = 'R';
  267.  
  268.     }
  269.        
  270.        
  271.        
  272.            
  273.            
  274.        
  275.        
  276.  
  277.  
  278.  
  279. void ZainicjalizujADC(){
  280.     ADC12CTL0 = ADC12ON | REFON | SHT0_15; //Enabling ADC12 & reverence 1.5V generator & seleting ref. voltage
  281.     ADC12CTL1 = SHP | CSTARTADD_0; // Single conversion; result in ADC12MEM0
  282.     ADC12MCTL0 = INCH_0 | SREF_1; //ADC channel 0; internal 1.5V ref. voltage
  283.  
  284.     ADC12CTL0 |= ENC; // Enable conversions
  285.  
  286. }
  287.  
  288. void ZainicjalizujZegar(){
  289.     // Basic Clock Module ustawiamy na ACLK(zegar 8 MHz ) i dzielimy czestotliwooa przez 2 (4 MHz)
  290.     BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL 8MHz
  291.     BCSCTL1 |= DIVA_1;                    // ACLK=8 MHz/2=4 MHz
  292.     BCSCTL2 |= SELM0 | SELM1;             // MCLK= LFTX1 =ACLK
  293.     TACTL = TASSEL_1 + MC_1 +ID_3;        // Wybieram ACLK, ACLK/8=500kHz,tryb Up
  294.     CCTL0 = CCIE;                         // w31czenie przerwan od CCR0
  295.     CCR0=50000;                           // podzielnik 50000: przerwanie co 100 ms
  296. }
  297.  
  298. void ZainicjalizujEkran(){
  299.     InitPortsLcd();                   // inicjalizacja portów LCD
  300.     InitLCD();                        // inicjalizacja LCD
  301.     clearDisplay();                   // czyszczenie wyowietlacza
  302. }
  303.  
  304. void CzyscFlage(){
  305.    
  306.     do{
  307.         IFG1 &= ~OFIFG;                     // Czyszczenie flgi OSCFault
  308.         for (i = 0xFF; i > 0; i--);         // odczekanie
  309.     }
  310.     while ((IFG1 & OFIFG) == OFIFG);    // dopóki OSCFault jest ci1gle ustawiona
  311. }
  312.  
  313. void Clock(void){
  314.  
  315.     ZmienPozycja();
  316.    
  317.     if(CzyGameOver()){
  318.         PrzepiszWynikNaTablica();
  319.         GameOver();
  320.     }
  321.     WyrzucTorNaEkran();
  322.  
  323.     if(licznik%trudnosc == 0){
  324.         PrzesunTor();
  325.         LiczWynik();
  326.         Generuj();
  327.         licznik = 0;   
  328.         if(wynik == 10){
  329.         trudnosc = trudnosc - 1; wynik++; }
  330.         if(wynik == 20){
  331.         trudnosc = trudnosc - 1; wynik++; }
  332.         if(wynik == 40){
  333.         trudnosc = trudnosc - 1; wynik++; }
  334.     }
  335.    
  336.  
  337. }
  338.  
  339.  
  340.  
  341.  
  342. //void Clock(void);
  343.  
  344. //----------------- main program -------------------
  345. void main( void )
  346. {
  347.  
  348.     WDTCTL=WDTPW + WDTHOLD;    
  349.     ZainicjalizujEkran();
  350.     defineChars();
  351.     ZainicjalizujZegar();
  352.     ZainicjalizujADC();
  353.     CzyscFlage();
  354.     _EINT();                              // w31czenie przerwan
  355.  
  356. MenuStart();
  357.     for (;;){
  358.         _BIS_SR(LPM3_bits);// przejscie do trybu LPM3
  359.        
  360.         Clock();
  361.     }
  362. }
  363.  
  364.  
  365.  
  366. // procedura obs3ugi przerwania od TimerA
  367.  
  368. #pragma vector=TIMERA0_VECTOR
  369. __interrupt void Timer_A (void)
  370. {
  371.     ++licznik;
  372.     _BIC_SR_IRQ(LPM3_bits);             // wyjocie z trybu LPM3
  373. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement