📄 project3.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 + -