Advertisement
paulogp

ATmega128: T2 - Controlo de parque de estacionamento de 9 lu

Jul 13th, 2011
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.61 KB | None | 0 0
  1. /* ATmega128: T2 - Controlo de parque de estacionamento de 9 lugares */
  2.  
  3. /* Pretende-se simular o control do acesso a uma garagem com uma lotação máxima de 9 viaturas. A entrada de viaturas é detectada pelos sensores S1 e S2 respectivamente, simulados pelos interruptores SW1 e SW2. Sempre que a lotação atingir o máximo, deve ser baixada a cancela de acesso através de M1, simulando pelo LED D8. Enquanto houver lugares vagos, a cancela de acesso deve manter-se levantada através de M2, simulando pelo LED D7. O display mais à direita deve mostrar o nº de lugares vagos na garagem. */
  4.  
  5.  
  6. #include <avr/io.h>
  7. //#include "C:\Program Files\WinAVR-20080610\avr\include\avr\io.h"
  8.  
  9.  
  10.  
  11. unsigned char the_counter = 9;
  12. unsigned char the_s1_status = 0;
  13. unsigned char the_s2_status = 0;
  14. unsigned char the_display[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
  15.  
  16.  
  17.  
  18. void inic(void) {
  19.     /* switch: simulam o sensor */
  20.     PORTA = 0xC0; // 0b11000000
  21.     DDRA = 0xC0; // 0b11000000
  22.  
  23.     /* leds */
  24.     PORTF = 0x3F; // 0b00111111
  25.     DDRF = 0xFF;
  26.  
  27.     /* display */
  28.     PORTC = 0xFF;
  29.     DDRC = 0xFF;
  30. }
  31.  
  32.  
  33.  
  34. int main(void) {
  35.     /* inicialização dos portos */
  36.     inic();
  37.  
  38.     /* acende o led com o digito 9 */
  39.     PORTC = the_display[the_counter];
  40.  
  41.     /* semaforo: parque livre */
  42.     PORTF = 0xBF; // 0b10111111
  43.  
  44.  
  45.     /* ciclo */
  46.     while(1) {
  47.         /* decrementa: 0b11111110 */
  48.         if(PINA == 0xFE) {
  49.             /* se nao foi premido entao continua */
  50.             if(the_s1_status == 0) {   
  51.                 the_s1_status = 1; // flag de controlo do premir do botao. evita contagens anomalas
  52.  
  53.                 /* se for maior que zero entao decrementa por causa do display */
  54.                 if (the_counter > 0) {                 
  55.                     the_counter--;
  56.  
  57.                     /* faz o output dos digitos */
  58.                     PORTC = the_display[the_counter];
  59.  
  60.                     if(the_counter == 0) {
  61.                         /* semaforo: parque completo */
  62.                         PORTF = 0x7F; // 0b01111111
  63.                     }
  64.                 }
  65.             }
  66.         } else {
  67.             /* reset s1 status se o input no PINA se alterar */
  68.             the_s1_status = 0;
  69.         }
  70.  
  71.  
  72.         /* incrementa: 0b11111101 */
  73.         if (PINA == 0xFD) {
  74.             /* se nao foi premido entao continua */
  75.             if(the_s2_status == 0) {
  76.                 the_s2_status = 1; // flag de controlo do premir do botao. evita contagens anomalas
  77.  
  78.                 /* se for maior que 9 entao incrementa por causa do display */
  79.                 if (the_counter < 9) {
  80.                     the_counter++;
  81.  
  82.                     /* faz o output dos digitos */
  83.                     PORTC = the_display[the_counter];
  84.  
  85.                     if (the_counter < 9) {
  86.                         /* semaforo: parque livre */
  87.                         PORTF = 0xBF; // 0b10111111
  88.                     }
  89.  
  90.                 }
  91.             }
  92.         } else {
  93.             /* reset s2 status se o input no PINA se alterar */
  94.             the_s2_status = 0;
  95.         }
  96.     }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement