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