⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 project3.c

📁 Simple game that runs on PIC18 microcontroller.
💻 C
字号:
#include <p18f8680.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define	LF	0x0A // Line feed
#define	CR	0x0D // Carriage return

unsigned char CountTemp, P0Done, P1Done;
unsigned long int Time0, Time1, T0LTemp, T0HTemp;
unsigned int T0_Count;

char P0Time[10], P1Time[10];

const char Time[] = "Game over!";
const char Error[] = "Who didn't push their button?";
const char Baud19200[] = "Connection established at 19200 baud!";
const char Start[] = "Hit enter to start the game!";
const char P0[] = "Player 0 time (ms): ";
const char P1[] = "Player 1 time (ms): ";
const char P0Win[] = "Player 0 is the weiner!!!";
const char P1Win[] = "Player 1 is the weiner!!!";


////////// Prototypes //////////
void high_isr(void);
void SerialCharSend(char ptr);
char SerialCharReceive(void);
void SerialStrSend(char *ptr);
void SerialStrReceive(char *ptr);


#pragma code interrupt_at_high_vector = 0x08
void interrupt_at_high_vector(void)
{
	_asm
	GOTO high_isr
	_endasm
}

#pragma code 
#pragma interrupt high_isr
void high_isr(void)
{
	INTCONbits.GIE = 0; //Disable all interrupts
	if (INTCONbits.TMR0IF)
	{
		INTCONbits.TMR0IF = 0; //Clear TMR0 interrupt flag
		TMR0H = 0xE0; // Overflows in 1 millisecond
		TMR0L = 0xBF;
		T0_Count++;
		PORTD = T0_Count;
	}
	
	if (INTCONbits.INT0IF && P0Done == 0)
	{
		Time0 = 0;
		INTCONbits.INT0IF = 0;
		Time0 = T0_Count;
		ltoa (Time0, P0Time);
		SerialStrSend(P0);
		SerialStrSend(P0Time);
		SerialCharSend(LF);
		SerialCharSend(CR);
		P0Done++;
	}
	
	if (INTCON3bits.INT1IF && P1Done == 0)
	{
		Time1 = 0;
		INTCON3bits.INT1IF = 0;		
		Time1 = T0_Count;
		ltoa (Time1, P1Time);
		SerialStrSend(P1);
		SerialStrSend(P1Time);
		SerialCharSend(LF);
		SerialCharSend(CR);
		P1Done++;
	}
		
	INTCONbits.GIE = 1; //Enable all interrupts
}

void SerialCharSend(char ptr)
{
	while(!PIR1bits.TXIF);
	TXREG = ptr;
}
void SerialStrSend(char *ptr)
{
	while(*ptr)
	{
        SerialCharSend(*ptr);
		ptr++;
	}
}

char SerialCharReceive(void)
{
	while (!PIR1bits.RCIF);
	PORTD = RCREG;
	return RCREG;
}

void SerialStrReceive(char *ptr)
{
	char x;
	while (1)
	{
		x = SerialCharReceive();
		if (x == CR)
		{
			*ptr = 0;
			return;
		}
		*(ptr++) = x;
	}
}

void Initialize(void)
{
	
	TRISB = 0xFF; // All bits input (Push Buttons)
	TRISD = 0x00; // LED port output
	PORTD = 0xFF; // Turn off all LED's
	T0CON = 0x88; // Set up as 16 bit timer with no prescaler
	
	////////// Set up USART //////////
	TXSTA = 0x24;  // enable 8-bit transmission, high baud rate
	TRISCbits.TRISC7 = 1;  // RC7 pin input
	TRISCbits.TRISC6 = 0;  // RC6 pin output
	RCSTAbits.SPEN = 1;  // Enable USART
	RCSTAbits.CREN = 1;  // Enable USART receive
 
 	while(PORTBbits.RB3); // Wait until ready to transmit
	while(!PORTBbits.RB3); // Hold program until button is released
	
	////////// Set and display baud rate //////////
	SPBRG = 103;  // Baud rate is 19200 assumming 32MHz crystal
	SerialCharSend(LF);
	SerialCharSend(CR);
	SerialStrSend(Baud19200); // Send 19200 baud message
	SerialCharSend(LF);
	SerialCharSend(CR);
		
}

void Startup(void)
{
	
	char key;
	
	
	SerialStrSend(Start); // Send 19200 baud message
	SerialCharSend(LF);
	SerialCharSend(CR);
	while (key != CR) // Wait for user to hit enter
	{
		key = SerialCharReceive();
	}
	P0Done = 0;
	P1Done = 0;
	PORTD = 0;
	T0_Count = 0;		
	INTCONbits.TMR0IF = 0;		
	TMR0H = 0xE0; // Overflows in 1 millisecond
	TMR0L = 0xBF;
}


void main (void)
{	
	long int D0, D1;
	char D0str[10], D1str[10];
	
	Initialize(); // Set up ports, USART, etc
	INTCON = 0xF0;
	INTCON3 = 0xC8;
			
	while(1)
	{
		Startup(); // Start the game
				
		while (T0_Count < 10000 && !(P0Done == 1 && P1Done == 1));

		if (P0Done == 0 || P1Done == 0)
		{
			SerialStrSend(Error);
			SerialCharSend(LF);
			SerialCharSend(CR);
		}
		else
		{
			D0 = Time0 - 5000;
			D1 = Time1 - 5000;
			
			if (D0 < 0)
				D0 *= -1;
			if (D1 < 0)
				D1 *= -1;
			
			if (D0 < D1)
			{
				SerialStrSend(P0Win);
				SerialCharSend(LF);
				SerialCharSend(CR);
			}
			else
			{
				SerialStrSend(P1Win);
				SerialCharSend(LF);
				SerialCharSend(CR);
			}
		}
		
		SerialStrSend(Time);
		SerialCharSend(LF);
		SerialCharSend(LF);
		SerialCharSend(CR);
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -