1. 1
PROYECTOS EN BASIC PROTON
PROYECTO 1
Escribir el siguiente programa y guardarlo en una carpeta, compilar el programa y simularlo en
Proteus
Device=16F84A
XTAL 4
Output PORTB
PORTB= %11111111
‘Selección del Pic
‘Pone los bits del puerto B como salida al igual que TRISB
‘Se envía un 1 lógico a todo el puerto B, aquí pudo ser PORTB= 255, o
‘$FF
End
PROYECTO 2
Parpadeo de Leds
El parpadeo tiene dos fases, una ON y otra de OFF. Ambas fases tienen un período de tiempo
determinado, antes de cambiar al otro estado. Esto determina la frecuencia de parpadeo. Si los
tiempos de ON y OFF son los mismos, podemos decir que es una onda cuadrada. Para ver estos
pulsos, estamos usando LEDS a través de sentencias de bucle.
Device=16f84a
XTAL 4
Output PORTB
Loop:
PORTB=255
DelayMS 1000 ‘Deja a los leds encendidos durante 1 segundo
PORTB=0
DelayMS 1000
GoTo Loop
‘Repite el proceso
End
Se declara una etiqueta llamada Loop, y una declaración correspondiente Goto Loop.
Las instrucciones entre estas dos declaraciones se repetirán indefinidamente.
PORTD = 255 todos los LEDS en ON. Sin embargo, antes de desactivarlos, tenemos que
imponer un retraso.
DelayMS 1000
Esta declaración da un retraso en mili-segundos del número. Así 1000ms de demora es igual a
1 segundo, de manera similar 500ms retraso es medio segundo, y 100 ms es 1/10 de un
segundo. También se pueden hacer retrasos en micro-segundos usando DelayUs.
Los LEDS se encienden, y el procesador demora la activación en 1 segundo, entonces PORTB =
0 apagará los LEDS. Una vez más, introducir un retraso, para mantenerlos en la condición
actual durante 1 segundo. Después de un retraso de 1segundo, cuando los leds están
apagados, el comando GOTO transfiere el control de nuevo a la sentencia de bucle, que es
seguido por PORTB = 255, que volverá a su vez LEDS ON.
El ciclo de ON / OFF con 1 segundo continuará para siempre. En otras palabras, podemos decir
una onda cuadrada de 1 Hz se está generando en todos los pines de PORTB.
2. 2
EJERCICIOS 1. Realizar los siguientes ejercicios:
1. Led activado durante 200 ms y apagado durante 2 segundos
2. Parpadeo de Leds de dos veces, con un retraso de 500 ms seguido por un estado OFF
de 2 segundos
PROYECTO 3
Uso de una Variable
Ahora vamos a tratar de mostrar algunos números binarios en los LED. Se creara una variable,
para asignarle un valor y mostrarlo en los LEDS.
¿Qué pasa si queremos que todos los valores de 0 a 255 sean mostrados en LEDS, con un
retraso de 200ms intervenir? Ciertamente, no es una buena idea escribir 255 bloques de
código con cada uno con un valor diferente. Aquí el uso de variables y los bucles es muy útil.
Veamos este ejemplo:
Device=16f84a
XTAL 4
Output PORTB
Dim x As Byte
Loop:
For x=0 To 255
PORB=x
DelayMS 200
Next x
GoTo Loop
‘Declaración de la variable x como Byte
‘Se inicia un bucle controlado por la variable x
EJERCICIOS 2. Realizar los siguientes ejercicios:
1. En el bucle For …Next, haga variaciones de a 2, a través de la siguiente forma: For x=0
To 255 Step 2
2. Haga decrementos de a 1, comenzando en 255 y terminando en 0, con pasos (Step -1)
de a -1
PROYECTO 4
Utilización de un Bit por un puerto
Se han realizado una serie de ejercicios, para asignar números distintos a un puerto. Hasta
ahora se han asignado valores a la totalidad del puerto, que afectan a los 8 bits a la vez. En
nuestros proyectos del mundo real la totalidad del puerto prácticamente no se utiliza, de
hecho bits individuales de un puerto se adjuntan a los diferentes dispositivos. Por ejemplo, si
el bit 0 del PORTB está conectado a un relé de control del ventilador, y el bit 1 conectado a un
relé de control de segundo ventilador y el bit 3 adjunto al relevo del calentador. Así que nos
gustaría el control de los tres bits de forma individual. A pesar de que puede hacerse mediante
la asignación de número es mejor el control de bits individuales directamente sin afectar a
otros bits. Esto es aún más útil, cuando algunos de los bits en un puerto actúan como insumos.
Un bit individual puede ser contemplado no sólo en un puerto, sino también en los registros de
funciones especiales, e incluso variables de memoria. Esto hace la programación muy fácil y
manejable. Los bits del puerto se hacen referencia mediante la colocación de un punto
después del nombre del puerto y un número para indicar el número del bit. Por ejemplo, para
3. 3
referirse al bit 7 (bit más alto) en PORTB, usamos PORTB.7, observe que el número 7 indica el
número del bit. Al igual que en el acceso del registro de estado 0, por ejemplo, usamos
STATUS.0 similar para hacer el bit 0 de PORTB como entrada, con registro TRISB, TRISB.0 = 1.
Con el fin de establecer el bit del puerto en alto o en bajo, puede asignar un valor de 1 o 0.
También puede utilizar el comando, High y Low los cuales hacen lo mismo. Los comandos High
and Low sólo funcionan en bits del registro del puerto y no en los bits de variable general.
Device=16f84a
XTAL=4
Output PORTB.7
Loop:
High PORTB.7
DelayMS 500
Low PORTB.7
DelayMS 500
GoTo Loop
PROYECTO 5
Cambio de Operadores
Los Bits pueden ser transferidos dentro de una variable o un puerto a la izquierda o la derecha.
El Desplazamiento de los bits hacia la izquierda tiene un efecto matemático de multiplicar por
2, y el desplazamiento de los bits a la derecha se divide por defecto en 2 .El Desplazamiento a
la izquierda se indica con operador << y desplazamiento a la derecha por operador >>.
Analizar el siguiente ejemplo:
Device=16F84A
XTAL=4
Output PORTB
PORTB=0
Loop:
High PORTB.0
Dim x As Byte
For x=0 To 7
DelayMS 500
PORTB=PORTB << 1
Next x
DelayMS 500
GoTo Loop
PROYECTO 6
Proyecto con Interruptores 1
En el siguiente programa se supervisa el pin 0 del puerto A (PORTA.0) asignando a la línea un
interruptor SW1.
Cuando el interruptor está desactivado la línea lee un 1 lógico, tan pronto como se pulsa el
interruptor y sí IF es ejecutado, la línea lee 0 lógico y ejecuta las instrucciones que se adjuntan
en la estructura del IF... End IF.
4. 4
Observe el pequeño retraso de DelayMS 300, se ha hecho así, para que una vez que activado
el interruptor sea detectado, se encienda el led ubicado en PORTB.0, permaneciendo en este
estado una vez se libera el interruptor.
Device=16F84a
XTAL=4
Output PORTB
Input PORTA.0
Symbol LED = PORTB.0
Symbol SW1 = PORTA.0
Low LED
Loop:
If SW1=0 Then
DelayMS 300
High LED
End If
GoTo Loop
EJERCICIOS 3. Realizar los siguientes ejercicios:
1. Hacer un programa que encienda un LED cuando se pulsa un swiche 1 y lo apague
cuando se pulse un swiche 2.
2. Hacer un programa que al pulsar un swiche 1 se prenda un LED0 y se apague un LED1 y
si se pulsa un swiche 2 se apague un LED0 y se prenda un LED1
PROYECTO 7
Variación de velocidad de parpadeo de un LED
Este programa lee dos interruptores, SW1 y SW2 y cuando se detecta que son activados se
incrementa o disminuye el valor de una variable x por 5. A su vez la X se utiliza en la demora de
activación del LED ubicado en PORTB.0. Así, la velocidad de parpadeo del LED se puede
cambiar pulsando SW1 o SW2
Device=16F84A
XTAL=4
Output PORTB
Input PORTA.0
Input PORTA.1
Symbol LED = PORTB.0
Symbol SW1 = PORTA.0
Symbol SW2 = PORTA.1
Dim x As Byte
x=100
Low LED
Loop:
DelayMS x* 10
Toggle LED
‘Conmuta el valor del Led
If SW1=0 Then
‘Nota: el swiche normalmente estará abierto conectado a Vcc
x=x+5
DelayMS 200
EndIf
If SW2=0 Then
‘Nota: el swiche normalmente estará abierto conectado a Vcc
x=x-5
5. 5
DelayMS 200
EndIf
GoTo Loop
PROYECTO 8
Manejo del rebote de una pulsación
Cuando se pulsa un botón, los contactos hacen una conexión a corto (1 a 20 ms). El Comando
Button evita este ruido para ser interpretado como una acción más del interruptor, realizando
un retraso después de leer el estado de entrada.
En las aplicaciones del mundo real, los botones se suponen que deben realizar más que una
sola activación. El software soporta una variedad de maneras de pulsar un botón. Por ejemplo,
en el caso de la selección de un valor de entrada, cuando se pulsa el botón se supone
incrementar el número, sin embargo, si se pulsa un cierto período, comienza a comportarse
como si el botón se activara varias veces. Esto se llama repetición automática característica.
PROTON proporciona un comando llamado Button. Este comando supervisa un pin específico
de un puerto para la entrada, lee el valor como activados en bajo o alto, también acepta un
número que es el retraso de espera, después de que una repetición automática sea
establecida. La frecuencia de repetición automática también puede ser mencionada en la
declaración
El siguiente programa utiliza el comando Button para leer el estado de un botón, SW1. Si se
pulsa el botón, se alterna el LED, si se mantiene pulsado el botón, se iniciará la repetición
automática después de una pequeña demora.
EJERCICIO 4. Analizar el siguiente ejemplo, buscando la estructura del comando Button en el
“Manual del compilador del Protón” y anote el significado de la sentencia “Button” de este
programa:
Device=16f84a
XTAL=4
Output PORTB
Input PORTA.0
Input PORTA.1
Symbol LED = PORTB.0
Symbol SW1 = PORTA.0
Dim x As Byte
x=0
loop:
Button SW1, 0, 100, 250, x, 0, aa
Toggle LED
DelayMS 100
aa:
GoTo loop
PROYECTO 9
Lectura de una combinación de interruptores
A veces, en un programa es necesario leer una combinación de botones, esto se utiliza para
ampliar la gama de capacidades de entrada, así como proporcionar un mecanismo de
seguridad para funciones importantes. La combinación se puede leer en la misma línea, con el
uso del operador AND, o como IFS anidados.
6. 6
Miremos el siguiente ejemplo:
Device=16f84a
XTAL=4
Output PORTB
Input PORTA.0
Input PORTA.1
Symbol LED = PORTB.0
Symbol SW1 = PORTA.0
Symbol SW2 = PORTA.1
loop:
If SW1=0 And SW2=0 Then
Toggle LED
DelayMS 300
EndIf
GoTo loop
PROYECTO 10
Secuencia de swiches con fines de seguridad o control
En este programa se configura SW1 como interruptor principal, cuando se activa, se cambia de
estado el LED1 (PORTB.1) y espera dos segundos; esto da tiempo a la activación de SW2, al
final de 2 segundos, que se comprobará si SW2 sigue presionado, entonces, se activará el
LED0. Sea o no SW2 presionado, en lapso de 2 segundos, el LED1 se apagará, y el ciclo se
repite. Este tipo de mecanismo, asegura que una determinada secuencia de teclas presionadas
antes de una acción importante, como apagar un motor etc, sea llevada a cabo.
Device=16F84A
XTAL=4
Output PORTB
Input PORTA.0
Input PORTA.1
Symbol LED0 = PORTB.0
Symbol LED1 = PORTB.1
Symbol SW1 = PORTA.0
Symbol SW2 = PORTA.1
loop:
If SW1=0 Then
High LED1
DelayMS 2000
If SW2=0 Then
DelayMS 200
Toggle LED0
EndIf
Low LED1
EndIf
GoTo loop
EJERCICIO 5. Realizar los siguientes ejercicios:
7. 7
1. Se tienen 4 pulsadores SW0 a SW3 y una lámpara L0, se desea que al pulsar SW0 y
SW1 o SW2 y SW3 se prende L0 y en otro caso se apague.
2. Realizar ejercicio de comparación: si el valor de dos swiches en binario es mayor que
14, se encienden los leds del puerto B