Você está na página 1de 4

// Programa 2 - EA871-2S2017 - Le botoes de pressao da placa Shield e muda os leds

vermelhos de acordo com a instrucao.


// Rodolfo Batista de Lima RA:176808

#include "derivative.h" /* include peripheral declarations */


#define SET_BIT(reg, idx) reg = (reg | (1 << idx)) // Macro que seta o bit
idx do registrador reg

/* Inicializa os GPIOs */
void init_GPIO(void) {

SET_BIT(SIM_SCGC5, 9); // Habilita clock do PORTA

PORTA_PCR4 &= 0xFFFFF8FF; // Configura MUX para PTA4, PTA5, PTA12


aparecerem nos pinos
SET_BIT(PORTA_PCR4, 8);
PORTA_PCR5 &= 0xFFFFF8FF;
SET_BIT(PORTA_PCR5, 8);
PORTA_PCR12 &= 0xFFFFF8FF;
SET_BIT(PORTA_PCR12, 8);

GPIOA_PDDR = 0; // Configura todos bits do PORTA como entrada

SET_BIT(SIM_SCGC5, 11); // Habilita clock do PORTC (System Clock Gating


Control)

PORTC_PCR0 &= 0xFFFFF8FF; // Configura MUX para PTC0-PTC7 e PTC10


aparecerem nos pinos
SET_BIT(PORTC_PCR0, 8);
PORTC_PCR1 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR1, 8);
PORTC_PCR2 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR2, 8);
PORTC_PCR3 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR3, 8);
PORTC_PCR4 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR4, 8);
PORTC_PCR5 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR5, 8);
PORTC_PCR6 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR6, 8);
PORTC_PCR7 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR7, 8);
PORTC_PCR10 &= 0xFFFFF8FF;
SET_BIT(PORTC_PCR10, 8);

GPIOC_PDOR = 0; // Garante nivel 0 em todas as saidas do


PORTC
GPIOC_PDDR = 0x000004FF; // Configura bits 0-7 e 10 do PORTC como
saidas
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
}

int main(void) {

init_GPIO();
uint16_t a, pta4, pta5, pta12, pta12n, pta4n, b, ptaa4, ptaa5, ptaa12, c;

void delay(unsigned int tempo) {

for ( ; tempo != 0; tempo--) ; // espera antes de retornar

for( ; ; ) {
int s1_e_s2=0, s2_e_s1=0, s2_e_s3=0, s1_e_s3=0;

a = GPIOA_PDIR; // Faz a leitura no PORTA (16 bits)


pta4 = a & (1<<4); //S1 acionado
pta5 = a & (1<<5); //S2 acionado
pta12 = a & (1<<12); //S3 acionado
if(pta4==0){ //Verificaao se S1 est acionado
if(pta12==0){ //Verificaao se S3 est acionado
s1_e_s3=1; //Variavel que indica que S1 e S3 estao
acionados
}
else {
delay(1000); //Tempo de espera para observar novamente
a leitura do PORTA caso os doos botoes nao estejam setados na primeira verificacao
b = GPIOA_PDIR; //Faz a leitura no PORTA (16 bits)
novamente
pta12n= b & (1<<12); //S3 acionado
if(pta12n==0){ //Verificaao se S3 est acionado
s1_e_s3=1; //Variavel que indica que S1 e S3
estao acionados
}
}
}
if(pta5==0){ //Verificaao se S2 est
acionado
if(pta4==0){ //Verificaao se S1 est
acionado
s2_e_s1=1; //Variavel que indica que S2
e S1 estao acionados
}
delay(1000); //Tempo de espera para
observar novamente a leitura do PORTA caso os doos botoes nao estejam setados na
primeira verificacao
b = GPIOA_PDIR; //Faz a leitura no PORTA (16
bits) novamente
pta4n= b & (1<<4); //S1 acionado
if(pta4n==0){ //Verificaao se S1 est
acionado
s2_e_s1=1; // S2 acionado simulataneamente a
S1
}
else{
if(pta12==0){ //Verificaao se S3 est acionado
s2_e_s3=1; //Variavel que indica que S2 e S3
estao acionados
}
b = GPIOA_PDIR; //Faz a leitura no PORTA (16 bits)
novamente
pta12n= b & (1<<12); //S3 acionado
if(pta12n==0){ //Verificaao se S3 est acionado
s2_e_s3=1; // S2 acionado simulataneamente a
S3
}
}
}

delay(100000);

c = GPIOA_PDIR; // Faz a leitura no PORTA (16 bits)


ptaa4 = c & (1<<4); //S1 acionado
ptaa5 = c & (1<<5); //S2 acionado
ptaa12 = c & (1<<12); //S3 acionado

if(pta5 == 0 && ptaa5 != 0&& s2_e_s3==0 && s2_e_s1==0) {


//Verifica que somente o Botao S2 esta acionado
GPIOC_PTOR= (1<<0); //Inverte o estado do
LED D0
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE (Latch Enable)
do registrador dos LEDs vermelhos (74HC573)
}
if(pta4 == 0 && ptaa4 != 0 && s2_e_s1==0 && s1_e_s3==0){ //Verifica que
somente o botao S1 esta acionado
GPIOC_PDOR = (GPIOC_PDOR >> 1); //Desloca para direita
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE (Latch Enable)
do registrador dos LEDs vermelhos (74HC573)
}
if(pta12== 0 && ptaa12!= 0 && s1_e_s3==0 && s2_e_s3==0){ //Verifica
que somente S3 esta acionado
GPIOC_PDOR = (GPIOC_PDOR << 1); //Desloca
para esquerda
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch
Enable) do registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE
(Latch Enable) do registrador dos LEDs vermelhos (74HC573)
}
if(s2_e_s1==1 && ptaa5!=0 && ptaa4!=0){ //Verifica que
somente S2 e S1 estao acionados
GPIOC_PTOR= (1<<0); //Inverte o estado do
LED D0
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE (Latch Enable)
do registrador dos LEDs vermelhos (74HC573)
delay(1000000);
GPIOC_PDOR = (GPIOC_PDOR >> 1); //Desloca para direita
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE (Latch Enable)
do registrador dos LEDs vermelhos (74HC573)
}
if(s2_e_s3==1&&ptaa5!=0 && ptaa12!=0 ){ //Verifica que
somente S2 e S3 estao acionados
GPIOC_PTOR= (1<<0); //Inverte o estado do
LED D0
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE (Latch Enable)
do registrador dos LEDs vermelhos (74HC573)
delay(1000000);
GPIOC_PDOR = (GPIOC_PDOR << 1); //Desloca para esquerda
GPIOC_PSOR = (1<<10); // Habilita o LE (Latch Enable) do
registrador dos LEDs vermelhos (74HC573)
GPIOC_PCOR = (1<<10); // Desabilita o LE (Latch Enable)
do registrador dos LEDs vermelhos (74HC573)
}

}
}

Você também pode gostar