Operácie

Postrehová hra

Zo stránky SensorWiki

Záverečný projekt predmetu MIPS / LS2023 - Ivan Hílek


Zadanie

Hra - na displeji sa zobrazí časový interval (napr. 10s), hráč musí trafiť tento interval čo najpresnejšie stlačením tlačidla.

Odštartuje ich rozsvecovanie 3 lediek ako semafor pri formulách.

Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

Najprv som si zapojil základnú schému na LCD display a následne som si tam pridával ostatné prvky ako LED, switch. Samozrejme po každom kroku som si overil, či dané súčiastky fungujú základným kódom, ktorý sme mali pri každom cvičení. Následne som jednotlivé prvky začal kombinovať do jedného celku aj HW a aj kód, tak aby som dostal záverečné riešenie projektu.

Súčiastky:

LCD display, ACROB základná doska, 2x switch, 3x LED, káblové vedenia a samozrejme pomocné pinové dosky

Schéma zapojenia LCD displeja.
Zapojenie LED + switch

Samozrejme zapájame na piny, ktoré máme ešte voľné, resp. podľa zdrojového kódu

Algoritmus a program

#include <avr/io.h>
#include "lcd_ch.h"
#include <avr/interrupt.h>
#include <util/delay.h>

#define SW1  PD0 //zabudovaný switch
#define SW2  PD2
#define LED1  PD6 //zadudovane diody cervena
#define LED2  PD7 //zlta
#define LED3  PD5 //zelena

#define LCD_CTRL_PORT DDRD //LCD define
#define LCD_DATA_PORT DDRB
#define LCD_RS_pin 2
#define LCD_RW_pin 3
#define LCD_EN_pin 4

#define LCD_D4_pin 1
#define LCD_D5_pin 2
#define LCD_D6_pin 3
#define LCD_D7_pin 4 

#define LCD_CLR               0      /* DB0: clear display                  */
#define LCD_HOME              1      /* DB1: return to home position        */

int main(void)
{  
    DDRD = 0b00100000;       // PORTB: LED1 na PB5  je output, SW1 (PB4) input
    PORTD = 0b00010000;      // LED Active low, LED off, pull-up ON


 DDRD |= (1 << LED1);
 DDRD |= (1 << LED2);
 DDRD |= (1 << LED3);

DDRD |= (1<<LCD_EN_pin); // Pin D4 (Enable)  PORTD  output  
DDRD |= (1<<LCD_RW_pin); // Pin D3 (RW)      PORTD  output  
DDRD |= (1<<LCD_RS_pin); // Pin D2 (RS)      PORTD  output  


  LCD_DATA_PORT |= (1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin); // Piny 1,2,3,4, PORTB ako output (Data pre display)


lcd_init();  // definiciu pozri v -> lcd_ch.h resp. lcd_ch.c           //MENU HRY
lcd_puts("Stlac tlacitka,");
lcd_command(0xC0);
lcd_puts("aby sa hra zacala");


    while(1)     
   {
                
     if ( !(PIND & (1<<SW1)) & !(PIND & (1<<SW2)) )             // ZAPNUTIE HRY
       {  
 lcd_init();
lcd_puts("Spustam semafor");
 
  PORTD |=  (1<<LED1);               //SEMAFOR
_delay_ms(1000);                     //delay 1 sekunda medzi farbami  

PORTD &= ~(1<<LED1);
  PORTD |=  (1<<LED2);
_delay_ms(1000);

PORTD &= ~(1<<LED2);
  PORTD |=  (1<<LED3);
  _delay_ms(1000);
   PORTD &= ~(1<<LED3);

lcd_init();                           //ODPOCITAVANIE 10 SEC.
lcd_puts("Odpocitavaj 10 sek.");
lcd_command(0xC0 + 1); 
lcd_puts("stlac tlacitko ");           
 
 _delay_ms(1000);
 
  int cas=0;                   // PREMENNA CAS, PODLA KTOREJ BEZI VYHODNOTENIE

while ((PIND & (1<<SW1))) {
        _delay_ms(100);
        cas++;                 //PRIDAVAME DO PREMENNEJ CAS
}  
   
   if (cas >= 90 && cas <= 110)          //PO STLACENI SWITCH SA NAM ZASTAVI TIMER A AK JE HODNOTA MEDZI 9 A 11 SEKUNDAMI TAK VYHRAME
   {
lcd_command(1<<LCD_CLR);                  /* Clear screen */
 lcd_command(1<<LCD_HOME);                /* Set cursor to home position */
char riadok[]= {"                "};
sprintf(riadok,"Vyhral si");              //TEXT VYHRA
lcd_puts(riadok);
}

else
{
lcd_init();
lcd_puts("nevyhral si");                   //TEXT PREHRA
}}}}

Zdrojový kód: Médiá:AVRGCC2.c


Overenie

Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom.

Aplikácia.

Video: