Guest User

Untitled

a guest
May 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.96 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4. #include "LCD/lcd44780.h"
  5.  
  6. #define BAUD 19200
  7. #define MYUBRR F_CPU/16/BAUD-1
  8.  
  9. #define MENU_GL_SIZE 2
  10. #define MAX_SUBMENU_SIZE 3
  11.  
  12. volatile uint8_t p=0;
  13. char data;
  14. const char id[10]={26,1,1,0x05,0x3c,0xf5,0x40,0x2d,165,27};
  15.  
  16. enum
  17. {
  18.     MENU_GLOWNE=0,
  19.     MENU_1,
  20.     MENU_2,
  21.     MENU_3,
  22.     TRYB_RAY,
  23.     TRYB_ODBIOR
  24. }menu=MENU_GLOWNE;
  25.  
  26. const char *menu_str[MENU_GL_SIZE+1][MAX_SUBMENU_SIZE] =\
  27.             {{"nabial", "starcraft"},
  28.             {"ser", "kefir"},
  29.             {"Terran", "Protoss", "Zerg"}};
  30. const uint8_t menu_size[MENU_GL_SIZE+1] = {MENU_GL_SIZE, 2, 2};
  31.  
  32.  
  33. inline void USART_Init( unsigned int baud)
  34.    
  35.     {
  36.     /* Set baud rate */
  37.     UBRRH = (unsigned char)(baud>>8);
  38.     UBRRL = (unsigned char)baud;
  39.     /* Enable receiver and transmitter */
  40.     UCSRB = (1<<RXEN)|(1<<TXEN);
  41.     /* Set frame format: 8data, 2stop bit */
  42.     UCSRC = (1<<USBS)|(3<<UCSZ0);
  43.     }
  44.  
  45.  
  46. inline void USART_Transmit( unsigned char data )
  47.     {
  48.         while ( !( UCSRA & (1<<UDRE)) )
  49.         ;
  50.         UDR = data;
  51.     }
  52.  
  53. void ray(void) //nie nie, wcale nie gram w starcrafta
  54.     {
  55.         for (uint8_t ti=0; ti<10;ti++)
  56.         USART_Transmit(id[ti]);
  57.         for (uint8_t ti=3;ti<8;ti++)
  58.             {
  59.                 lcd_hex(id[ti]);
  60.                 if(ti<7)lcd_str(":");
  61.             }
  62.     }
  63.  
  64. void PiszMenu(uint8_t pos)
  65. {
  66.     char numer[3];  // pomocnicza
  67.    
  68.     lcd_cls();
  69.     lcd_locate(0, 0);
  70.     lcd_str(">");
  71.     // piszemy numer pozycji menu
  72.     numer[0] = pos+0x31;    // jak itoa()
  73.     numer[1] = '.';
  74.     numer[2] = '\0';
  75.     lcd_str(numer);
  76.     // teraz tekst pozycji
  77.     lcd_str((char*)menu_str[menu][pos]);
  78.    
  79.     if((pos+1) < menu_size[menu])   // nastepna linijka tylko, jesli jest
  80.     {
  81.         lcd_locate(0, 1);
  82.         numer[0]++;
  83.         lcd_str(numer);
  84.         // teraz tekst
  85.         lcd_str((char*)menu_str[menu][pos]);
  86.     }
  87. }
  88.  
  89. void debounce(void)
  90. {
  91.     _delay_ms(20);
  92.     p=0;
  93.     GIMSK |= ((1<<INT0)|(1<<INT1));
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100. int main(void)
  101.     {
  102.         uint8_t w=0;
  103.         uint8_t odb=1;  // teraz odb bedzie znaczyc, czy pierwszy raz
  104.                         // wykonuje sie kod jakiegos trybu(zeby zrobic
  105.                         // wyswietlenie napisow tylko raz)
  106.        
  107.         uint8_t menu_pos=0;
  108.        
  109.        
  110.         USART_Init(MYUBRR);
  111.        
  112.         DDRD|=(1<<PD6);
  113.         DDRD&=~((1<<PD2)|(1<<PD3));
  114.         PORTD|=((1<<PD2)|(1<<PD3));
  115.         MCUCR |= ((1<<ISC01)|(1<<ISC11));   // przerwanie na opadajacym zboczu
  116.         GIMSK |= ((1<<INT0)|(1<<INT1));
  117.         lcd_init();                            
  118.         lcd_cls();                             
  119.         lcd_str("Elo elo");
  120.         _delay_ms(100);
  121.         lcd_cls();
  122.         sei();
  123.  
  124.  
  125.         for(;;)
  126.         {
  127.             UCSRB|=(1<<RXCIE);
  128.            
  129.             switch(menu)
  130.             {
  131.             case TRYB_RAY:
  132.                 if((p==1)||odb) // wyslij
  133.                 {
  134.                     lcd_cls();
  135.                     lcd_locate(0,0);
  136.                     lcd_str("Wyslano karte 1");
  137.                     lcd_locate(1,0);
  138.                     ray();
  139.                     odb=0;
  140.                     debounce();
  141.                 }
  142.                
  143.                 if(p==2)    // wroc
  144.                 {
  145.                     menu=MENU_1;
  146.                     odb=1;
  147.                     debounce();
  148.                 }
  149.                 break;
  150.                
  151.             case TRYB_ODBIOR:
  152.                 if(data)    // cos przyszlo z USARTu
  153.                 {
  154.                     lcd_str(":");
  155.                     if (w==4)
  156.                         {
  157.                             lcd_locate(1,1);
  158.                             w=0;
  159.                         }
  160.                     lcd_hex(data);
  161.                     w++;
  162.                     data=0;
  163.                 }
  164.                
  165.                 if(odb)
  166.                 {
  167.                     lcd_cls();
  168.                     lcd_locate(0,0);
  169.                     lcd_str("Odebrano dane: ");
  170.                     lcd_locate(1,0);
  171.                     w=0;
  172.                     odb=0;
  173.                 }
  174.                
  175.                 if(p==2)    // wroc
  176.                 {
  177.                     menu=MENU_1;
  178.                     odb=1;
  179.                     debounce();
  180.                 }
  181.                 break;
  182.                
  183.             default:    // znaczy ze ma byc menu, a nie jakis tryb
  184.                 if(p==1)    // OK
  185.                 {
  186.                     if(!(PIND&(1<<PD3)))    // wroc
  187.                         menu=MENU_GLOWNE;
  188.                    
  189.                     if(menu==MENU_GLOWNE)
  190.                         menu=menu_pos+1;
  191.                     else
  192.                         menu = ((menu-1)*MAX_SUBMENU_SIZE)+4+menu_pos;
  193.                                 // dziwny wzor, ale moze bedzie dzialal...
  194.                    
  195.                     menu_pos=0;
  196.                     PiszMenu(menu_pos);
  197.                 }
  198.                
  199.                 if(p==2)    // wybor menu(tylko w dol)
  200.                 {
  201.                     if(++menu_pos == menu_size[menu])   // jesli na ostatniej pozycji
  202.                         menu_pos=0;
  203.                     PiszMenu(menu_pos);
  204.                     debounce();
  205.                 }
  206.             }
  207.         }
  208.  
  209.     }
  210.  
  211.  
  212.  
  213.  
  214.  
  215. ISR(INT0_vect)
  216.     {
  217.         p=1;
  218.         GIMSK &= ~(1<<INT0);
  219.     }
  220.  
  221. ISR(INT1_vect)
  222.     {
  223.         p=2;
  224.         GIMSK &= ~(1<<INT1);
  225.     }
  226.  
  227. ISR(USART_RX_vect)
  228.     {
  229.         data = UDR;
  230.         UCSRB&=~(1<<RXCIE);
  231.     }
Add Comment
Please, Sign In to add comment