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 led var portb.0 inicio: HIGH led PAUSE 500 LOW led

; oscilador externo XT ; especifica que se va a utilizar uno de 4 Mhz ; asignamos led a puerto RB0

;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

; ; ; ;

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

; 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 programa:

; ; ; ;

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 ; 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 leds=leds<<2 leds=leds>>1

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

@ 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

LEDS var PORTB LED0 var portb.0 LED1 VAR portb.1 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 leds=1

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

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

; 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 LEDS=LEDS>>1 pause 200 next

; siguiente repeticion hasta que sea x=6 ; repetir 7 veces ; desplaza uno a uno a la right ; esperar 0.2 seg

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 LED var portb.4

; ; ; ;

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

; 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 programa:

; asigna el nombre de led2 a RB1 ; 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

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

@ 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

; 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 ; siguiente repeticion hasta que sea x=6 ; repetir 7 veces

programa: for x=0 to 6 LEDS=LEDS<<1 GOSUB TIEMPO 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

; 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

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 end
Archivos Adjuntos proyecto 3
Cdigo:

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

;proyecto display ;programa que presenta la palabra HOLA en 4 displays PIC16f84A con ;desplazamiento de derecha a izquierda.

@ device xt_osc define osc 4 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

; oscilador externo XT ; especifica que se va a utilizar uno de 4 Mhz ;puerto b como salidas ;puerto a como salidas ;variable con capacidad de 255

; 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 for x=1 to 20 porta=14:portb=9 GOSUB TIEMPO porta=13:portb=127 gosub tiempo

;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

;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 ;CREACION DE VARIABLES Ticks VAR byte ;

; BOTON DE AJUSTE PARA HORA ; BOTO0N DE AJUSTE PARA MINUTOS

(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 PORTB 0 PORTB 4 PORTB 5 ; RETARDO PARA QUE INICIALIZE EL LCD

PAUSE 200

;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 DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE LCD_DREG LCD_DBIT LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT

2x16 PORTD 4 PORTE 0 PORTE 1

SCL SDA

VAR VAR

PORTC.3 PORTC.4

' Clock pin ' Data pin

address VAR B1 B2 VAR VAR

WORD BYTE BYTE

' Address ' Data 1 ' Data 2

ADCON1 = 7 Low PORTE.2 Pause 100

' PORTa Y PORTE COMO DIGITALES ' LCD R/W line low (W) '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 ' GUARDA EL RESULTA DE B1 EN EN ADDRESS

I2CWrite SDA,SCL,$A0,address,[B1] Pause 10 ' ESPERA 10MS

Next address

;ESPERA A QUE SE REALICE LA REPETICION

loop: For address = 0 TO 15 STEP 2 I2CRead SDA,SCL,$A0,address,[B1,B2] ' Loop 8 times 'LEE LAS DOS VARIABLES 'VISUALIZA EN EL DISPLAY VALOR DEC

LCDOut $fe,1,#address,": ",#B1," ",#B2," " 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 LCDOUT $FE,64 'COMIENZA DEFINICION

la primera linea LCD 2X16

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

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

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