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

📄 project2.c

📁 Calculator that runs on a PIC18 microcontroller
💻 C
字号:
#include <p18f8680.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

// Prototypes //
int atoi(const char *s);
char *ltoa(long value, char *string);
char *strpbrk(const char *str1, const char *str2);
char *strtok(char *str, const char *delim);

char AnsStr[10], Operator[40], Num_Str[81];

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)
{
	const char Baud4800[] = "Connection established at 4800 baud!";
	const char Baud9600[] = "Connection established at 9600 baud!";
	
	TRISB = 0xFF; // All bits input (Push Buttons)
	TRISD = 0x00; // LED port output
	TRISF = 0xFF; // DIP switch port input
	PORTD = 0xFF; // Turn off all LED's
	
	////////// Set up USART //////////
	TXSTA = 0x20;  // enable 8-bit transmission, low 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.RB0); // Wait until ready to transmit
	
	////////// Set and display baud rate //////////
	switch (PORTFbits.RF7) // Check baud rate DIP switch
	{
		case 0:  // Dip switch down
			SPBRG = 51;  // Baud rate is 9600 assumming 32MHz crystal
			SerialCharSend(LF);
			SerialCharSend(CR);
			SerialStrSend(Baud9600); // Send 9600 baud message
			SerialCharSend(LF);
			SerialCharSend(CR);
			break;
		case 1:  // Dip switch up
			SPBRG = 103;  // Baud rate is 4800 assumming 32MHz crystal
			SerialCharSend(LF);
			SerialCharSend(CR);
			SerialStrSend(Baud4800); // Send 4800 baud message
			SerialCharSend(LF);
			SerialCharSend(CR);
			break;
	}
}

int Calculate(void)
{	
	const char Operator_Str[] = "+-";
	char i, Found, *Temp;
	long int Result;
	int Num[41];	
	
	////////// Find + and - characters //////////
	Temp = strpbrk (Num_Str, Operator_Str);
	for (Found=0; Temp!=NULL; Found++)
	{
		Operator[Found] = *Temp;
		Temp = strpbrk (Temp + 1, Operator_Str);
	}
		
	////////// Break string up into tokens and convert to integers //////////
	Temp = strtok (Num_Str, Operator_Str);
	Num[0] = atoi(Temp);
	for (i=1 ; Temp!=NULL; i++)
	{
		Temp = strtok (NULL, Operator_Str);
		Num[i] = atoi(Temp);		
	}
	
	///////// Calculate and display the result ////////
	Result = Num[0];
	for(i=0; i<Found; i++)
	{
		if (Operator[i] == '+')
			Result += Num[i+1];
			
		if (Operator[i] == '-')
			Result -= Num[i+1];
	}		
	return Result;
}

void main (void)
{	
	const char EnterEqu[] = "Enter an equation: ";
	long int Answer;
	
	Initialize(); // Set up ports, USART, etc
	
	while(1)
	{
		SerialCharSend(LF);
		SerialCharSend(CR);
		SerialStrSend(EnterEqu); // Prompt user to enter equation
				
		SerialStrReceive(Num_Str); // Receive raw function as a string
		Answer = Calculate(); // Process and calulate function to get the result
				
		ltoa(Answer, AnsStr); // Convert long integer answer to a string
		
		SerialCharSend(LF);
		SerialCharSend(CR);
		SerialStrSend(AnsStr); // Display the answer
		SerialCharSend(LF);
		SerialCharSend(CR);
	}	
}

⌨️ 快捷键说明

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