Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save samirfor/8d1605a9d794310fa1c3 to your computer and use it in GitHub Desktop.
Save samirfor/8d1605a9d794310fa1c3 to your computer and use it in GitHub Desktop.
Este programa reproduz um semáforo de LEDs com sinalização de tempo para pedestres com 2 displays de 7 segmentos multiplexados (cronometro regressivo).
/**
* Ferramenta SanUSB: http://sanusb.site50.net/
* Compilar com MPLABX+C18: https://drive.google.com/open?id=0B5332OAhnMe2N3czQWxVX0JVSkE&authuser=0
*
* Este programa reproduz um semáforo de LEDs com sinalização de tempo para
* pedestres com 2 displays de 7 segmentos multiplexados (cronometro regressivo).
*
* Foto da placa: https://drive.google.com/file/d/0BwIZj8djOAj2cTFsdTNTMDNCd0k/view?usp=sharing
* Esquema no fritzing: https://drive.google.com/file/d/0BwIZj8djOAj2RTVxTGNoY00wQ1E/view?usp=sharing
* https://drive.google.com/file/d/0BwIZj8djOAj2M3pYcUMySTFYRG8/view?usp=sharing
* Vídeo: https://www.youtube.com/watch?v=3dmpNWE2bjE
*/
#include "SanUSB48.h"
#define v_vermelho pin_a0
#define v_amarelo pin_a1
#define v_verde pin_a2
#define p_vermelho pin_a4
#define p_verde pin_a5
#define d_unidade pin_c1
#define d_dezena pin_c0
short int requisicao_pedestre = 0;
int i, z, dezena, unidade;
//Vetor para display Catodo Comum
unsigned char set_seg[10] = {0x6F, 0x7F, 0x07, 0x7D, 0x6D, 0x66, 0x4F, 0x5B, 0x06, 0x3F}; //numeros de 0 a 9 em hexadecimal para
//Vetor para display Anodo Comum
//unsigned char set_seg[10] = {0x10, 0x00, 0x78, 0x02, 0x12, 0x19, 0x30, 0x24, 0x79, 0x40}; //numeros de 0 a 9 em hexadecimal para
#pragma interrupt interrupcao //Tem que estar aqui ou dentro do firmware.c
void interrupcao() {
}
void checar_botao(int z) {
int i = 0;
for (i = 0; i <= z; i++) {
tempo_ms(100);
if (!entrada_pin_e3) {
requisicao_pedestre = 1;
}
}
}
/**
* Semáforo com tempo para pedestre e 2 displays de 7 seg. multiplexados.
*/
void main() {
clock_int_48MHz();
TRISA = 0;
TRISB = 0;
TRISC = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
// Luzes dos semáforos
PORTAbits.RA0 = 1;
PORTAbits.RA1 = 0;
PORTAbits.RA2 = 0;
PORTAbits.RA4 = 1;
PORTAbits.RA5 = 0;
while (1) {
nivel_baixo(v_vermelho);
nivel_baixo(v_amarelo);
nivel_alto(v_verde);
checar_botao(40);
nivel_baixo(v_vermelho);
nivel_alto(v_amarelo);
nivel_baixo(v_verde);
tempo_ms(1500);
nivel_alto(v_vermelho);
nivel_baixo(v_amarelo);
nivel_baixo(v_verde);
tempo_ms(2000);
if (requisicao_pedestre == 1) {
nivel_baixo(p_vermelho);
nivel_alto(p_verde);
// Lógica dos displays multiplexados
for (i = 0; i < 99; i++) {
for (z = 0; z < 15; z++) { // delay para melhor visualização
dezena = i / 10;
unidade = i % 10;
nivel_alto(d_unidade); // seleciona display das unidades
nivel_baixo(d_dezena);
PORTB = set_seg[dezena]; // seta valor da dezena
tempo_ms(3);
nivel_alto(d_dezena); // seleciona display das dezenas
nivel_baixo(d_unidade);
PORTB = set_seg[unidade]; // seta valor da unidade
tempo_ms(3);
}
}
// apaga os displays
PORTB = 0;
PORTC = 0;
nivel_baixo(p_verde);
nivel_alto(p_vermelho);
requisicao_pedestre = 0; // flag desligada
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment