Calculadora em PIC PDF

Title Calculadora em PIC
Author Lohrann Faber
Course Redes De Computadores II
Institution Universidade Federal Fluminense
Pages 6
File Size 60.6 KB
File Type PDF
Total Downloads 61
Total Views 147

Summary

Desenvolvi junto com meus companheiros de grupo uma calculadora em PIC. Nesse arquivo está o código de desenvolvimento da peça. Pode ser utilizado para testes, normalmente....


Description

Nomes: Lohrann Ionaldo Marco Molina principal.c #include #include #include #include #include #include #include "Rotinas_LCD.h"

#define LED0_TRIS #define LED0_IO #define LED1_TRIS #define LED1_IO #define LED2_TRIS #define LED2_IO #define LED3_TRIS #define LED3_IO #define LED4_TRIS #define LED4_IO

(TRISEbits.TRISE0) (LATEbits.LATE0) (TRISEbits.TRISE1) (LATEbits.LATE1) (TRISEbits.TRISE2) (LATEbits.LATE2) (TRISEbits.TRISE3) (LATEbits.LATE3) (TRISEbits.TRISE4) (LATEbits.LATE4)

#define B0_TRIS #define B0_IO #define B1_TRIS #define B1_IO #define B2_TRIS #define B2_IO #define B3_TRIS #define B3_IO #define B4_TRIS #define B4_IO

(TRISBbits.TRISB0) (PORTBbits.RB0) (TRISBbits.TRISB1) (PORTBbits.RB1) (TRISBbits.TRISB2) (PORTBbits.RB2) (TRISBbits.TRISB3) (PORTBbits.RB3) (TRISBbits.TRISB4) (PORTBbits.RB4)

#pragma config WDT = OFF //desligando o watchdog timer #pragma config WDTPS = 1 //pre-scaler #pragma config DEBUG = OFF #pragma config FOSC = HSPLL //HS oscillator #pragma config FOSC2=ON //INTRC enabled as system clock when OSCCON = 00 #pragma config XINST = OFF //extended instruction off #pragma config STVR = ON //Reset on stack overflow/underflow enabled #pragma config CP0 = OFF //Program memory is not code-protected #pragma config FCMEN = OFF //Fail-Safe Clock Monitor disabled #pragma config IESO = OFF //Two-Speed Start-up disabled #pragma config ETHLED = OFF //RA0/RA1 function as I/O regardless of Ethernet module status #pragma config ECCPMX = OFF //ECCP1 outputs (P1B/P1C) are multiplexed with RH7 and RH6; ECCP3 outputs (P3B/P3C) are multiplexed with RH5 and RH4 #pragma config CCP2MX = OFF //ECCP2/P2A is multiplexed with RE7 in Microcontroller mode (80-pin and 100-pin devices) or with RB3 in Extended Microcontroller mode (100-pin devices only) typedef int bool; enum { false, true };

int digitoA = 0; int digitoB = 0; int operador = 0;

void Atraso() { Delay1KTCYx(0); Delay1KTCYx(0); Delay1KTCYx(0); Delay1KTCYx(0); //(1/(25MHZ / 4 )) = 0,16ns ou 160us return; //160us * 1000 = 160ms * tempo = 160ms } void MCU_init(void) { LATA = LATB = LATD = TRISA = TRISH = 0; TRISB = 0x00; ADCON1 = 0x0F; // ADC convertors will be used with AN2 and AN3 CMCON = 0x07; // turn off comparators TRISH = 0; LATH = 0; } void imprimirOperador(int op, int coluna, int linha) { switch (op) { case 1: LCD_pos_xy(coluna, linha); //posiciono na coluna e na linha conforme variáveis estipuladas na função; LCD_write_string_rom("+"); //mostro na tela a operação; break; case 2: LCD_pos_xy(coluna, linha); LCD_write_string_rom("-"); break; case 3: LCD_pos_xy(coluna, linha); LCD_write_string_rom("*"); break; case 4: LCD_pos_xy(coluna, linha); LCD_write_string_rom("/"); break; case 5: LCD_pos_xy(coluna, linha); LCD_write_string_rom("="); break; } } void imprimeNumero(int numero, int coluna, int linha) { //função para imprimir o número na tela; char *txt; LCD_pos_xy(coluna, linha); itoa(numero, txt); LCD_write_string(txt); } int resultadoParcial(int operacao) { //Aqui as operações são efetuadas, utilizando-se da variável de controle operação para estipular qual operação será efetuada switch (operacao) { case 1: return digitoA + digitoB; break;

case 2: return digitoA - digitoB; break; case 3: return digitoA * digitoB; break; case 4: if (digitoB == 0) { return 0; break; } else { return digitoA / digitoB; break; } } } void efetuarOperacao(int a, int b, int operacao, int linha) { imprimeNumero(a, 1, linha); imprimirOperador(operacao, 4, linha); imprimeNumero(b, 5, linha); imprimirOperador(5, 8, linha); } void resultadoFinal(int a, int b, int op, int linha) { switch (op) { case 1: efetuarOperacao(a, b, op, linha); imprimeNumero(a + b, 9, linha); break; case 2: efetuarOperacao(a, b, op, linha); imprimeNumero(a - b, 9, linha); break; case 3: efetuarOperacao(a, b, op, linha); imprimeNumero(a * b, 9, linha); break; case 4: if (b == 0) { LCD_write_char('\f'); LCD_pos_xy(0, 0); LCD_write_string_rom("erro divisao por 0"); LCD_pos_xy(0, 1); LCD_write_string_rom("operacao invalida"); break; }else{ efetuarOperacao(a, b, op, linha); imprimeNumero(a / b, 9, linha); break; } default: LCD_pos_xy(1, linha); LCD_write_string_rom("A:"); imprimeNumero(a, 3, linha); LCD_pos_xy(7, linha); LCD_write_string_rom("B:"); imprimeNumero(b, 9, linha); break;

} } int incrementaNumero() { LCD_write_char('\f'); if (operador == 0) { digitoA++; imprimeNumero(digitoA, 0, 0); Atraso(); } else { digitoB++; imprimeNumero(digitoA, 0, 0); imprimirOperador(operador, 3, 0); imprimeNumero(digitoB, 4, 0); Atraso(); } } int decrementar() { LCD_write_char('\f'); if (operador == 0) { digitoA--; imprimeNumero(digitoA, 0, 0); Atraso(); } else { digitoB--; imprimeNumero(digitoA, 0, 0); imprimirOperador(operador, 3, 0); imprimeNumero(digitoB, 4, 0); Atraso(); } } void msgErro() { LCD_write_char('\f'); LCD_pos_xy(0, 0); LCD_write_string_rom("OPERACAO"); LCD_pos_xy(0, 1); LCD_write_string_rom("INVALIDA"); Atraso(); } int main(void) { MCU_init(); //inicializa os periféricos do PIC LCD_init(); //inicializa display LCD LCD_write_char('\f'); //apaga os dados do display LCD_pos_xy(0, 0); //posiciona o cursor na primeira linha e primeira coluna LCD_write_string_rom("Calc Redes II"); //escreve string no display LCD_pos_xy(0, 1); //posiciona o cursor na primeira linha e primeira coluna LCD_write_string_rom("Inicio"); //escreve string no display TRISE = 0b00000000; TRISB = 0b00011111; OpenADC(0x00, 0x00, ADC_0ANA); CloseADC(); while (1) { bool gerarParcial = false; bool operacao = true; char *strg; int estado = 0; digitoA = 0; digitoB = 0;

operador = 0; while (operacao) { switch (estado) { case 0: //ESTADO Q0_______________________________________________________________ if (B3_IO == 0 || B4_IO == 0) { //ERRO S4/S6 msgErro(); } else if (B0_IO == 0) { //INCREMENTA VALOR COM S1 estado = 1; incrementaNumero(); } else if (B1_IO == 0) { //DECREMENTA VALOR COM S2 estado = 1; decrementar(); } break; case 1: //ESTADO Q1_______________________________________________________________ if (B0_IO == 0) { //INCREMENTA VALOR COM S1 incrementaNumero(); } else if (B1_IO == 0) { //DECREMENTA VALOR COM S2 decrementar(); } else if (B3_IO == 0) { //ALTERNA ENTRE OS OPERADORES COM S4 if (gerarParcial) { digitoA = resultadoParcial(operador); digitoB = 0; gerarParcial = false; operador = 0; } operador++; if (operador > 4 || operador < 1) { operador = 1; } estado = 2; LCD_write_char('\f'); LCD_pos_xy(0, 0); itoa(digitoA, strg); LCD_write_string(strg); imprimirOperador(operador, 3, 0); Atraso(); } else if (B4_IO == 0) { //APRESENTA O RESULTADO COM S6 E RETORNA AO INICIO LCD_write_char('\f'); LCD_pos_xy(1, 1); resultadoFinal(digitoA, digitoB, operador, 1); operacao = false; Atraso(); } break; case 2: //ESTADO Q2_______________________________________________________________ gerarParcial = true; if (B0_IO == 0) { //INCREMENTA VALOR COM S1 estado = 1; incrementaNumero(); } else if (B1_IO == 0) { //DECREMENTA VALOR COM S2 estado = 1; decrementar(); } else

if (B3_IO == 0) { //ALTERNA ENTRE OS OPERADORES COM S4 operador++; if (operador > 4 || operador < 1) { operador = 1; } LCD_write_char('\f'); imprimeNumero(digitoA, 0, 0); imprimirOperador(operador, 3, 0); Atraso(); } else if (B4_IO == 0) { //ERRO S6 msgErro(); } break; } } } }...


Similar Free PDFs