Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso de Programacion de PIC en PICBasic
Curso de Programacion de PIC en PICBasic
Que tal amigos uno de los lenguajes mas facil para programar micros es el basic pro sin despreciar el C por lo que
abierto este hilo para empezar a ejecutar programas sencillos hasta llegar a los mas complejos.
miren lo facil que es prender un led con un pic 16f84A :
Cdigo:
@ device xt_osc
define osc 4
; oscilador externo XT
; especifica que se va a utilizar uno de 4 Mhz
inicio:
HIGH led
PAUSE 500
LOW led
;asigna un 1 logico
; tiempo de espera de 500mls
; apaga led
este es un ejemplo sencillo ire anexando el codigo fuente y su respectiva simulacion en proteus de todos los
realizados en este hilo.
Cdigo:
; encender un led conectado al pin 37 (RB4) del pic 16F877A durante 2.5 seg y
;luego apagarlo 0.5 seg el proceso debe repetirse 4 veces luego el led debe
;permanecer apagado.
@ device xt_osc
define osc 4
x var byte
LED var portb.4
programa:
for x=0 to 3
high led
pause 2500
low led
pause 500
next
end
;
;
;
;
oscilador externo XT
especifica que se va a utilizar uno de 4 Mhz
crea la variable x y asigna un espacio de memoria
de o a 255
; asigna el nombre de led a RB4 del pic 16f877A
@ device xt_osc
define osc 4
x var byte
;
;
;
;
oscilador externo XT
especifica que se va a utilizar uno de 4 Mhz
crea la variable x y asigna un espacio de memoria
de o a 255
; asigna el nombre de led1 a RB0 del pic 16f877A
; asigna el nombre de led2 a RB1
programa:
;LUEGO DE LAS LUCES DE DISCOTECA ENCIENDA LOS LEDS DEL MEDIO HACIA LOS EXTREMOS
;CON UN TIEMPO DE 200mseg
Cdigo:
leds=leds<<1
leds=leds<<2
leds=leds>>1
EQUIVALE A DIVIDIR
DERECHA.
@ device xt_osc
; oscilador externo XT
define osc 4
x var byte
leds=1
programa:
for x=0 to 6
LEDS=LEDS<<1
GOSUB TIEMPO
next
for x=0 to 6
LEDS=LEDS>>1
pause 200
next
GOTO PROGRAMA
TIEMPO:
PAUSE 200
RETURN
end
for x=0 to 1
high led2
gosub tiempo1
low led2
gosub tiempo1
next
for x=0 to 2
; repetir 3 veces
high led1:high led2 ;enciende leds
gosub tiempo
; ir a rutina tiempo
low led1: low led2
;apaga leds
gosub tiempo
; ir a rutina tiempo
next
; siguiente repeticion hasta que sea x=3
goto programa
tiempo:
pause 300
return
tiempo1:
pause 1000
return
end
que tal este tipo de programa denominado microcodestudio da lo opcion de desarrollar varias formar un
programa a continuacion te muestro las varias formar de escribir un programa y realizar el mismo trabajo final.
el ejercicio consiste en hacer parpadear un led con intervalos de dos segundos por el RB0 del pic 16f877a:
Cdigo:
inicio:
trisb=0
inicio:
aqui hay otra forma se manejan solo un pin a la vez del puerto y no todos a la vez como en el
ejemplo anterior
trisb=0
inicio:
todo ello gracia a que este compilador reconoce basees numerales en deciamal, binario y exagesima:
@ device xt_osc
define osc 4
x var byte
;
;
;
;
oscilador externo XT
especifica que se va a utilizar uno de 4 Mhz
crea la variable x y asigna un espacio de memoria
de o a 255
; asigna el nombre de led a RB4 del pic 16f877A
programa:
for x=0 to 3
high led
pause 2500
low led
pause 500
next
end
@ device xt_osc
define osc 4
x var byte
LED1 var portb.0
;
;
;
;
oscilador externo XT
especifica que se va a utilizar uno de 4 Mhz
crea la variable x y asigna un espacio de memoria
de o a 255
; asigna el nombre de led1 a RB0 del pic 16f877A
programa:
Cdigo:
;
;
;
;
leds=leds<<1
leds=leds<<2
leds=leds>>1
@ device xt_osc
define osc 4
x var byte
LEDS var
LED0 var
LED1 VAR
LED2 VAR
LED3 VAR
LED4 VAR
LED5 VAR
LED6 VAR
LED7 VAR
TRISB=0
leds=1
PORTB
portb.0
portb.1
portb.2
portb.3
portb.4
portb.5
portb.6
portb.7
programa:
for x=0 to 6
LEDS=LEDS<<1
GOSUB TIEMPO
oscilador externo XT
especifica que se va a utilizar uno de 4 Mhz
crea la variable x y asigna un espacio de memoria
de o a 255
; asigna el nombre de leds a todo el puerto B del pic 16f877A
; asigna el nombre de led1 a RB0 del pic 16f877A
; asigna el nombre de led2 a RB1
next
for x=0 to 6
vamos con mas
proyecto con pulsadores
proyecto1:
Cdigo:
; leer el estado de un pulsador ubicado el RB0 del pic 16f877A en donde una vez
;accionado se enciende un led ubicado en RB1 del mismo pic
@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
inicio
if portb.0=0 then encender
goto inicio
encender:
high portb.1
pause 500
toggle portb.1
pause 500
goto inicio
end
Archivos Adjuntos
Proyecto2 pulsadores
Cdigo:
; lectura de pulsadores
inicio
if p1=0 then encender
; pregunta si se acciono el pulsador 1 ir a encender
PAUSE 200
if p2=0 then encender1 ; """ pulsadodor2 ir a encender 1
PAUSE 200
if (p1=0) AND (p2=0) then encender2 ; """"pulsador1 y pulsador2 ir a encender2
PAUSE 200
goto inicio
; crea un bucle cerrado
TRISB = 0
;PORTB ES SALIDA
LOOP:
; INICIO DEL PROGRAMA
Cnt = 0
; carga Cnt con cero
NXT:GOSUB CONVERT
; ir a conversion
PORTB = Pattern
; envia al puerto B lo que esta en la variable pattern
Cnt = Cnt + 1
; Increment count
PAUSE 1000
;espera 1 segundo
IF CNT = 10 THEN LOOP ;prefunta si ha llegado a diez ir a inicio de programa
GOTO NXT
;ir a NXT
CONVERT:
; rutina de conversion
LOOKUP Cnt, [$3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], Pattern ; inicia
;conversion y lo guarda en pattern
Pattern = Pattern ^ $FF ;invierte los bit de la variable pattern
RETURN
; retorna el gosub que lo llamo
END
;fin del programa
Archivos Adjuntos
bueno ahora vamos con un proyecto interesante un contador de un solo dito pero con CI7447 y un pulsador
integrado que a trves de este realizamos el conteo
Cdigo:
aumentar:
if pulsador=0 then aumentar
pause 300
if numero=9 then inicio
numero =numero+1
goto display
end
Archivos Adjuntos
proyecto 3
Cdigo:
;proyecto display
;programa que presenta la palabra HOLA en 4 displays PIC16f84A con
;desplazamiento de derecha a izquierda.
@ device xt_osc
define osc 4
; oscilador externo XT
; especifica que se va a utilizar uno de 4 Mhz
trisb=0
trisa=0
x var byte
texto:
for x=1 to 20
porta=14:portb=8
GOSUB TIEMPO
porta=13:portb=71
gosub tiempo
porta=11:portb=64
gosub tiempo
porta=7:portb=9
gosub tiempo
next
for x=1 to 20
porta=14:portb=127
GOSUB TIEMPO
porta=13:portb=8
gosub tiempo
porta=11:portb=71
gosub tiempo
porta=7:portb=64
gosub tiempo
next
;apaga el display
; ir a rutina tiempo
;forma la letra A
; ir a rutina tiempo
;forma la letra L
; ir a rutina tiempo
;forma la letra O
; ir a rutina tiempo
for x=1 to 20
porta=14:portb=9
GOSUB TIEMPO
porta=13:portb=127
gosub tiempo
;forma la letra H
; ir a rutina tiempo
;apaga el display
porta=11:portb=8
gosub tiempo
porta=7:portb=71
gosub tiempo
next
for x=1 to 20
porta=14:portb=64
GOSUB TIEMPO
porta=13:portb=9
gosub tiempo
porta=11:portb=127
gosub tiempo
porta=7:portb=8
gosub tiempo
next
for x=1 to 20
porta=14:portb=71
GOSUB TIEMPO
porta=13:portb=64
gosub tiempo
porta=11:portb=9
gosub tiempo
porta=7:portb=127
gosub tiempo
next
goto texto
TIEMPO:
PAUSE 5
RETURN
end
;forma la letra A
;forma la letra L
;forma la letra O
;forma la letra H
;apaga el display
;forma la letra A
;forma la letra L
;forma la letra O
;forma la letra H
;apaga el display
;IR A TEXTO
;espera5mls
;retorna al gosub que la llamo
;fin del programa
con este programa se aprende a utilizar el multiplexado para manejar varios displays
Archivos Adjuntos
proyectos lcd:
los LCD son utilizados para mostrar mensajes que indican la consecusion de un proceso en forma visual ,
instrucciones de manejo , mostrar valores , en si permiten la comunicacion entre maquinas y humanos pudiendo
mostrar cualquier caracter ASCII.
El LCD mas conicido es el de 2x16, dos lineas y 16 caracteres cada una que son los que vemos porque en realidad
son 40 caracteres cuestion que comprobaremos mas adelente.
Descripcin de pines:
PIN N SIMBOLO DESCRIPCION
1 Vss Tierra de alimentacin GND
2 Vdd Alimentacin de +5V CC
3 Vo Contraste del cristal liquido. ( 0 a +5V )
4 RS Seleccin del registro de control/registro de datos:
RS=0 Seleccin registro de control
RS=1 Seleccin registro de datos
la declaracio LCDOUT en el compilador PBP sirve para mostrar items en el LCD seguidos de algunos de los siguientes
comandos:
LCD commands
Command Operation
$FE, 1 Clear display
$FE, 2 Home cursor
$FE, $0C Cursor off
$FE, $0E Underline cursor on
$FE, $0F Blinking cursor on
$FE, $10 Move cursor left by one position
$FE, $14 Move cursor right by one position
$FE, $80 Move cursor to the beginning of first row
$FE, $C0 Move cursor to the beginning of second row
$FE, $94 Move cursor to the beginning of third row
$FE, $D4 Move cursor to the beginning of fourth row
estamos listos para nuestros primeros pasos con manejo de LDC
'
' inicio del programa
'
TRISB = 0
PAUSE 500
Cnt = 0
LCDOUT $FE,1
'
'
'
'
PORTB es salida
retardo para inicializar el LCD
limpia contador y lo coloca a cero
limpia LCD
RPT:
; rutina de conteo
LCDOUT $FE,2
' inicio del cursor LCD
LCDOUT "CNT = ", DEC Cnt ' muestra en el display cnt y su conteo en decimal
PAUSE 1000
' espera un segundo
Cnt = Cnt +1
' Incrementa contador en uno y guarda el resultado en CNT
GOTO RPT
' crea un bucle cerrado
END
' fin del programa
luego anexo simulacin
Que tal vamos con el segundo proyecto con LCD propuesto por nuestro amigo mot1258 en este proyecto anexo la
simulacion del primero de lCD ya que utilice los mismos pines para el manejo del LDC por el puerto b anexandole
entradas como se comenta en el programa:
Cdigo:
LCD_DREG
LCD_DBIT
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
PORTB
0
PORTB
4
PORTB
5
Cabe anotar que utilizamos algunas de los rutinas de nuestro proyecto anterior aplicando el esquematico y la
configuracion de pines para enviar los datos del pic al LCD la comunicacion en estos proyectos se ha realizado a 4
bits; como en todos los realizados anexo simualcion en proteus, codigo fuente en basic pro y .hex
Cdigo:
LCD_DREG
LCD_DBIT
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
PORTB
0
PORTB
4
PORTB
5
;CREACION DE VARIABLES
Ticks VAR byte ;
el proyecto que sigue a continuacion es que por medio del LDC de muestren carateres en esta ocacion un mensaje
utilizando las dos lineas del mismo.
por ultimo sirve como guia de simulacion el esquematico con el que se ha venido trabajando los proyectos de LCD
anteriores.
Cdigo:
; proyecto 4
; visualizacion de caracteres en el LDC mensaje CON PIC 16F84a
PORTB
0
PORTB
Define LCD_RSBIT
Define LCD_EREG
Define LCD_EBIT
4
PORTB
5
PAUSE 200
; RETARDO PARA QUE INICIALIZE EL LCD
LCDOUT $FE, 1 ;LIMPIA LCD
LCDOUT $FE,$86, "CURSO" ;muestra mensaje en la primera linea,septima casilla
LCDOUT $FE,$c2, "PIC BASIC PRO" ;mensaje en la segunda linea,tercera casilla
Vamos con la comprobacion de las 40 lineas de memoria que tiene nuestro lcd 2x16 de las cuales vemos 16 , en este
proyecto escribiremos un mensaje desde la casilla 18 de la primera linea el cual no es visible una vez recorridas las
17 posiciones se mostrara el mensaje que sera desplazado hacia la izquierda como resultado tendremos un texrto
que permanece un movimiento.
Cdigo:
; proyecto 5
; visualizacion de un texto con desplazamiento en el LDC CON PIC 16F84a
LCD_DREG
LCD_DBIT
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
PAUSE 200
PORTB
0
PORTB
4
PORTB
5
; RETARDO PARA QUE INICIALIZE EL LCD
;creacion de variables
A var byte
B var byte
; configuracion del LCD
LCDOUT $FE,$7
; desplazamiento izquierdo
que tal vamos con el primer proyecto de manejo de teclado matrixal utilizando operandos matematico de pic basic
pro:
Cdigo:
DETERMINACION DE VARIABLES
hola amigo mecatrodatos muy bueno tus aportes, tengo una duda sobre como grabar el contenido de 6 variables en
una memo via I2C esas variables contienen un valor de 4 digitos, cada una, ejemplo
var1 = 1234
var2 = 21
var3 = 2222
var4 = 754
var5 = 1221
var6 = 231
cuando desconecto la corriente y vuelvo a prender necesito que estas variables se mantengan...
conozco la forma de grabar y leer en eso no tengo problema, mi problema es que no entiendo como hago para que
me almacene las cifras enteras, ya que solo me guarda un numero por direccion de memoria, ejemplo grabo esto
I2cwrite portc.7,portc.6,%10100000,0,[1234]
cuando la leo solo me aparece el primer numero, necesito saber como guardo toda la cifra, muchas gracias, espero
puedan ayudarme....
javi
Hola amigo mecatrodatos esperemos te encuentre bien, sorry pero seguimos con nuestras dudas: en el ejemplo
del lcd no se en que orden van sus conexiones conectadas al pic 16f84a y no se con que programa puedo abrir
el archivo que nos pones para la simulacion ya que yo tengo proteus 6 pero no lo abre a menos que necesite
una version mas reciente, saludos .
PD. tengo algunas dudas con pickit2 clon pero no te preocupes para eso molesto al amigo moyano
Que tal amigo mot1258 te pido disculpas por no responderte estaba atariado en el trabajo y el estudio pero
llegamos en forma te anexo el plano de los ejercicios de LCD en formato de imagen todos funcionan de
acuerdo a este plano solamente realizalo y das click derecho en el micro antes de iniciar la simulacion y
cargas el .hex que te facilita el compilador de pic basic pro.
saludos y espero te sirva cualquier duda estare en contacto.
javoni que tipo de memoria utilizas, mira este ejemplo :lee y escribe en la memoria (24lc04b) utilizando un
pic 16f877A y una pantalla lcd de 2x16 mas de dos carasteres alamacenados en las varibles b1 y b2.
Cdigo:
Define LOADER_USED
2x16
DEFINE
LCD_DREG
PORTD
DEFINE
LCD_DBIT
DEFINE
LCD_RSREG
PORTE
DEFINE
LCD_RSBIT
DEFINE
LCD_EREG
PORTE
DEFINE
LCD_EBIT
SCL
VAR
PORTC.3
SDA
VAR
PORTC.4
address VAR
WORD
' Address
B1
VAR
BYTE
' Data 1
B2
VAR
BYTE
' Data 2
ADCON1 = 7
Low PORTE.2
Pause 100
For address = 0 TO 15
B1 = address + 100
'REPITE 16 VECES
' SUMA 100 A ADDRESS Y VALOR LO GUARDA EN B1
I2CWrite SDA,SCL,$A0,address,[B1]
Pause 10
Next address
loop:
For address = 0 TO 15 STEP 2
I2CRead SDA,SCL,$A0,address,[B1,B2]
Pause 1000
Next address
GoTo loop
End
Espero te sirva y al igual que nuestro amigo mot1258 disculpas por no responder a tu inquietud de la forma
mas rapida , si lograste hallar otra forma de leer y almacenar mas de una variable en una memoria y
visualizar el resultado en una LCD posteala.
Por otro lado seguire posteando proyectos utilies que les parece mostrar caracteres personalizados en Lcd
con pic basic pro en eso estaba en el tiempo en que estuve perdido como lectura y visualizacion de
sensores de temperatura anologos y digitales, ldr, potencimetro entre otros me parece que nos
dedicaremos mas a sacarle el jugo a las pantallas de cristal liquido, cualquier colaboracion , critica o
comentario sera recibida.
Aqui esta el diagrama de los proyectos que manejaremos con lcd es el mismo de los anteriores ( mensaje y
desplazamiento) en formato dibujo , archivo comprimido si por el caso cambiaremos al pic 16f877A perola
configuracion segura siendo la misma
pines pic pines LCD 2x16
RB0 D4
RB1 D5
RB2 D6
RB3 D7
RB4 RS
RB5 E
RW a tierra
estoy son los pines que aparecen en proteus al seleccionar el pic y el LCD 2x16 se tiene que realizar la conexion
antes descrita.
Archivos Adjuntos
perdonaran la ortografia pero vamos con un proyecto interesante visualizacion de caracteres especiales en LCD
2X16,para ello aclaremos lo siguiente:
Un dispositivo LCD dispone de dos tipos de memorias ambas independientes. Estas memorias se denominan DD RAM
y CG RAM.
-DD RAM (Display Data Ram)
Es la memoria encargada de almacenar los caracteres de la pantalla que se esten visualizando en ese momento, o
bien, que esten en una posicin no visible. El display tiene una capacidad de 2 lineas horizontales por 40 caracteres
cada una, de los cuales solo seran visibles 2 lineas de 16 caracteres cada una. La DDRAM tiene un tamao de
2x40=80 bytes.
Programa generacion de caracteres pic basic pro utilizando un pic 16f877A un LCD 2x16 con comunicacion a 4 bits:
Cdigo:
;creacion de variable
LCDOUT M
PAUSE 300
NEXT M
PAUSE 1500
LCDOut $FE, 1 ' LIMPIA EL DISPLAY
LCDOUT $FE,$81,"PERSONALIZADOS"
;mensaje
LCDOUT
LCDOUT
LCDOUT
LCDOUT
LCDOUT
; las siguientes lineas del programa sirven para visualizar en la segunda linea del LCD 2X 16
los caracteres especiales
LCDOUT $FE,$C0
FOR M = 0 TO 4
LCDOUT M
PAUSE 300
NEXT M
PAUSE 1500
LCDOUT $FE, 1 ' LIMPIA EL DISPLAY
GOTO RUTINA
Por ultimo anexo simulacion en proteus 7.4 , codigo fuente, .hex .la carpeta esta en formato comprimido
Archivos Adjuntos
Hola: mil gracias amigo mecatrodatos por el tiempo para contestarnos yo tambien he andado atareado con la
escuela y el trabajo y gracias, mas claro no se puede la explicacion de la conexion de la LCD y me han servido
mucho los ejemplos para la escuela que nos posteaste y por s a alguien del foro le quedan duda sobre la
conexion o direccionamiento de la LCD,
saludos.
http://www.matpic.com/MICROCHIP/MICROCHIP_LCD.html
Que bien buen aporte mot1258 , si puedes sube proyectos
Ok gracias, buscar algno que tenga por ahi pero mas que proyectos, surgen mas dudas y creo que eso es bueno
porque es seal de que poco a poco vamos aprendiendo a prueba y error, estoy destrozando el ejemplo que pusiste
del conteo de los 5 minutos pero sin ocupar el tmr0 y hacerlo con un contador por si hubiera el caso que quisieras
mas salidas que lleven el conteo de la misma forma pero independiente ya que el 16f84 solo tiene un tmr y el 16f877
sino me equivoco solo trae 3 y si yo quiero por ejemplo 5, ya no me alcanzarian, bueno sigo peleandome con eso y
en la semana posteo el poco avance que lleve, si alguien tiene algun aporte, es bienvenido. saludos
http://www.melabs.com/resources/samples.htm
http://www.todopic.com.ar/pbp_sp.html#count
Que tal siguiendo con los proyectos de lcd un frecuenciometro con el pic 16f84A , ldc 2x16 y un generador de seales
cuadradas ubicado por el puertoA2, en donde se capta los pulsos y se visualizan el LCD; con alarmas de activacion
condicionales ubicadas en el puert A 0,1 respectivamente, sin mas el codigo fuente:
Cdigo:
loop:
count porta.2,1000,pulsos
; CONTAR LOS PULSOS POR EL PUERTO A2
lcdout $fe,1
;LIMPIA lcd
lcdout $fe,$82,"fecuencia:"
; ENVIAR MENSAJE AL LCD