Curso de programación de PIC en PICBasic Pro.docx

22
Curso de programación de PIC en PICBasic Pro Curso de programación 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 : Código: @ device xt_osc ; oscilador externo XT define osc 4 ; especifica que se va a utilizar uno de 4 Mhz led var portb.0 ; asignamos led a puerto RB0 inicio: HIGH led ;asigna un 1 logico PAUSE 500 ; tiempo de espera de 500mls LOW led ; 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: Código: ; 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 ; 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 LED var portb.4 ; asigna el nombre de led a RB4 del pic 16f877A programa: ; inicio de la linea de programa for x=0 to 3 ; repetir 4 veces high led ;enciende led pause 2500 ; esperar 2.5 seg low led ;apaga led pause 500 ; espera 0.5 seg next ; siguiente repeticion hasta que sea x=3 end ; fin del programa

Transcript of Curso de programación de PIC en PICBasic Pro.docx

Page 1: Curso de programación de PIC en PICBasic Pro.docx

Curso de programación de PIC en PICBasic Pro

Curso de programación 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 :

Código:

@ device xt_osc ; oscilador externo XT

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

led var portb.0 ; asignamos led a puerto RB0

inicio:

HIGH led ;asigna un 1 logico

PAUSE 500 ; tiempo de espera de 500mls

LOW led ; 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:

Código:

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

LED var portb.4 ; asigna el nombre de led a RB4 del pic 16f877A

programa: ; inicio de la linea de programa

for x=0 to 3 ; repetir 4 veces

high led ;enciende led

pause 2500 ; esperar 2.5 seg

low led ;apaga led

pause 500 ; espera 0.5 seg

next ; siguiente repeticion hasta que sea x=3

end ; fin del programa

;proyecto con leds 1

Page 2: Curso de programación de PIC en PICBasic Pro.docx

Código:

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

LED1 var portb.0 ; 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

;LUEGO DE LAS LUCES DE DISCOTECA ENCIENDA LOS LEDS DEL MEDIO HACIA LOS EXTREMOS

;CON UN TIEMPO DE 200mseg

Código:

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

Page 3: Curso de programación de PIC en PICBasic Pro.docx

programa: ; inicio de la linea de programa

for x=0 to 6 ; repetir 7 veces

LEDS=LEDS<<1 ;desplaza uno a uno a la left

GOSUB TIEMPO ; esperar 0.2 seg

next ; siguiente repeticion hasta que sea x=6

for x=0 to 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 indefinidamenteCódigo: 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 ;etiqueta asignada al pin 2 del pic 16f877Aled2 var portb.1 ;etiqueta asignada al pin 3 del pic 16f877A

programa: ; inicio de la linea de programa

for x=0 to 5high led1gosub tiempolow led1gosub tiemponext

for x=0 to 1high led2

Page 4: Curso de programación de PIC en PICBasic Pro.docx

gosub tiempo1low led2gosub tiempo1next

for x=0 to 2 ; repetir 3 veceshigh led1:high led2 ;enciende ledsgosub tiempo ; ir a rutina tiempolow led1: low led2 ;apaga ledsgosub tiempo ; ir a rutina tiemponext ; siguiente repeticion hasta que sea x=3goto programa

tiempo:pause 300return

tiempo1:pause 1000returnend ; 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:

Código:

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 

Page 5: Curso de programación de PIC en PICBasic Pro.docx

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

Código:

@ 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 

Page 6: Curso de programación de PIC en PICBasic Pro.docx

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:

Código:

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

LED var portb.4 ; asigna el nombre de led a RB4 del pic 16f877A

programa: ; inicio de la linea de programa

for x=0 to 3 ; repetir 4 veces

high led ;enciende led

pause 2500 ; esperar 2.5 seg

low led ;apaga led

pause 500 ; espera 0.5 seg

next ; siguiente repeticion hasta que sea x=3

end ; fin del programa

;proyecto con leds 2

Código:

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

LED1 var portb.0 ; 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

Page 7: Curso de programación de PIC en PICBasic Pro.docx

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

Código:

; 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: ; inicio de la linea de programa

for x=0 to 6 ; repetir 7 veces

LEDS=LEDS<<1 ;desplaza uno a uno a la left

GOSUB TIEMPO ; esperar 0.2 seg

next ; siguiente repeticion hasta que sea x=6

for x=0 to 6 ; repetir 7 veces

vamos con mas

proyecto con pulsadores

proyecto1:

Código:

; leer el estado de un pulsador ubicado el RB0 del pic 16f877A en donde una vez

Page 8: Curso de programación de PIC en PICBasic Pro.docx

;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 ; pregunta si se acciono el pulsador ir a encender

goto inicio ; crea un bucle cerrado

encender: ;rutina encender

high portb.1 ; enciende led ubicado en este pin

pause 500 ;espera 500mls

toggle portb.1 ; apaga led

pause 500

goto inicio ;ir a inicio

end ;fin del programa

Archivos AdjuntosProyecto2 pulsadores 

Código:

;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 ;ubicacion del primer LED en RB2 del pic 16F877A

led2 var portb.3 ;"""" RB3

led3 var portb.4 ;"""""""""""""""""""" RB4

p1 var portb.0 ;"""""""del primer pulsador RB0 """"""""""""

p2 var portb.1 ;"""""""segundo pulsador RB1

x var byte ;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

Page 9: Curso de programación de PIC en PICBasic Pro.docx

Código:

; 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

Código:

;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 ;hace salidas los bit de menos valor del puertoB

NUMERO VAR BYTE

PULSADOR VAR PORTB.4

INICIO:

numero=0 ; carga la variable numero con cero

display:

portb=numero ;muestra en portb el contenido de numero

if pulsador=0 then aumentar ; preunta si el pulsador a sido activado

goto display

aumentar:

if pulsador=0 then aumentar ;rutina para estabilizar tecla

Page 10: Curso de programación de PIC en PICBasic Pro.docx

pause 300

if numero=9 then inicio ; pregunta si ha llegado a nueve

numero =numero+1

goto display ; suma uno a la variable numero y guarda el

;resultado en al misam variable

end

Archivos Adjuntos

proyecto 3

Código:

;proyecto display

;programa que presenta la palabra HOLA en 4 displays PIC16f84A con

;desplazamiento de derecha a izquierda.

@ 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

trisa=0 ;puerto a como salidas

x var byte ;variable con capacidad de 255

texto:

for x=1 to 20 ; repeticiones de este segmento

porta=14:portb=8 ;formación de la letra A en el display

GOSUB TIEMPO ; ir a rutina tiempo

porta=13:portb=71 ;forma la letra L

gosub tiempo ; ir a rutina tiempo

porta=11:portb=64 ;forma la letra O

gosub tiempo ; ir a rutina tiempo

porta=7:portb=9 ;forma la letra H

gosub tiempo ; ir a rutina tiempo

next ; siguiente repetición

for x=1 to 20

porta=14:portb=127 ;apaga el display

GOSUB TIEMPO ; ir a rutina tiempo

porta=13:portb=8 ;forma la letra A

gosub tiempo ; ir a rutina tiempo

porta=11:portb=71 ;forma la letra L

gosub tiempo ; ir a rutina tiempo

porta=7:portb=64 ;forma la letra O

gosub tiempo ; ir a rutina tiempo

next

for x=1 to 20

porta=14:portb=9 ;forma la letra H

GOSUB TIEMPO ; ir a rutina tiempo

porta=13:portb=127 ;apaga el display

gosub tiempo

porta=11:portb=8 ;forma la letra A

gosub tiempo

Page 11: Curso de programación de PIC en PICBasic Pro.docx

porta=7:portb=71 ;forma la letra L

gosub tiempo

next

for x=1 to 20

porta=14:portb=64 ;forma la letra O

GOSUB TIEMPO

porta=13:portb=9 ;forma la letra H

gosub tiempo

porta=11:portb=127 ;apaga el display

gosub tiempo

porta=7:portb=8 ;forma la letra A

gosub tiempo

next

for x=1 to 20 ;forma la letra L

porta=14:portb=71

GOSUB TIEMPO

porta=13:portb=64 ;forma la letra O

gosub tiempo

porta=11:portb=9 ;forma la letra H

gosub tiempo

porta=7:portb=127 ;apaga el display

gosub tiempo

next

goto texto ;IR A TEXTO

TIEMPO:

PAUSE 5 ;espera5mls

RETURN ;retorna al gosub que la llamo

end ;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.

Descripción de pines: 

PIN Nº SIMBOLO DESCRIPCION 

1 Vss Tierra de alimentación GND 

2 Vdd Alimentación de +5V CC 

3 Vo Contraste del cristal liquido. ( 0 a +5V ) 

4 RS Selección del registro de control/registro de datos: 

RS=0 Selección registro de control

RS=1 Selección registro de datos

Page 12: Curso de programación de PIC en PICBasic Pro.docx

5 R/W Señal de lectura/escritura:

R/W=0 Escritura (Write)

R/W=1 Lectura (Read)

6 E Habilitación del modulo:

E=0 Módulo desconectado

E=1 Módulo 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:

Código:

; 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

'

Page 13: Curso de programación de PIC en PICBasic Pro.docx

' inicio del programa

'

TRISB = 0 ' PORTB es salida

PAUSE 500 ' retardo para inicializar el LCD

Cnt = 0 ' limpia contador y lo coloca a cero

LCDOUT $FE,1 ' 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 simulaciónQue 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:

Código:

;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 SEÑAL A UNO LOGICO

;DURANTE EL TIEMPO DE ACTIVACION O DE CONTEO , PERO SI ES INTERRUMPIDA LA SEÑAL

;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 LCD_DREG PORTB

Define LCD_DBIT 0

Define LCD_RSREG PORTB

Define LCD_RSBIT 4

Define LCD_EREG PORTB

Define LCD_EBIT 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:

Page 14: Curso de programación de PIC en PICBasic Pro.docx

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

Código:

; 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 LCD_DREG PORTB

Define LCD_DBIT 0

Define LCD_RSREG PORTB

Define LCD_RSBIT 4

Define LCD_EREG PORTB

Define LCD_EBIT 5

;CONFIGURACION DE ENTRADAS AL PIC 146F84a

Symbol Hrs_button = PORTA.0 ; BOTON DE AJUSTE PARA HORA

Symbol Mins_button = PORTA.1 ; 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.

Código:

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

Define LCD_DBIT 0

Define LCD_RSREG PORTB

Page 15: Curso de programación de PIC en PICBasic Pro.docx

Define LCD_RSBIT 4

Define LCD_EREG PORTB

Define LCD_EBIT 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.

Código:

; 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 LCD_DREG PORTB

Define LCD_DBIT 0

Define LCD_RSREG PORTB

Define LCD_RSBIT 4

Define LCD_EREG PORTB

Define LCD_EBIT 5

PAUSE 200 ; 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:

Código:

; 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

Page 16: Curso de programación de PIC en PICBasic Pro.docx

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 

Page 17: Curso de programación de PIC en PICBasic Pro.docx

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.

Código:

@ 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 1

' configuracion del lcd 2x16

DEFINE LCD_DREG PORTD

DEFINE LCD_DBIT 4

DEFINE LCD_RSREG PORTE

DEFINE LCD_RSBIT 0

DEFINE LCD_EREG PORTE

DEFINE LCD_EBIT 1

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

Page 18: Curso de programación de PIC en PICBasic Pro.docx

For address = 0 TO 15 'REPITE 16 VECES

B1 = address + 100 ' SUMA 100 A ADDRESS Y VALOR LO GUARDA EN B1

I2CWrite SDA,SCL,$A0,address,[B1] ' GUARDA EL RESULTA DE B1 EN EN ADDRESS

Pause 10 ' ESPERA 10MS

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

Page 19: Curso de programación de PIC en PICBasic Pro.docx

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 posición 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 tamaño de

2x40=80 bytes.

CG RAM (carácter 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 posición 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 carácter 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:

Código:

@ device xt_osc ; oscilador externo XT

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

' DEFINICIÓN 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'Selección 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 $0,$E,$A,$1F,$1B,$1F,$1F,$0 ' 3 candado cerrado

LCDOUT $0,$E,$8,$1F,$1B,$1F,$1F,$0 ' 4 CANDAdO ABIERTO

LCDOUT $E,$A,$4,$1F,$4,$E,$A,$0 ' 5 MONITO

LCDOUT $A,$A,$0,$4,$11,$E,$0,$0 ' 6 cara feliz

LCDOUT $A,$A,$0,$4,$11,$E,$6,$0 '7 cara lengua

Page 20: Curso de programación de PIC en PICBasic Pro.docx

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 $1F,$11,$A,$4,$A,$11,$1F,$0 ' 2 RELOJ ARENA

LCDOUT $11,$1F,$1F,$15,$1F,$1B,$E,$0 ' 3 DIABLO

LCDOUT $E,$1F,$15,$1F,$1F,$E,$E,$0 ' 4 CALAVERA

LCDOUT $4,$2,$4,$0,$1F,$11,$E,$0 ' 5 TAZA

LCDOUT $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

Page 21: Curso de programación de PIC en PICBasic Pro.docx

Ok gracias, buscaré algúno que tenga por ahi pero mas que proyectos, surgen mas dudas y creo que eso es bueno

porque es señal 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 señales 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:

Código:

@ device xt_osc ; oscilador externo XT

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

' DEFINICIÓN 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'Selección 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