Está en la página 1de 2

D:\JAPV\2014\JAPV2014\I SEMESTRE\01-MICROPROCESADORES\PIC18F458\SEMÁFORO\SEMAFORO.

c
/////////////////////////////////////////////////////////////////////////
//// LABORATORIO No. 3 PIC18F458 ////
//// ////
//// CONTROL DE UN SEMAFORO ////
//// ////
//// Ing. José Pereira V. MICROPROCESADORES ////
//// DD MM AAAA ////
//// 19/06/2014 ////
//// ////
/////////////////////////////////////////////////////////////////////////

#include <18F458.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)

#DEFINE PORTB 0xF81 //PÀGINA 49 DEL MANUAL DEL PIC18F458


#DEFINE TRISB 0xF93 //ESTÀN LAS DIRECCIONES DE LOS REGISTROS

#DEFINE STATUS 0xFD8 //Registro de banderas


#DEFINE Z 2 //Bandera de "zero", bit 2 de registro STATUS

void main() {

int8 CONTADOR;
int8 Cont1;
int8 Cont2;
int8 DoscienMS;

#asm

CLRF PORTB //Inicializa PORTB borrando los latches de salida


MOVLW 0x00 //Valor usado para inicializar la direccion de los datos
MOVWF TRISB //PUERTO B ES DE SALIDA

; ******************************************************************************************
Lazo:
clrf CONTADOR //Borramos (ponemos en cero) las siguientes 4 variables
clrf Cont1
clrf Cont2
clrf DoscienMS
// ******************************************************************************************
//PRIMERA COMBINACIÓN HACIA EL SEMÁFORO: VERDE 1, ROJO 2
//
movlw 0b00100001 //Primera secuencia de semáforo
movwf PORTB //enviada al Puerto B
call RetardoL //Llamada a sub-rutina. Retardo Largo
// ******************************************************************************************
// SEGUNDA COMBINACIÓN. VERDE 1 PARPADEA, ROJO 2
//
movlw 04 // La luz verde parpadea 4 veces
movwf CONTADOR
Lazo01:
movlw 0b00000001
movwf PORTB
call RetardoC // Llamada a sub-rutina. Retardo Corto
movlw 0b00100001
movwf PORTB
call RetardoC
decfsz CONTADOR,F
bra Lazo01
// *******************************************************************************************
// TERCERA COMBINACIÓN. AMARILLO 1, ROJO 2
//
movlw 0b00010001
movwf PORTB
call RetardoM // Llamada a Retardo Mediano
// *******************************************************************************************
// CUARTA COMBINACIÓN. ROJO 1, VERDE 2
//
movlw 0b00001100
movwf PORTB
call RetardoL
// ******************************************************************************************
// QUINTA COMBINACIÓN. ROJO 1, VERDE 2 PARPADEA
//
movlw 4 // Luz verde parpadea 4 veces
movwf CONTADOR
Lazo02:
movlw 0b00001000
movwf PORTB
call RetardoC
movlw 0b00001100
movwf PORTB
call RetardoC
decfsz CONTADOR,F
bra Lazo02
//******************************************************************************************
// SEXTA COMBINACIÓN. ROJO 1, AMARILLO 2
//
movlw 0b00001010
movwf PORTB
call RetardoM
bra Lazo //Vuelve a repetir el programa
//******************************************************************************************
// RUTINA DE RETARDO CORTO
//
RetardoC:
decfsz Cont1 // Estas 4 instrucciones tardan 197.376 ms en ser ejecutadas
bra RetardoC
decfsz Cont2

1
D:\JAPV\2014\JAPV2014\I SEMESTRE\01-MICROPROCESADORES\PIC18F458\SEMÁFORO\SEMAFORO.c
bra RetardoC
//
movlw 2 //Al multiplicarlo por "2" nos da 394.752 ms, que es lo
incf DoscienMS //que tarda este retardo corto. Este se usa para hacer
xorwf DoscienMS,W //parpadear la luz verde.
btfss STATUS,Z
bra RetardoC
clrf DoscienMS
return
//
// *****************************************************************************************
// RUTINA DE RETARDO MEDIO
//
RetardoM:
decfsz Cont1 // Estas 4 instrucciones tardan 197.376 ms en ser ejecutadas
bra RetardoM
decfsz Cont2
bra RetardoM
//
movlw 10 //Al multiplicarlo por "10" nos da 1.97 s, que es lo que
incf DoscienMS //tarda este retardo mediano. Esto es lo que tarda
xorwf DoscienMS,W // la luz amarilla encendida.
btfss STATUS,Z
bra RetardoM
clrf DoscienMS
return
// *****************************************************************************************
// RUTINA DE RETARDO LARGO
//
RetardoL:
decfsz Cont1 // Estas 4 instrucciones tardan 197.376 ms en ser ejecutadas
bra RetardoL
decfsz Cont2
bra RetardoL
//
movlw 101 // Al multiplicarlo por "101" nos da 19.9 s, que es lo
incf DoscienMS // lo que tarda este retardo largo y por lo tanto la luz
xorwf DoscienMS,W // verde encendida.
btfss STATUS,Z
bra RetardoL
clrf DoscienMS
return

#endasm
}

También podría gustarte