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. Pri projekte boli použité aj základné knižnice, ktoré sme používali na cvičeniach.
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
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.
Video: