EITF11 Digitala Projekt TIC TAC TOE. Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall

Relevanta dokument
Rapport Digitala Projekt EITF Grupp 12 Elin Blomstergren, Victor Sundgren Handledare: Bertil Lindvall. Fyra i rad

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Växtviskaren EITF11 Digitala projekt VT15, I12

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

Feeding Daisy. EITF11 Lunds Tekniska Högskola. Grupp 12: Pontus Akervall Louise Landare Anton Schölin. En automatisk blomvattnare

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

TEMPERATURMÄTARE MED GRAFRITARE

Digitala Projekt (EITF11) Hemlarm

EITF11 - Digitala projekt. Hastighetsmätare. Hugo Backmyr Mattias Karlsson

Temperaturmätare med lagringsfunktion DIGITALA PROJEKT EITF11 GRUPP 14, ERIK ENFORS, LUDWIG ROSENDAL, CARL MIKAEL WIDMAN

Projektrapport Målgång

EITF11. WormFight. Axel Eriksson, Felix Geuken Handledare: Bertil Lindvall EITF11

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Bilen som inte kan krocka

Digitala Projekt(EITF40) - Larm

The Intelligent Timer

Digitala Projekt (EITF11)

The Secure Light. Digitala Projekt EITF11. Hanna Tinglöf, I-12 Anna Horvath, I-12 Filippa Österlin, I-12. Handledare: Bertil Lindvall

Gustaf Backman, Anton Nystedt, Nicholas Peebo Battleships. Lunds tekniska högskola. EITF11 Digitala projekt

Rafiki Wa Kupanda. EITF11, Digitala projekt VT18. Linnea Håkansson, Anton Gunneberg, Ruben Schultz

The Phenomenal Doorbell Bilaga 2. Källkod

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

Pulsmätare med varningsindikatorer

Digitala projekt Linjeföljande bil

Projektrapport i Digitala System

Digitala Projekt: Digitala Projekt, EITF11 - VT17 Oscar Ahlgren, Patrik Lorentsson och Sten Hellberg Handledare: Bertil Lindvall

Projektrapport - Roterande digital LED-klocka

SIMON SAYS Projekt i EITF11 Digitala Projekt

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

Pulsmätare. EITF11 Digitala Projekt VT15. Grupp 9: Emma Albertz, Mathilde Hagander & Alexandra Mansner Handledare: Andreas Johansson & Bertil Lindvall

Helena Harrysson och Linnéa Wickberg

PROJEKTTYP: Rapportsammanfattning STUDENTER: Larsson, J. ( ) och Oredsson, J. ( ) DATUM: 26 april, 2015

Digitala Projekt VT13. PING-Pong

Liftmaestro. Lunds Tekniska Högskola Elektro- och informationsteknik. Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

DIGITALA PROJEKT (EITF40) Fartmätare

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

DIGITALA PROJEKT - EITF11

Projekt EITA15. Väckarklocka. LTH Ingenjörshögskolan vid Campus Helsingborg Datateknik

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

Källkod. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define green_diode PD5. #define RS PD4

Pulsmätare Digitala Projekt EITF11

Projektrapport - Feststation

Väderstation. Digitala Projekt EITF11 Institutionen för Elektro- och Informationsteknik Lunds Tekniska Högskola

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

Digitala Projekt EITF11 Grupp 9 Projektarbete Hanna Bondesson Marcus Skog. Reaktionsspel EITF11

1 Bakgrund 4. 2 Kravspecifikation Definitioner Grundläggande krav Användarfall 5

Rapportsammanfattning. Optima Sous Vide

Digitala Projekt(EITF40) - Larm

Snake! !!!!!!!!!!!!!!!!!!!!

Digitala projekt VT Myran

/* * dancing3.c * * Created: :53:20 * Author: digpi10 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.

High Core Remote Car X8000 Cool

Datorteknik 1 (AVR 1)

Thunder s Truck projektrapport

Digitala Projekt (EITF11) Larmanläggning

LTH Ingenjörhögskolan vid Campus Helsingborg. Mastermindspel

Effektpedal för elgitarr

Digitalt Projekt: Radiostyrd Bil

Kla ggvisarskylt. -med en underton av rassel. av Jonathan So nnerup & Gabriel Jo nsson

Digitala projekt - Radiostyrd bil

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia

Väderstation. EITF11, Digitala projekt RAPPORT. Isabella Bergvik, Emma Sandén & Hanna Åberg

EIT. Digitala projekt EITF11. Larmanläggning. Handledare Bertil Lindvall Anna Lindberg I-11 Caroline Vitasp I-11 Eric Eliason I-10

Digitala projekt rapport

Digital Projekt EDI 021 Konstruktion av talande nummerpresentatör VT1 2004

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Linjeföljare Digitala projekt Johan Engström e02je Henrik Persson e02hp

THE VISUAL EGGTIMER. Skola: Lunds Tekniska Högskola Institution: Elektro- och informationsteknik Kurs: Digitala projekt (EITF11)

EITF11 - Digitala Projekt

JOFEN-Prototypes. Målsökande pansarvagn. Projektarbete i Kursen EITA15. Jonatan Claesson, Olle Jonasson, Felix Rödén, Edvin Rossi & Nils Olén

EITF11: Bandkanon Grp 05

EDI021 Digitala projekt. Rapport LARMSYSTEM. Utförd av: Niklas Eklund E03 David Olsson E04. Inlämnad:

Digitala projekt, EITF11 - Rapport Handledare: Bertil Lindvall. Fredrik Nylund (ine12fny) Johan Ekman (ine11jek) Olof Wikman (ine11owi)

DIGITALA PROJEKT Väderstation

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

Aml Abbas, Ali Darwish, Ehsanolah Hafezi, Fatima Zahra Doussi Grupp 15

DANCING ROBOT. EITF11, Grupp 10. Kajsa Salomonsson, Hugo Hedin och Petter Mårtensson

Voltmeter EITF11 LUNDS TEKNISKA HÖGSKOLA Grupp 3 Timmy Andersson Jesper Tempel Christoffer Lundgren

LOOKY LUKE. Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10. - Att välja en lyckosam väg EITF11 Digitala projekt

ETSA01 Digitala Projekt (I) VT- 13. Projektarbete AC Handledare Bertil Lindvall

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

Datorteknik 2 (AVR 2)

RemoteBud. Inlämnas: Patrik Johnsson, e01pjo Viktor Karlsson, e01vk

Projektrapport Digitala System

Pong Mayhem. Innehållsförteckning Inledning Kravspecifikation Komponenter/Hårdvara Arbetsprocess Reflektion...

Projektrapport - RoboWalter

Design av inbyggda system

Design av inbyggda system

+5V. start. Styrsystem. stopp. Tillståndsmaskiner

Tidsstyrd persiennöppnare

Jan Babor och Oscar Ågren Handledare: Bertil Lindvall 5/16/2011

Rörelse- och temperaturkänsligt larmsystem

LUNDS TEKNISKA HÖGSKOLA. Väderstation. Digitala Projekt, EITF11. Martin Olofsson, I08 & Fredrik Oher, I08 Vt 2012

Transkript:

EITF11 Digitala Projekt TIC TAC TOE Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall Lunds Tekniska Högskola VT 2016 0

Sammanfattning Rapporten handlar om ett projekt i kursen EITF11 Digitala Projekt där uppgiften har varit att konstruera en hårdvara med en viss funktion och sedan programmera en C-kod för att implementera denna funktion. Gruppen har valt att ta sig an uppgiften att konstruera ett luffarschack-spel, eller Tic Tac Toe, på en LCD med tillhörande nödvändiga komponenter. Projektet resulterade i en tillfredställande prototyp som motsvarade kraven för ett standard luffarschack-spel. 1

Innehållsförteckning 1. Inledning... 3 1.1 Bakgrund... 3 1.2 Uppgift... 3 2. Kravspecifikation... 3 2.1 Funktionella krav... 3 2.2 Kvalitetskrav... 4 3. Ha rdvara... 4 3.1 Processor... 4 3.2 Display... 4 3.3 Varistor... 4 3.4 Resistorer... 4 3.5 Dioder... 4 3.6 Tangentbord och Key Encoder... 4 3.7 JTAG... 4 3.8 Mo nsterkort... 5 3.9 Stro mfo rso rjning... 5 3.10 Kondensatorer... 5 4. Mjukvara... 5 5. Utfo rande... 5 5.1 Planering... 5 5.2 Konstruktion... 5 5.3 Programmering... 6 6. Resultat... 6 7. Diskussion och slutsats... 6 8. Bilagor... 7 Bilaga 1. Kopplingsschema... 7 Bilaga 2. Källkod... 8 2

1. Inledning 1.1 Bakgrund Teknikprofilen System- och Programvaruutveckling på civilingenjörsprogrammet Industriell Ekonomi vid Lunds Tekniska Högskola innehåller kursen EITF11 Digitala projekt, 10 hp. Avsikten med kursen är att ge eleven ett begrepp om hur konstruktionsarbete går till. Tanken är att eleven med hjälp av handledare ska kunna prestera en fungerande prototyp med tillhörande dokumentation. 1.2 Uppgift Uppgiften har varit att konstruera och programmera en prototyp för ett utvalt projekt inom ramen för kursen Digitala Projekt. Utifrån de alternativ som ges i kursen så gick valet till att konstruera en LCD som man ska kunna spela ett spel på. Efter att ha gått igenom olika tänkbara applikationer för display och övervägt intressen och förmåga bestämde sig författarna för att göra ett Luffarschack-spel, eller Tic Tac Toe, som användning för displayen. 2. Kravspecifikation 2.1 Funktionella krav 1. Konstruktionen ska ha en display innehållandes en spelplan som består av nio rutor 2. Till konstruktionen följer ett tangentbord bestående av 4x4 (16) rutor. 1 2 3 R 4 5 6 7 8 9 A Figur 1 Tangentbord 1. Med knapparna 1-9 väljs vilken ruta som man vill utföra någonting på. 2. Med knappen A läggs en figur ut eller tas bort på displayen. 3. Med knappen R startas spelet om om någon har vunnit 4. De mörkgrå knapparna utför ingenting. 2. Systemet ska indikera när en person har vunnit. 1. Genom att den gröna dioden lyser. 3. Drag som strider mot spelreglerna ska inte gå att göra. 3

4. Varannat tur ska resultera i att ett X skrivs ut och varannat i att ett O skrivs ut. 5. Efter att sex figurer är utplacerade ska det gå att flytta figurer till tomma platser. 2.2 Kvalitetskrav 1. Systemet ska verka efter reglerna för tre i rad. 2. Spelet ska vara uppbyggt på en LCD på 128x64 pixlar. 3. Systemet ska ha en tillfredställande fördröjning för insignaler. 3. Ha rdvara Fullständigt kopplingsschema finns i Bilaga 1. 3.1 Processor I projektet används mikroprocessorn AVR AT Mega32 16PI 0422B. Programkoden importeras till processorn genom en JTAG. 3.2 Display Som display används en grafisk LCD vid namn GDM12864HLCM. Displayen består av 128x64 pixlar. 3.3 Varistor En variabel resistor anva nds fo r att justera displayens ljusstyrka. 3.4 Resistorer Resistorer används för att få önskad spänning över dioder och display. 3.5 Dioder En röd och en grön diod används för att indikera när ett regelbrott begås (röd diod) respektive när en spelare vunnit (grön diod). 3.6 Tangentbord och Key Encoder Ett tangentbord används för att skicka insignaler till en Key Encoder som i sin tur konverterar dessa till processorn. 3.7 JTAG Används för att importera och exekvera mjukvaran som processorn ska fungera efter. 4

3.8 Mo nsterkort Ett mönsterkort används för montering av samtliga delar samt sammankoppling av dem. 3.9 Stro mfo rso rjning Till kretsen ansluts en strömkälla på 5 V och 5 A. 3.10 Kondensatorer Kondesatorer används för att få Key Encodern att oscillera vilket behövs för att skapa en insignal till processorn. 4. Mjukvara Spelet skrivs som ett program i språket C i platformen Atmel Studio 6.2. En JTAG används enligt rubrik 3.7 JTAG. Koden i programmet möjliggör önskad kommunikation mellan ett antal hårdvarukompontenter och beskriver själva spelet. När spelet körs används metoder för att rita upp en spelplan och för att sedan placera ut figurer på den. Andra viktiga delar av koden beskriver spelreglerna så att spelet fungerar på önskat vis. 5. Utfo rande 5.1 Planering Författarna ville skapa ett simpelt spel som de själva kände till. Valet föll på en variant av luffarschack a ven kallat Tic Tac Toe. Första steget var sedan att skapa en kravspecifikation för att få en översiktlig bild över vad projektet skulle innehålla. En skiss på kopplingsschema ritades upp och i samråd med handledaren bestämdes sedan önskvärda komponenter vilket resulterade i att kopplingsschemat reviderades till ett första utkast. 5.2 Konstruktion Med kopplingsschema färdigt började arbetet med att placera ut och fästa komponenter på mönsterkort. Under processen fick kopplingsschema och kravspecifikation revideras ett antal gånger för att matcha verkligheten. 5

5.3 Programmering Första steget med att skriva mjukvaran var att få olika komponenter på mönsterkortet att kommunicera med varandra. Under detta arbete skrevs metoder som inte sedan kom att användas i den slutgiltiga koden och dessa syftade mest till att testa hur kommunikationen mellan exempelvis dioder och knappar fungerade. Steg två blev att söka rita upp spelplanen på displayen. Vid detta skede uppdagades det att processorn inte var tillräckligt kraftig för att kunna hantera spelet vilket resulterade i ett byte till en dubbelt så stor processor. Slutfasen av programmeringen blev sedan att skriva metoderna som utför själva spelandet och kontrollerar att spelreglerna följs. För att se fullständig källkod, se Bilaga 2. 6. Resultat Den slutgiltiga konstruktionen uppfyllde alla de krav som fanns på den. Vissa av kraven krävde dock en smärre revidering från de ursprungliga för att göra implementeringen bättre och lättare att genomföra. 7. Diskussion och slutsats Efter en relativt lång inlärningsprocess om hur hårdvaran fungerade och hur alla komponenter skulle höra ihop flöt projektet på bra. Projektet har varit intressant och lärorikt då det gett en djupare förståelse för hur konstruktionsarbete och produktutveckling går till och hur mjukvara kan kommunicera med hårdvara. 6

8. Bilagor Bilaga 1. Kopplingsschema Figur 2 Kopplingsschema 7

Bilaga 2. Källkod /* * TicTac.c * * Created: 2016-04-28 10:11:07 * Author: digpi16 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdlib.h> #include <math.h> char val; char virtualdisplay [8][128]; char gamestarted = 0; char knapp1 = 0b11001111; char knapp2 = 0b01001111; char knapp3 = 0b10001111; char knapp4 = 0b11101111; char knapp5 = 0b01101111; char knapp6 = 0b10101111; char knapp7 = 0b11011111; char knapp8 = 0b01011111; char knapp9 = 0b10011111; char sq1 = 0; char sq2 = 0; char sq3 = 0; char sq4 = 0; char sq5 = 0; char sq6 = 0; char sq7 = 0; char sq8 = 0; char sq9 = 0; char win = 0; char char counto = 0; char countx = 0; char stage = 0; int main(void){ setdatadirection(); startdisplay(); cleardisplay(); setupboard(); eraseall(); while(1){ if(win == 0){ play(); 8

while(win == 1){ greenhigh(); if(pina == 0b00001111){ eraseall(); sq1 = 0; sq2 = 0; sq3 = 0; sq4 = 0; sq5 = 0; sq6 = 0; sq7 = 0; sq8 = 0; sq9 = 0; win = 0; counto = 0; countx = 0; stage = 0; greenlow(); void play(){ while(stage == 0 && win == 0){ checkwin(); if(counto == 3){ stage = 1; if(i == 1 && win == 0){ checkwin(); if(pina == knapp1 && sq1 == 0){ while(pina == knapp1){ placex(1,1); sq1 = 1; countx++; 9

if(pina == knapp2 && sq2 == 0){ while(pina == knapp2){ placex(2,1); sq2 = 1; countx++; if(pina == knapp3 && sq3 == 0){ while(pina == knapp3){ placex(3,1); sq3 = 1; countx++; if(pina == knapp4 && sq4 == 0){ while(pina == knapp4){ placex(1,2); sq4 = 1; countx++; if(pina == knapp5 && sq5 == 0){ while(pina == knapp5){ placex(2,2); sq5 = 1; countx++; if(pina == knapp6 && sq6 == 0){ while(pina == knapp6){ placex(3,2); sq6 = 1; countx++; 10

if(pina == knapp7 && sq7 == 0){ while(pina == knapp7){ placex(1,3); sq7 = 1; countx++; if(pina == knapp8 && sq8 == 0){ while(pina == knapp8){ placex(2,3); sq8 = 1; countx++; if(pina == knapp9 && sq9 == 0){ while(pina == knapp9){ placex(3,3); sq9 = 1; countx++; if(pina == knapp1 && sq1!= 0){ while(pina == knapp1){ redhigh(); if(pina == knapp2 && sq2!= 0){ while(pina == knapp2){ redhigh(); 11

if(pina == knapp3 && sq3!= 0){ while(pina == knapp3){ redhigh(); if(pina == knapp4 && sq4!= 0){ while(pina == knapp4){ redhigh(); if(pina == knapp5 && sq5!= 0){ while(pina == knapp5){ redhigh(); if(pina == knapp6 && sq6!= 0){ while(pina == knapp6){ redhigh(); if(pina == knapp7 && sq7!= 0){ while(pina == knapp7){ redhigh(); if(pina == knapp8 && sq8!= 0){ while(pina == knapp8){ redhigh(); 12

if(pina == knapp9 && sq9!= 0){ while(pina == knapp9){ redhigh(); if(i == 0 && win == 0){ checkwin(); if(pina == knapp1 && sq1 == 0){ while(pina == knapp1){ placeo(1,1); sq1 = 2; counto++; if(pina == knapp2 && sq2 == 0){ while(pina == knapp2){ placeo(2,1); sq2 = 2; counto++; if(pina == knapp3 && sq3 == 0){ while(pina == knapp3){ placeo(3,1); sq3 = 2; counto++; if(pina == knapp4 && sq4 == 0){ while(pina == knapp4){ 13

placeo(1,2); sq4 = 2; counto++; if(pina == knapp5 && sq5 == 0){ while(pina == knapp5){ placeo(2,2); sq5 = 2; counto++; if(pina == knapp6 && sq6 == 0){ while(pina == knapp6){ placeo(3,2); sq6 = 2; counto++; if(pina == knapp7 && sq7 == 0){ while(pina == knapp7){ placeo(1,3); sq7 = 2; counto++; if(pina == knapp8 && sq8 == 0){ while(pina == knapp8){ placeo(2,3); sq8 = 2; counto++; 14

if(pina == knapp9 && sq9 == 0){ while(pina == knapp9){ placeo(3,3); sq9 = 2; counto++; if(pina == knapp1 && sq1!= 0){ while(pina == knapp1){ redhigh(); if(pina == knapp2 && sq2!= 0){ while(pina == knapp9){ redhigh(); if(pina == knapp3 && sq3!= 0){ while(pina == knapp9){ redhigh(); if(pina == knapp4 && sq4!= 0){ while(pina == knapp9){ redhigh(); if(pina == knapp5 && sq5!= 0){ while(pina == knapp9){ redhigh(); 15

if(pina == knapp6 && sq6!= 0){ while(pina == knapp9){ redhigh(); if(pina == knapp7 && sq7!= 0){ while(pina == knapp9){ redhigh(); if(pina == knapp8 && sq8!= 0){ while(pina == knapp9){ redhigh(); if(pina == knapp9 && sq9!= 0){ while(pina == knapp9){ redhigh(); while(stage == 1 && win == 0){ if(i = 1 && win == 0){ checkwin(); if(pina == knapp1 && sq1 == 1 && countx == 3){ while(pina == knapp1){ 16

erasex(1,1); sq1 = 0; countx = 2; if(pina == knapp2 && sq2 == 1 && countx == 3){ while(pina == knapp2){ erasex(2,1); sq2 = 0; countx = 2; if(pina == knapp3 && sq3 == 1 && countx == 3){ while(pina == knapp3){ erasex(3,1); sq3 = 0; countx = 2; if(pina == knapp4 && sq4 == 1 && countx == 3){ while(pina == knapp4){ erasex(1,2); sq4 = 0; countx = 2; if(pina == knapp5 && sq5 == 1 && countx == 3){ while(pina == knapp5){ erasex(2,2); sq5 = 0; countx = 2; if(pina == knapp6 && sq6 == 1 && countx == 3){ while(pina == knapp6){ erasex(3,2); 17

sq6 = 0; countx = 2; if(pina == knapp7 && sq7 == 1 && countx == 3){ while(pina == knapp7){ erasex(1,3); sq7 = 0; countx = 2; if(pina == knapp8 && sq8 == 1 && countx == 3){ while(pina == knapp8){ erasex(2,3); sq8 = 0; countx = 2; if(pina == knapp9 && sq9 == 1 && countx == 3){ while(pina == knapp9){ erasex(3,3); sq9 = 0; countx = 2; if(pina == knapp1 && sq1 == 0){ if(countx == 2){ while(pina == knapp1){ placex(1,1); sq1 = 1; countx = 3; if(pina == knapp2 && sq2 == 0){ if(countx == 2){ while(pina == knapp2){ 18

placex(2,1); sq2 = 1; countx = 3; if(pina == knapp3 && sq3 == 0){ if(countx == 2){ while(pina == knapp3){ placex(3,1); sq3 = 1; countx = 3; if(pina == knapp4 && sq4 == 0){ if(countx == 2){ while(pina == knapp4){ placex(1,2); sq4 = 1; countx = 3; if(pina == knapp5 && sq5 == 0){ if(countx == 2){ while(pina == knapp5){ placex(2,2); sq5 = 1; countx = 3; 19

if(pina == knapp6 && sq6 == 0){ if(countx == 2){ while(pina == knapp6){ placex(3,2); sq6 = 1; countx = 3; if(pina == knapp7 && sq7 == 0){ if(countx == 2){ while(pina == knapp7){ placex(1,3); sq7 = 1; countx = 3; if(pina == knapp8 && sq8 == 0){ if(countx == 2){ while(pina == knapp8){ placex(2,3); sq8 = 1; countx = 3; if(pina == knapp9 && sq9 == 0){ if(countx == 2){ while(pina == knapp9){ 20

placex(3,3); sq9 = 1; countx = 3; while(i == 0 && win == 0){ checkwin(); if(counto == 3){ if(pina == knapp1 && sq1 == 2){ while(pina == knapp1){ eraseo(1,1); sq1 = 0; counto = 2; if(pina == knapp2 && sq2 == 2){ while(pina == knapp2){ eraseo(2,1); sq2 = 0; counto = 2; if(pina == knapp3 && sq3 == 2){ while(pina == knapp3){ eraseo(3,1); sq3 = 0; counto = 2; if(pina == knapp4 && sq4 == 2){ while(pina == knapp4){ 21

eraseo(1,2); sq4 = 0; counto = 2; if(pina == knapp5 && sq5 == 2){ while(pina == knapp5){ eraseo(2,2); sq5 = 0; counto = 2; if(pina == knapp6 && sq6 == 2){ while(pina == knapp6){ eraseo(3,2); sq6 = 0; counto = 2; if(pina == knapp7 && sq7 == 2){ while(pina == knapp7){ eraseo(1,3); sq7 = 0; counto = 2; if(pina == knapp8 && sq8 == 2){ while(pina == knapp8){ eraseo(2,3); sq8 = 0; counto = 2; if(pina == knapp9 && sq9 == 2){ while(pina == knapp9){ eraseo(3,3); 22

if(counto == 2){ sq9 = 0; counto = 2; if(pina == knapp1 && sq1 == 0){ while(pina == knapp1){ placeo(1,1); sq1 = 2; counto = 3; if(pina == knapp2 && sq2 == 0){ while(pina == knapp2){ placeo(2,1); sq2 = 2; counto = 3; if(pina == knapp3 && sq3 == 0){ while(pina == knapp3){ placeo(3,1); sq3 = 2; counto = 3; if(pina == knapp4 && sq4 == 0){ while(pina == knapp4){ placeo(1,3); sq4 = 2; counto = 3; if(pina == knapp5 && sq5 == 0){ while(pina == knapp5){ 23

placeo(2,2); sq5 = 2; counto = 3; if(pina == knapp6 && sq6 == 0){ while(pina == knapp6){ placeo(3,2); sq6 = 2; counto = 3; if(pina == knapp7 && sq7 == 0){ while(pina == knapp7){ placeo(1,3); sq7 = 2; counto = 3; if(pina == knapp8 && sq8 == 0){ while(pina == knapp8){ placeo(2,3); sq8 = 2; counto = 3; if(pina == knapp9 && sq9 == 0){ while(pina == knapp9){ placeo(3,3); sq9 = 2; counto = 3; 24

void checkwin(){ if (sq1 == 1 && sq2 == 1 && sq3 == 1){ win = 1; if ( sq4 == 1 && sq5 == 1 && sq6 == 1){ win = 1; if (sq7 == 1 && sq8 == 1 && sq9 == 1){ win = 1; if (sq1 == 1 && sq4 == 1 && sq7 == 1){ win = 1; if (sq2 == 1 && sq5 == 1 && sq8 == 1){ win = 1; if (sq3 == 1 && sq6 == 1 && sq9 == 1){ win = 1; if (sq1 == 1 && sq5 == 1 && sq9 == 1){ win = 1; if (sq3 == 1 && sq5 == 1 && sq7 == 1){ win = 1; if (sq1 == 2 && sq2 == 2 && sq3 == 2){ win = 1; if (sq4 == 2 && sq5 == 2 && sq6 == 2){ win = 1; if (sq7 == 2 && sq8 == 2 && sq9 == 2){ win = 1; if (sq1 == 2 && sq4 == 2 && sq7 == 2){ win = 1; if (sq2 == 2 && sq5 == 2 && sq8 == 2){ win = 1; if (sq3 == 2 && sq6 == 2 && sq9 == 2){ win = 1; if (sq1 == 2 && sq5 == 2 && sq9 == 2){ win = 1; if (sq3 == 2 && sq5 == 2 && sq7 == 2){ win = 1; void eraseall(){ eraseo(1,1); eraseo(1,2); eraseo(1,3); eraseo(2,1); eraseo(2,2); eraseo(2,3); eraseo(3,1); eraseo(3,2); eraseo(3,3); erasex(1,1); erasex(1,2); erasex(1,3); erasex(2,1); 25

erasex(2,2); erasex(2,3); erasex(3,1); erasex(3,2); erasex(3,3); void enableinterrupt() { PINA = 0b00000000; DDRA = 0b00000000; MCUCR = 0b00001111; GICR = 0b11000000; sei(); redhigh(){ PORTD = 0b10000000; redlow(){ PORTD &= 0b01111111; greenhigh(){ PORTD = 0b01000000; greenlow(){ PORTD &= 0b10111111; void cs2high() { PORTD = 0b00100000; void cs2low() { PORTD &= 0b11011111; void cs1high() { PORTD = 0b00010000; void cs1low() { PORTD &= 0b11101111; void resethigh() { PORTD = 0b00000001; void resetlow() { PORTD &= 0b11111110; void rwhigh() { PORTD = 0b00000010; void rwlow() { 26

PORTD &= 0b11111101; void rshigh() { PORTD = 0b00000100; void rslow() { PORTD &= 0b11111011; void ehigh () { PORTD = 0b00001000; void elow() { PORTD &= 0b11110111; void setx(char x) { rslow(); rwlow(); PORTB = 0b10111000 x; elow(); ehigh(); void sety(char y) { rslow(); rwlow(); PORTB = 0b01000000 y; elow(); ehigh(); void writedata(char x, char y) { rshigh(); rwlow(); PORTB = virtualdisplay[x / 8][y]; elow(); ehigh(); void erasedata(char x, char y) { rshigh(); rwlow(); PORTB = virtualdisplay[x / 8][y]; elow(); ehigh(); 27

void draw(char x, char y) { virtualdisplay[x/8][y] = (1<<(x%8)); char newy; if (y < 64) { cs2high(); cs1low(); newy = y; else { cs1high(); cs2low(); newy = y - 64; setx(x / 8); sety(newy); writedata(x,y); void drawboard() { for (char y = 64; y < 128; y++) { draw(0, y); draw(63, y); for (char x = 0; x < 63; x++) { draw(x, 64); draw(x, 127); for (char y = 64; y < 128; y++) { draw(42, y); draw(21, y); for (char x = 0; x < 63; x++) { draw(x, 85); draw(x, 106); void setupboard() { drawboard(); void erase(char x, char y) { virtualdisplay[x/8][y] &= ~(1<<(x%8)); char newy; if (y < 64) { cs2high(); cs1low(); newy = y; else { cs1high(); 28

cs2low(); newy = y - 64; setx(x / 8); sety(newy); erasedata(x,y); void cleardisplay() { for (char y = 0; y < 128; y++) { for (char x = 0; x < 64; x++) { erase(x,y); void placex(char x, char y){ if(x == 1 && y == 1){ char j = 65; for(char i < 21; i++){ draw(i,j); j++; char k = 84; for(char f = 1; f < 21; f++){ draw(f,k); k--; if(x == 2 && y == 1){ char j = 86; for(char i < 21; i++){ draw(i,j); j++; char k = 105; for(char f = 1; f < 21; f++){ draw(f,k); k--; if(x == 3 && y == 1){ char j = 107; for(char i < 21; i++){ draw(i,j); j++; char k = 126; for(char f = 1; f < 21; f++){ draw(f,k); k--; 29

if(x == 1 && y == 2){ char j = 65; for(char i = 22; i < 42; i++){ draw(i,j); j++; char k = 84; for(char f = 22; f < 42; f++){ draw(f,k); k--; if(x == 2 && y == 2){ char j = 86; for(char i = 22; i < 42; i++){ draw(i,j); j++; char k = 105; for(char f = 22; f < 42; f++){ draw(f,k); k--; if(x == 3 && y == 2){ char j = 107; for(char i = 22; i < 42; i++){ draw(i,j); j++; char k = 126; for(char f = 22; f < 42; f++){ draw(f,k); k--; if(x == 1 && y == 3){ char j = 65; for(char i = 43; i < 63; i++){ draw(i,j); j++; char k = 84; for(char f = 43; f < 63; f++){ draw(f,k); k--; if(x == 2 && y == 3){ char j = 86; for(char i = 43; i < 63; i++){ draw(i,j); j++; 30

char k = 105; for(char f = 43; f < 63; f++){ draw(f,k); k--; if(x == 3 && y == 3){ char j = 107; for(char i = 43; i < 63; i++){ draw(i,j); j++; char k = 126; for(char f = 43; f < 63; f++){ draw(f,k); k--; void erasex(char x, char y){ if(x == 1 && y == 1){ char j = 65; for(char i < 21; i++){ erase(i,j); j++; char k = 84; for(char f = 1; f < 21; f++){ erase(f,k); k--; if(x == 2 && y == 1){ char j = 86; for(char i < 21; i++){ erase(i,j); j++; char k = 105; for(char f = 1; f < 21; f++){ erase(f,k); k--; if(x == 3 && y == 1){ char j = 107; for(char i < 21; i++){ erase(i,j); j++; char k = 126; for(char f = 1; f < 21; f++){ erase(f,k); k--; 31

if(x == 1 && y == 2){ char j = 65; for(char i = 22; i < 42; i++){ erase(i,j); j++; char k = 84; for(char f = 22; f < 42; f++){ erase(f,k); k--; if(x == 2 && y == 2){ char j = 86; for(char i = 22; i < 42; i++){ erase(i,j); j++; char k = 105; for(char f = 22; f < 42; f++){ erase(f,k); k--; if(x == 3 && y == 2){ char j = 107; for(char i = 22; i < 42; i++){ erase(i,j); j++; char k = 126; for(char f = 22; f < 42; f++){ erase(f,k); k--; if(x == 1 && y == 3){ char j = 65; for(char i = 43; i < 63; i++){ erase(i,j); j++; char k = 84; for(char f = 43; f < 63; f++){ erase(f,k); k--; if(x == 2 && y == 3){ char j = 86; for(char i = 43; i < 63; i++){ 32

erase(i,j); j++; char k = 105; for(char f = 43; f < 63; f++){ erase(f,k); k--; if(x == 3 && y == 3){ char j = 107; for(char i = 43; i < 63; i++){ erase(i,j); j++; char k = 126; for(char f = 43; f < 63; f++){ erase(f,k); k--; void placeo(char x, char y){ char newx = y - 1; char newy = x - 1; for(char i < 6; i++){ draw(8 + 21*newX + i, 65 + 21*newY); for(char i < 6; i++){ draw(8 + 21*newX + i, 84 + 21*newY); for(char i < 6; i++){ draw(1 + 21*newX, 72 + 21*newY + i); for(char i < 6; i++){ draw(20 + 21*newX, 72 + 21*newY + i); draw(2 + newx*21,70 + newy*21); draw(2 + newx*21,71 + newy*21); draw(2 + newx*21,78 + newy*21); draw(2 + newx*21,79 + newy*21); draw(19 + newx*21,70 + newy*21); draw(19 + newx*21,71 + newy*21); draw(19 + newx*21,78 + newy*21); draw(19 + newx*21,79 + newy*21); draw(6 + newx*21,66 + newy*21); draw(7 + newx*21,66 + newy*21); draw(14 + newx*21,66 + newy*21); draw(15 + newx*21,66 + newy*21); draw(6 + newx*21,83 + newy*21); draw(7 + newx*21,83 + newy*21); draw(14 + newx*21,83 + newy*21); draw(15 + newx*21,83 + newy*21); draw(5 + newx*21, 67 + newy*21); draw(4 + newx*21, 68 + newy*21); 33

draw(3 + newx*21, 69 + newy*21); draw(5 + newx*21, 82 + newy*21); draw(4 + newx*21, 81 + newy*21); draw(3 + newx*21, 80 + newy*21); draw(16 + newx*21, 67 + newy*21); draw(17 + newx*21, 68 + newy*21); draw(18 + newx*21, 69 + newy*21); draw(16 + newx*21, 82 + newy*21); draw(17 + newx*21, 81 + newy*21); draw(18 + newx*21, 80 + newy*21); void eraseo(char x, char y){ char newx = y - 1; char newy = x - 1; for(char i < 6; i++){ erase(8 + 21*newX + i, 65 + 21*newY); for(char i < 6; i++){ erase(8 + 21*newX + i, 84 + 21*newY); for(char i < 6; i++){ erase(1 + 21*newX, 72 + 21*newY + i); for(char i < 6; i++){ erase(20 + 21*newX, 72 + 21*newY + i); erase(2 + newx*21,70 + newy*21); erase(2 + newx*21,71 + newy*21); erase(2 + newx*21,78 + newy*21); erase(2 + newx*21,79 + newy*21); erase(19 + newx*21,70 + newy*21); erase(19 + newx*21,71 + newy*21); erase(19 + newx*21,78 + newy*21); erase(19 + newx*21,79 + newy*21); erase(6 + newx*21,66 + newy*21); erase(7 + newx*21,66 + newy*21); erase(14 + newx*21,66 + newy*21); erase(15 + newx*21,66 + newy*21); erase(6 + newx*21,83 + newy*21); erase(7 + newx*21,83 + newy*21); erase(14 + newx*21,83 + newy*21); erase(15 + newx*21,83 + newy*21); erase(5 + newx*21, 67 + newy*21); erase(4 + newx*21, 68 + newy*21); erase(3 + newx*21, 69 + newy*21); erase(5 + newx*21, 82 + newy*21); erase(4 + newx*21, 81 + newy*21); erase(3 + newx*21, 80 + newy*21); erase(16 + newx*21, 67 + newy*21); erase(17 + newx*21, 68 + newy*21); erase(18 + newx*21, 69 + newy*21); erase(16 + newx*21, 82 + newy*21); erase(17 + newx*21, 81 + newy*21); erase(18 + newx*21, 80 + newy*21); 34

void setdatadirection() { DDRD = 0b11111111; DDRB = 0b11111111; void startdisplay() { PORTB = 0b00111111; cs1low(); cs2low(); resethigh(); rwlow(); rslow(); ehigh(); cs1high(); cs2high(); elow(); ehigh(); void stopdisplay() { PORTB = 0b00111110; cs1low(); cs2low(); resethigh(); rwlow(); rslow(); ehigh(); cs1high(); cs2high(); elow(); ehigh(); 35