Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
21/05/2009 #1

Avatar de mecatrodatos

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.
21/05/2009 #2

Avatar de mecatrodatos

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
21/05/2009 #3

Avatar de mecatrodatos

;proyecto con leds 1

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
21/05/2009 #4

Avatar de mecatrodatos

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

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
21/05/2009 #5

Avatar de mecatrodatos

;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

Có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 16f877A
led2 var portb.1       ;etiqueta asignada al pin 3 del pic 16f877A
 
programa:             ; inicio de la linea de programa 

for x=0 to 5
high led1
gosub tiempo
low led1
gosub tiempo
next
 
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
23/05/2009 #6

Avatar de mecatrodatos

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


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

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.
24/05/2009 #7

Avatar de mecatrodatos

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
Archivos Adjuntos
Tipo de Archivo: zip proyecto_1_204.zip (9,7 KB (Kilobytes), 1593 visitas)
24/05/2009 #8

Avatar de mecatrodatos

;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 

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
Tipo de Archivo: zip proyecto2_167.zip (10,0 KB (Kilobytes), 970 visitas)
24/05/2009 #9

Avatar de mecatrodatos

;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
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
Archivos Adjuntos
Tipo de Archivo: zip proyecto3_511.zip (28,0 KB (Kilobytes), 1011 visitas)
24/05/2009 #10

Avatar de mecatrodatos

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 
;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 Adjuntos
Tipo de Archivo: zip pulsadores_134.zip (16,4 KB (Kilobytes), 1053 visitas)
24/05/2009 #11

Avatar de mecatrodatos

Proyecto2 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


encender:                    ;rutina encender
high led1                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led1                ; apaga led
pause 1000
goto inicio                   ;ir a inicio

encender1:
high led2                 ; enciende led 
pause 1000                   ;espera 1seg
toggle led2                ; apaga led
pause 1000
goto inicio 

encender2:
for x=0 TO 4           ; repite cinco veces 
high led3                ; enciende led 
pause 300                   ;espera 300mls
low led3                ; apaga led utilice comando low que cumple la misma 
                         ;funcion que toggle que cambia la configuracion
                         ;de un bit es decir si esta en ALTO LO PASA A BAJO
                         ;y viceversa
pause 300
NEXT                   ; SIGUIENTE HASTA QUE SE REPITE 5 VECES
goto inicio 
end                            ;fin del programa
Archivos Adjuntos
Tipo de Archivo: zip pulsador_p2_153.zip (37,1 KB (Kilobytes), 1035 visitas)
25/05/2009 #12

Avatar de mecatrodatos

vamos con proyectos con display

proyecto 1 displays

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
Tipo de Archivo: zip display_132.zip (16,3 KB (Kilobytes), 1119 visitas)
25/05/2009 #13

Avatar de mecatrodatos

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 
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
Tipo de Archivo: zip display2_190.zip (18,2 KB (Kilobytes), 953 visitas)
25/05/2009 #14

Avatar de mecatrodatos

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
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
Tipo de Archivo: zip hola_134.zip (16,1 KB (Kilobytes), 1121 visitas)
27/05/2009 #15

Avatar de mecatrodatos

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

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
27/05/2009 #16

Avatar de mecatrodatos

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 
'
' 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 simulacion
[/img]
30/05/2009 #17

Avatar de mecatrodatos

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:



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           
Symbol CLEAR_button = PORTA.2           
Symbol STOP_button = PORTA.1             
Symbol LED = PORTA.3 

;variables de almacenamiento  de datos
           
Ticks VAR byte                           
Minute VAR byte                         
Second VAR byte                       
Disp VAR byte                         
TRISA = 15 ; PORTA 0,1,2,3 son entradas
TRISB = 0 ; portb es salida

PAUSE 500 ;0.5 seg para inicializar lcd

;limpieza de variables creadas

Minute = 0 
Second = 0 
Ticks = 0 
Disp = 1 ; mustra en el LCD 00:00 al iniciar

OPTION_REG = $05               ;  prescaler = 64
ON INTERRUPT GOTO ISR          ; ir a rutina ISR 
LCDOUT $FE, 1        


LOOP:

IF CLEAR_button = 0 THEN

Minute = 0
Second = 0
Ticks = 0
led= 0
Disp = 1
goto loop
ENDIF

IF START_button = 0 THEN
high led
TMR0 = 0 ;inicializa registro TRMO
INTCON = $A0 ; habilita tiempo de interuupcion
Disp = 1 ; habilita LCD
ENDIF


IF STOP_button = 0 THEN
low led
INTCON = 0 ; desabilita tiempo de interrupcion
Disp = 1 
ENDIF

IF Disp = 1 THEN
LCDOUT $FE, 2
LCDOUT DEC2 Minute, ":",DEC2 Second
Disp = 0
ENDIF
GOTO LOOP            


DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
Second = 0
Minute = Minute + 1
IF Minute = 5 THEN
Minute = 0
led=0
ENDIF
ENDIF

Disp = 1

NoUpdate:
INTCON.2 = 0 ;rehabilitainterrupciones del TRMO
Resume
ENABLE ; 
END
END ; Fin del programa
Archivos Adjuntos
Tipo de Archivo: zip crono5_161.zip (11,7 KB (Kilobytes), 1243 visitas)
31/05/2009 #18

Avatar de mecatrodatos

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


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)
Hour VAR byte 
Minute VAR byte 
Second VAR byte 
Disp VAR byte ; Disp = 1 to ACTULIZA LCD
Delay VAR byte  
TRISB = 0 ; PORTB is SALIDA
TRISA = 3 ; RA0,RA1 SON ENTRADAS

PAUSE 500 ; ESPERA 0.5sec PARA INICIALIZAR LCD

; RUTINA PARA PONER A CERO VARIABLES CEREADAS
Hour = 0
Minute = 0
Second = 0
Ticks = 0

OPTION_REG = $05 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = $A0 
LCDOUT $FE, 1 ;LIMPIA LCD

;INCIO DEL PROGRMA 

LOOP:

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON HORA CUANDO ES ACCIONADO

IF Hrs_button = 0 THEN
Hour = Hour + 1
IF Hour = 24 THEN Hour = 0
Gosub Debounce
ENDIF

;;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTO CUANDO ES ACCIONADO
IF Mins_button = 0 THEN
Minute = Minute +1
IF Minute = 60 THEN Minute = 0
Gosub Debounce
ENDIF


;RUTINA PARA MOSTRAR VLORES EN EL lcd DE H:M:S

IF Disp = 1 THEN
LCDOUT $FE, 2
LCDOUT DEC2 Hour, ":",DEC2 Minute, ":",DEC2 Second
Disp = 0
ENDIF
GOTO LOOP

; RUTINA DE RETARDO PARA LEER BOTONES 

Debounce:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN
; RUTINA PARA EJECUCION DE UN SEGUNDO

DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate

;RUTINA DE TIEMPO SEGUNDO , MINUTO Y HORAS

Ticks = 0
Second = Second + 1 
IF Second = 60 THEN
Second = 0
Minute = Minute + 1 
IF Minute = 60 THEN
Minute = 0
Hour = Hour + 1 
IF Hour = 24 THEN
Hour = 0
ENDIF
ENDIF
ENDIF
Disp = 1 ; ACTUALIZA LDC

; RUTINA DE LACULMINACION DEL TIEMPO DE ACTIVACION

NoUpdate:
INTCON.2 = 0 
Resume
ENABLE 
END
END
Archivos Adjuntos
Tipo de Archivo: zip reloj_digital_102.zip (27,5 KB (Kilobytes), 1481 visitas)
31/05/2009 #19

Avatar de mecatrodatos

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

END
Archivos Adjuntos
Tipo de Archivo: zip mensaje_171.zip (13,6 KB (Kilobytes), 874 visitas)
31/05/2009 #20

Avatar de mecatrodatos

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
LCDOUT $FE, 1 ;LIMPIA LCD

; inicio del programa

LOOP:
LCDOUT $FE,$91 ; ubicar cursor en la casilla 18
for a =0 to 18
lookup a,["CURSO PIC BASIC PRO"],B
LCDOUT,B
PAUSE 500
NEXT
GOTO LOOP
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.