Está en la página 1de 21

Curso de programacin de PIC en PICBasic Pro

Curso de programacin de PIC en PICBasic Pro

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

led var portb.0

; asignamos led a puerto RB0

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.

aqui va un codigo sencillo todo comentado:

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

; inicio de la linea de programa


; repetir 4 veces
;enciende led
; esperar 2.5 seg
;apaga led
; espera 0.5 seg
; siguiente repeticion hasta que sea x=3
; fin del programa

;proyecto con leds 1


Cdigo:

; encender 2 leds conectados a (RB0-RB1) del pic 16F877A alternadamente , es


;decir un led esta encendido mientras el otro esta apagado y viceversa los
;tiempos de transicion son de 700mls entre encendido y apagado el proceso
;debe continuar indefinidamentedurante.

@ device xt_osc
define osc 4
x var byte

;
;
;
;

LED1 var portb.0


LED2 VAR portb.1

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:

; inicio de la linea de programa

high led1:low led2


;enciende led1 y apaga led 2
pause 700
; esperar 0.7 seg
low led1:high led2 ;apaga led1 y enciende led2
pause 700
; espera 0.7 seg
goto programa
; ir a programa
end
; fin del programa

;LUEGO DE LAS LUCES DE DISCOTECA ENCIENDA LOS LEDS DEL MEDIO HACIA LOS EXTREMOS
;CON UN TIEMPO DE 200mseg
Cdigo:

leds=leds<<1

EQUIVALE A MULTIPLICAR POR DOS Y DESPLAZARSE UNO A UNO

leds=leds<<2

EQUIVALE A MULTIPLICAR POR CUATRO Y DESPLAZARSE DE DOS EN DOS

leds=leds>>1

EQUIVALE A DIVIDIR

POR DOS Y DESPLAZARSE UNO A UNO HACIA LA

DERECHA.

@ device xt_osc

; oscilador externo XT

define osc 4

; especifica que se va a utilizar uno de 4 Mhz

x var byte

; crea la variable x y asigna un espacio de memoria


; de o a 255

LEDS var PORTB

; asigna el nombre de leds a todo el puerto B del pic 16f877A

LED0 var portb.0

; asigna el nombre de led1 a RB0 del pic 16f877A

LED1 VAR portb.1

; asigna el nombre de led2 a RB1

LED2 VAR portb.2


LED3 VAR portb.3
LED4 VAR portb.4
LED5 VAR portb.5
LED6 VAR portb.6
LED7 VAR portb.7
TRISB=0

; hacemos salidas a todo el puerto b

leds=1

; cargamos el puerto b con 1 (%00000001)

programa:
for x=0 to 6
LEDS=LEDS<<1
GOSUB TIEMPO

next
for x=0 to 6

; inicio de la linea de programa


; repetir 7 veces
;desplaza uno a uno a la left
; esperar 0.2 seg

; siguiente repeticion hasta que sea x=6


; repetir 7 veces

LEDS=LEDS>>1

; desplaza uno a uno a la right

pause 200

; esperar 0.2 seg

next

high led3:HIGH LED4:LOW LED0:LOW LED7


GOSUB TIEMPO
LOW LED3:LOW LED4:HIGH LED2:HIGH LED5
GOSUB TIEMPO
LOW LED2:LOW LED5:HIGH LED1:HIGH LED6
GOSUB TIEMPO
LOW LED1:LOW LED6:HIGH LED0:HIGH LED7
GOSUB TIEMPO

GOTO PROGRAMA

TIEMPO:
PAUSE 200
RETURN

end

; fin del programa

;Generar 6 parpadeos de un led con intervalos de 300mls, luego dos parpadeos de


;un segundo con otro led, despues los dos leds parpadean tres veces, el proceso
;se repite indefinidamente
Cdigo:
define OSC 4
;especifica al PBP que se va ha utilizar
;un cristal de 4 Mhz.
@ device XT_OSC
;oscilador externo para programacion.
x var byte
; crea la variable x y asigna un espacio de memoria
; de o a 255
led1 var portb.0
led2 var portb.1
programa:
for x=0 to 5
high led1
gosub tiempo
low led1
gosub tiempo
next

;etiqueta asignada al pin 2 del pic 16f877A


;etiqueta asignada al pin 3 del pic 16f877A
; inicio de la linea de programa

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

; fin del programa

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:

led var portb.0 ; asignamos led a puerto RB0

inicio:

HIGH led ;asigna un 1 logico


PAUSE 2000 ; tiempo de espera de 2s
LOW led ; apaga led

puedes aqui utilizar el comandoTOGGLE que es invertir la seleccion del

comando anterior a PAUSE


PAUSE 2000 ; tiempo de espera de 2s
GOTO inicio ; crea un bucle cerrado
En el siguiente caso manegaremos todo el puerto B del pic 16f877a como salidas pero solo utililizaremos RB0,
es importante incluir al principio del programa o programs a realizar siempre los siguientes comandos para la
posterior programacion del pic :
@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
una vez realizado esto dedemos incluir trisb=0 o trisb=%0 ya que sin esto no funcionan los manejos de los
puertos se debe entender que portb=%00000010 encender unicamente el el puerto RB1

para una mejor explicacion:


portb= % 1 0 0 1 1 0 1 0
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
esto indica encender del puerto b (7,4,3,1) para todos los demas permanecer en cero logico es decir apagados ,
este es muy util en caso de encender un grupo de leds.
listo vamos con el programa
Cdigo:

@ device xt_osc ; oscilador externo XT


define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

trisb=0

;puerto b como salidas

inicio:

Portb=%00000001 ;controla todo el puerto pero solo enciende RBO


PAUSE 2000 ; tiempo de espera de 2s
Portb=%0000000 ;apaga todos los pines del puerto B
PAUSE 2000 ; tiempo de espera de 2s
GOTO inicio ; crea un bucle cerrado

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

@ device xt_osc ; oscilador externo XT


define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

trisb=0

;puerto b como salidas

inicio:

Portb.0=1 ; enciende RBO


PAUSE 2000 ; tiempo de espera de 2s
Portb.0=0 ;apaga RB0
PAUSE 2000 ; tiempo de espera de 2s
GOTO inicio ; crea un bucle cerrado

todo ello gracia a que este compilador reconoce basees numerales en deciamal, binario y exagesima:

10 es igual a %1010 (binario) $A exagesimal


siempre debe se debe utilizar los prefijos % para escribir un numeo en biario y $ para exagecimal ya que sin
ello el PBP o compilador no lo reconoce .
Espero te halla servido mi explicacion si deeas puedes modificar el programa de manejo de puertoB y encender
cualquier tipo de pines de este ubicando leds a sus salidas.

bien empezaremos con proyectos con leds:


Cdigo:

;proyecto con leds 1


; 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

;
;
;
;

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

LED var portb.4

programa:
for x=0 to 3
high led
pause 2500
low led
pause 500
next
end

; inicio de la linea de programa


; repetir 4 veces
;enciende led
; esperar 2.5 seg
;apaga led
; espera 0.5 seg
; siguiente repeticion hasta que sea x=3
; fin del programa

;proyecto con leds 2


Cdigo:

; encender 2 leds conectados a (RB0-RB1) del pic 16F877A alternadamente , es


;decir un led esta encendido mientras el otro esta apagado y viceversa los
;tiempos de transicion son de 700mls entre encendido y apagado el proceso
;debe continuar indefinidamentedurante.

@ 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

LED2 VAR portb.1

; asigna el nombre de led2 a RB1

programa:

; inicio de la linea de programa

high led1:low led2


;enciende led1 y apaga led 2
pause 700
; esperar 0.7 seg
low led1:high led2 ;apaga led1 y enciende led2
pause 700
; espera 0.7 seg
goto programa
; ir a programa
end
; fin del programa
Archivos Adjuntos
;proyecto 3
;con este proyecto se pretende faimilarizarse mas con el manejo de los puertos, esta vez vamos a utilizar las 8
salidas del puesro b del pic 16f877A, se trata de una secuencia de luces que deben encenderse de izquierda a
derechauna tras otra con imtervalos de tiempo de 200mls, luegos se encenderan las luces del medio hacia los
extremos con intervalos de 200mseg

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

EQUIVALE A MULTIPLICAR POR DOS Y DESPLAZARSE UNO A UNO


EQUIVALE A MULTIPLICAR POR CUATRO Y DESPLAZARSE DE DOS EN DOS
EQUIVALE A DIVIDIR POR DOS Y DESPLAZARSE UNO A UNO HACIA LA
DERECHA.
;
;
;
;

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

; hacemos salidas a todo el puerto b


; cargamos el puerto b con 1 (%00000001)
; inicio de la linea de programa
; repetir 7 veces
;desplaza uno a uno a la left
; esperar 0.2 seg

next
for x=0 to 6
vamos con mas
proyecto con pulsadores
proyecto1:

; siguiente repeticion hasta que sea x=6


; repetir 7 veces

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

; pregunta si se acciono el pulsador ir a encender


; crea un bucle cerrado
;rutina encender
; enciende led ubicado en este pin
;espera 500mls
; apaga led
;ir a inicio
;fin del programa

Archivos Adjuntos
Proyecto2 pulsadores

Cdigo:

;Proyecto con 2 pulsadores y 3 leds ; cuando es accionado P1(primer pulsador) se


;enciende un led ubicado en RB2 durante un segundo,lo mismo pasa si se acciona
;P2 con otro led ubicado en RB3 , pero si son accionados al mismo tiempo un
;tercer led (RB4)parpadeara 5 veces duante 300mls se uitliza pic 16F877A.
@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
;configuracion de pines
led1 var portb.2
led2 var portb.3
led3 var portb.4
p1 var portb.0
p2 var portb.1
x var byte

;ubicacion del primer LED en RB2 del pic 16F877A


;""""
RB3
;""""""""""""""""""""
RB4
;"""""""del primer pulsador RB0 """"""""""""
;"""""""segundo pulsador
RB1
;variable x con capacidad de 255

; 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

vamos con proyectos con display


proyecto 1 displays
Cdigo:

; proyecto con display


;contador de 0 a 9 con pic 16f877A y dispaly de anodo comun se utiliza puertoB
;para mostrar el conteo

@ device xt_osc ; oscilador externo XT


define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
Cnt VAR Byte
; variable de conteo
Pattern VAR Byte ; variablle de alamcanamiento

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:

;contador decimal de un digito con pic 16f877A ,c.i 7447 y pulsador

@ device xt_osc ; oscilador externo XT


define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
TRISB=%11110000
NUMERO VAR BYTE
PULSADOR VAR PORTB.4
INICIO:
numero=0
display:
portb=numero
if pulsador=0 then aumentar
goto display

;hace salidas los bit de menos valor del puertoB

; carga la variable numero con cero

;muestra en portb el contenido de numero


; preunta si el pulsador a sido activado

aumentar:
if pulsador=0 then aumentar
pause 300
if numero=9 then inicio
numero =numero+1
goto display

;rutina para estabilizar tecla


; pregunta si ha llegado a nueve
; suma uno a la variable numero y guarda el
;resultado en al misam variable

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

;puerto b como salidas


;puerto a como salidas
;variable con capacidad de 255

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

; repeticiones de este segmento


;formacin de la letra A en el display
; ir a rutina tiempo
;forma la letra L
; ir a rutina tiempo
;forma la letra O
; ir a rutina tiempo
;forma la letra H
; ir a rutina tiempo
; siguiente repeticin

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

5 R/W Seal de lectura/escritura:


R/W=0 Escritura (Write)
R/W=1 Lectura (Read)
6 E Habilitacin del modulo:
E=0 Mdulo desconectado
E=1 Mdulo conectado
7-14 D0-D7 Bus de datos bidireccional.

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

bueno vamos con el primer proyecto de ldc un contador:


Cdigo:

; proyecto con LCD y pic 16f84A en donde se muestra la consecucion de un conteo


; de 0 a la variable cont con capacidad de 65535
@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
' Define registros y bits del LCD
Define LCD_DREG
PORTB
Define LCD_DBIT
0
Define LCD_RSREG
PORTB
Define LCD_RSBIT
4
Define LCD_EREG
PORTB
Define LCD_EBIT
5
'
' DEFINIciones
'
Cnt VAR Word ' variables cont con capacitas de 8 bytescapacidad de
;almacenamiento de 65535

'
' 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:

;PROYECTO 2 CON LCD


;EL PRESENTE PROYECTO TIENE COMO FUNCION LA UTILIZACION DE LAS INTERRUPCIONES
;DEL PIC16F84A PARA REALIZACION DE UN CRONOMETRO CALIBRADO A 5 MINUTOS EN DONDE
;POR MEDIO DEL BOTON START SE INICIA EL CONTEO Y ACTIVA UNA SEAL A UNO LOGICO
;DURANTE EL TIEMPO DE ACTIVACION O DE CONTEO , PERO SI ES INTERRUMPIDA LA SEAL
;POR EL BOTON DE STOP SE DETENIENE EL CONTEO Y SE PONE LA SALIDA A CERO LOGICO
;PODEMOS REINICIAR EL SISTEMA CON EL BOTON CLEAR PARA VOLVER A EMPEZAR
;DESDE 00:00 EL CONTEO HASTA LOS 5 MINUTOS , UNA VEZ CULMINADO EL TIEMPO DE
;ACTIVACION TOTAL SE PULSA STOP Y POSTERIORMENTE START PARA VOVER A REALIZAR
;EL CONTEO.
; CONFIGURACION PARA LA PROGRAMACION DEL PIC
@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
' Define registros y bits del LCD
Define
Define
Define
Define
Define
Define

LCD_DREG
LCD_DBIT
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

PORTB
0
PORTB
4
PORTB
5

;variables de pines conctados al pic 16f84A


Symbol START_button = PORTA.0
Como vamos espero que bien en esta oportunidad como comente al inicio del curso proyectos sencillos hasta llegar a
proyectos complejos por lo tanto nuestro tercer proyecto de ldc les traigo un reloj digital:

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:

; PROYECTO 3 CON LCD


; EL SIGUIENTE PROYECTO ES UN RELOJ DIGITAL CON PIC 16F84A, LDC Y BOTONES PARA
; AJUSTE DE HORAS Y MINUTOS
; CONFIGURACION PARA LA PROGRAMACION DEL PIC
@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
' Define registros y bits del LCD
Define
Define
Define
Define
Define
Define

LCD_DREG
LCD_DBIT
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT

PORTB
0
PORTB
4
PORTB
5

;CONFIGURACION DE ENTRADAS AL PIC 146F84a

Symbol Hrs_button = PORTA.0


Symbol Mins_button = PORTA.1

; BOTON DE AJUSTE PARA HORA


; BOTO0N DE AJUSTE PARA MINUTOS

;CREACION DE VARIABLES
Ticks VAR byte ;

(61 ticks = 1 sec)

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

; CONFIGURACION PARA LA PROGRAMACION DEL PIC


@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
' Define registros y bits del LCD
Define LCD_DREG
Define LCD_DBIT
Define LCD_RSREG

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

; CONFIGURACION PARA LA PROGRAMACION DEL PIC


@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
' Define registros y bits del LCD
Define
Define
Define
Define
Define
Define

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:

; lectura de un teclado de 16 posiciones

con pic 16f84A

; CONFIGURACION PARA LA PROGRAMACION DEL PIC


@ device xt_osc ; oscilador externo XT
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
;

DETERMINACION DE VARIABLES

fila VAR BYTE


columna VAR BYTE
tecla VAR BYTE
TRISA=0
LOOP1:
PORTB=0
TRISB=%11110000
IF ((PORTB>>4)!=%1111) THEN LOOP1
LOOP2:
FOR FILA=0 TO 3
PORTB=0
TRISB=(DCD FILA)^%11111111
COLUMNA=PORTB>>4
IF COLUMNA!=%1111 then numtecla
NEXT FILA
GOTO LOOP2
NUMTECLA:
Lectura y escritura con 24c02

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:

@ device xt_osc ; oscilador externo XT


define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

define I2C_SCLOUT 1 ;PARA QUE NO SE NECESITE RESISTENCIA EN SCL

Define LOADER_USED

' configuracion del lcd

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

' Clock pin

SDA

VAR

PORTC.4

' Data pin

address VAR

WORD

' Address

B1

VAR

BYTE

' Data 1

B2

VAR

BYTE

' Data 2

ADCON1 = 7

' PORTa Y PORTE COMO DIGITALES

Low PORTE.2

' LCD R/W line low (W)

Pause 100

'RETADO PARA INICIALIZAR LE lcd

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

' ESPERA 10MS

' GUARDA EL RESULTA DE B1 EN EN ADDRESS

Next address

;ESPERA A QUE SE REALICE LA REPETICION

loop:
For address = 0 TO 15 STEP 2

' Loop 8 times

I2CRead SDA,SCL,$A0,address,[B1,B2]

'LEE LAS DOS VARIABLES

LCDOut $fe,1,#address,": ",#B1," ",#B2," "

'VISUALIZA EN EL DISPLAY VALOR DEC

Pause 1000
Next address

GoTo loop

; CREA UN BUCLE CERRADO

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.

CG RAM (carcter generator RAM)


La CG RAM contiene los caracteres que pueden ser definidos por el usuario, es decir que pueden ser personalizados.
Est formada por 64 posiciones, con direcciones $00-$3F. Cada posicin es de 5 bits.
La memoria esta dividida en 8 bloques que corresponden a los posibles caracteres creados por el usuario que van del
0 al 7.
Cada carcter esta constituido por una matriz de 5 columnas por 8 filas. De este modo un 1 indica un punto de la
matriz encendido, y un 0 apagado.

Programa generacion de caracteres pic basic pro utilizando un pic 16f877A un LCD 2x16 con comunicacion a 4 bits:
Cdigo:

@ device xt_osc ; oscilador externo XT


define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
' DEFINICIN DE REGISTROS PARA EL LCD
Define LCD_DREG PORTB 'Utilizar 4 bits del puerto B para tx de datos
Define LCD_DBIT 4
'Desde el Bit B.4 al Bit B.7
Define LCD_RSREG PORTB'Seleccin del puerto del registro
Define LCD_RSBIT 3
'En el bit B.1
Define LCD_EREG PORTB 'Utilizar el enable en el puerto B
Define LCD_EBIT 2
'En el bit B.2
' Establecer el puerto B como salida
TRISB=0
M var byte

;creacion de variable

Pause 500 ' tiempo para inicializar LCD


RUTINA:
LCDOUT $FE,64 ' COMIENZA DEFINICION
LCDOUT
LCDOUT
LCDOUT
LCDOUT
LCDOUT

$0,$E,$A,$1F,$1B,$1F,$1F,$0 ' 3 candado cerrado


$0,$E,$8,$1F,$1B,$1F,$1F,$0 ' 4 CANDAdO ABIERTO
$E,$A,$4,$1F,$4,$E,$A,$0 ' 5 MONITO
$A,$A,$0,$4,$11,$E,$0,$0 ' 6 cara feliz
$A,$A,$0,$4,$11,$E,$6,$0 '7 cara lengua

LCDOut $FE, 1 ' LIMPIA EL DISPLAY


LCDOUT $FE,$84,"CARACTERES"; mensaje en la primera linea LCD
LCDOUT $FE,$C0
;caracteres personalizados segunda linea LCD 2X16
; las siguientes lineas del programa sirven para visualizar en la segunda linea del LCD 2X 16
los caracteres especiales
FOR M = 0 TO 4

LCDOUT M
PAUSE 300
NEXT M
PAUSE 1500
LCDOut $FE, 1 ' LIMPIA EL DISPLAY
LCDOUT $FE,$81,"PERSONALIZADOS"
;mensaje

la primera linea LCD 2X16

LCDOUT $FE,64 'COMIENZA DEFINICION

LCDOUT
LCDOUT
LCDOUT
LCDOUT
LCDOUT

$1F,$11,$A,$4,$A,$11,$1F,$0 ' 2 RELOJ ARENA


$11,$1F,$1F,$15,$1F,$1B,$E,$0 ' 3 DIABLO
$E,$1F,$15,$1F,$1F,$E,$E,$0 ' 4 CALAVERA
$4,$2,$4,$0,$1F,$11,$E,$0 ' 5 TAZA
$0,$E,$11,$1F,$4,$14,$8,$0 ' sombrilla

; 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,

les dejo un link donde lo explican a detalle, espero les sirva,

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

PD. dejo mas links

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:

@ device xt_osc ; oscilador externo XT


define osc 4 ; especifica que se va a utilizar uno de 4 Mhz
' DEFINICIN DE REGISTROS PARA EL LCD
Define LCD_DREG PORTB 'Utilizar 4 bits del puerto B para tx de datos
Define LCD_DBIT 0
'Desde el Bit B.4 al Bit B.7
Define LCD_RSREG PORTB'Seleccin del puerto del registro
Define LCD_RSBIT 4
'En el bit B.1
Define LCD_EREG PORTB 'Utilizar el enable en el puerto B
Define LCD_EBIT 5
'En el bit B.2
' Establecer el puerto B como salida
TRISB=0
; configuracionde pines del PIc 16f84A
Alarma0 var porta.0
Alarma1 var porta.1
; definicion de variables
pulsos var word

; variable con capacidad de 65535

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

También podría gustarte