Källkod
Main.c
/*
* TicTacToe_Test2.c
*
* Created: 2023-05-15 14:13:20
* Author : an8615ka-s
*/
#define F_CPU 8000000
#define SIZE 3
#include
#include
#include
#include
#include
#include
#include
extern void Led(int n, int c);
void initPins() { // INITIERAR ALLA PINS OCH DDR
PORTB |= 0b11100000;
PORTD |= 0b00000000;
DDRB |= 0b11100000;
DDRD |= 0xFF;
}
void resetBoard(int board[]) { // ST�NGA AV ALLA LAMPOR!
for (int i=0; i < 10; i++) {
Led(i,0);
}
}
void sendColors(int board[]) { // SKICKAR F�RGER TILL LAMPOR 1 -> 9
for (int i = 0; i < 9; i++) {
Led(i+1, i);
_delay_ms(50);
}
}
int main(void)
{
initPins();
int gameBoard[] = {0,0,0,0,0,0,0,0,0};
resetBoard(gameBoard);
Led(0,2); // VISAR ATT DEN �R REDO F�R KEYPRESS!
int keypad = 100;
int player = 1;
while (1)
{
DDRB |= 0b11100000;
keypad = 100;
if (PINB != keypad) {
DDRB |= 0b11100000;
keypad = PINB;
if (keypad != 100) {
switch(keypad) {
case 0:
Led(7,player);
break;
case 1:
Led(4,player);
break;
case 2:
Led(1,player);
break;
case 8:
Led(9,player);
break;
case 9:
Led(6,player);
break;
case 10:
Led(3,player);
break;
case 12:
Led(8,player);
break;
case 13:
Led(5,player);
break;
case 14:
Led(2,player);
break;
case 11: ; // BOT VS BOT;
int choice = -1;
int turn = 1;
Led(0,1);
while(checkWinner(gameBoard) == 0){
int sum = 0; // Sum-funktionen �r till f�r att stoppa n�r br�det �r oavgjort.
for (int i = 0; i < 9; i ++) {
sum += gameBoard[i];
}
if (sum > 16) {
break;
}
Led(0, turn);
do {
choice = rand() % 9;
} while (gameBoard[choice] > 0);
_delay_ms(100);
gameBoard[choice] = turn;
Led(choice+1, turn);
if (turn == 3) {
turn = 1;
} else if (turn == 1) {
turn = 3;
}
}
break;
case 15: // Resettar v�rdet p� gameBoard och sl�cker alla lampor.
for (int i = 0; i < 9; i ++) {
gameBoard[i] = 0;
}
resetBoard(gameBoard);
break;
case 4:
player = 1;
Led(0,player);
break;
case 5:
player = 3;
Led(0,player);
case 3:
srand(1337);
_delay_ms(300);
break;
case 7:
srand(420);
_delay_ms(300);
break;
case 6:
srand(6969);
_delay_ms(300);
break;
default:
break;
}
}
}
}
}
int checkWinner(int board[]) {
// Rader och kolonner
for (int i = 0; i < SIZE; i++) {
if (board[i*SIZE] != 0 && board[i*SIZE] == board[i*SIZE+1] && board[i*SIZE+1] == board[i*SIZE+2])
return board[i*SIZE];
if (board[i] != 0 && board[i] == board[i+SIZE] && board[i+SIZE] == board[i+2*SIZE])
return board[i];
}
// Diagonaler
if (board[0] != 0 && board[0] == board[4] && board[4] == board[8])
return board[0];
if (board[2] != 0 && board[2] == board[4] && board[4] == board[6])
return board[2];
return 0;
}
Colors.c
extern void send_one();
extern void send_zero();
extern void send_ret();
#define F_CPU 8000000
#include
#include
#include
#include
#include
#include
void green_led() {
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_ret();
}
void blue_led() {
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_ret();
}
void red_led() {
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_one();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_ret();
}
void noll_led() {
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_zero();
send_ret();
}
void ret() {
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
send_ret();
}
void Led(int n, int c) {
switch (n)
{
case 0:
DDRB = 0b00000000;
DDRD = 0b01000000;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 1:
DDRB = 0b00000000;
DDRD = 0b00100000;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 2:
DDRB = 0b00000000;
DDRD = 0b00010000;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 3:
DDRB = 0b00000000;
DDRD = 0b00001000;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 4:
DDRB = 0b00000000;
DDRD = 0b00000100;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 5:
DDRB = 0b00000000;
DDRD = 0b00000010;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 6:
DDRB = 0b00000000;
DDRD = 0b00000001;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 7:
DDRB = 0b10000000;
DDRD = 0b00000000;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 8:
DDRB = 0b01000000;
DDRD = 0b00000000;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
case 9:
DDRB = 0b00100000;
DDRD = 0b00000000;
switch (c)
{
case 0: //Ingen f�rg
noll_led();
break;
case 1: //R�d
red_led();
break;
case 2: //Gr�n
green_led();
break;
case 3: //Bl�
blue_led();
break;
}
_delay_ms(500);
break;
default:
break;
}
}
Assembly.s
.global send_one
.global send_zero
.global send_ret
.global read_buttons
#define PORTD 0x0B
#define DDRD 0x0A
#define PIND 0x09
#define PINA 0x20
#define DDRA 0x01
#define PORTB 0x05
#define DDRB 0x04
send_one:
ldi r19, 0b11111111
out PORTB, r19
out PORTD, r19
nop
nop
ldi r18, 0b00000000
nop
out PORTB, r18
out PORTD, r18
ret
send_zero:
ldi r18, 0b11111111
out PORTB, r18
out PORTD, r18
ldi r18, 0b00000000
out PORTB, r18
out PORTD, r18
ret
send_ret:
ldi r18,0b00000000
out PORTB, r18
out PORTD, r18
ldi r19, 20
loop1:
ldi r18, 10
loop2:
dec r18
brne loop2
dec r19
brne loop1
ret