Вы находитесь на странице: 1из 28

MANEJO DE UN MODULO LCD

Los mdulos LCD (Display de Cristal Lquidos), son utilizados para mostrar mensajes que indican
al operario es estado de la maquina, o para dar instrucciones de manejo, Mostar valores, etc. El LCD
permite la comunicacin entre las maquinas y los humanos, este puede mostrar cualquier carcter
ASCII, y consume mucho menos que los display de 7 segmentos, existe de varias presentaciones
por ejemplo de 2 lneas por 8 caracteres, 2x16, 2x20, 4x20, 4x40, etc. Sin backlight (14 pines) o con
backlight (16 pines, iluminado de pantalla), el LCD ms popular es el 2x16, 2 lneas de 16 caracteres
cada una.
Fotografa de un LCD 2x16

LA DECLARACIN LCDOUT: sirve para mostrar tems en una pantalla de


cristal lquido, se utiliza escribiendo: LCDOUT, luego escribiendo $FE, y seguido por el
comando a utilizar, el siguiente cuadro muestra los comandos mas utilizados:

Los LCD se puede conectar con el PIC con un bus de 4 u 8 bits, la diferencia est en el tiempo
que se demora, pues la comunicacin a 4 bits, primero enva los 4 bits ms altos y luego los 4 bits
mas bajos, mientras que la de 8 bits enva todo al mismo tiempo, esto no es un inconveniente si
consideramos que el LCD trabaja en microsegundos. Pero la gran ventaja de hacer conexin a 4
bits, son los pocos cables que se deben conectar, como podemos ver en la figura siguiente solo
debemos conectar el bit de Registro, el Enable y los 4 bits ms altos del LCD, con esto es suficiente
para enviar mensajes.
El compilador PBP soporta mdulos LCD S con controlador Hitachi 44780 o equivalentes y por
defecto, asume que se conecto en el pin A4 el bit de registro, en el pin B3 el bit Enable y en el puerto
A empezando desde A0 hasta A3, los bits ms altos del LCD. Esta configuracin predefinida, se lo
puede cambiar de acuerdo a la necesidad, como lo veremos mas adelante.

pause 200 ; tempo de espera a que la pantalla se inicie


lcdout $FE, 1, "Hola" 'limpiar pantalla y sacar el texto hola
lcdout $FE, $C0, "micro PIC" 'pasar al comienzo de la segunda lnea 'y escribir micro PIC
End

Nota: algunos LCD no requieren de ninguna PAUSE al inicio, pero existen otros modelos que
necesita unos pocos milisegundos para estar listos, por eso colocamos un PAUSE 200 al comienzo
del programa.
Bien una vez listo el texto notaremos que las dos palabras estn al lado izquierdo, si queremos
que salgan centrados en nuestro LCD, tenemos 2 maneras de hacerlo, la primera es dando espacio
antes de cada palabra, ejemplo:
LCDOUT $FE,1, Hola y LCDOUT $FE, $C0, Micro PIC
Lo cual es sencillo pero no es muy recomendable porque ocupa mas espacio en el PIC, la
segunda manera es asignando el lugar donde se requiere que aparezca cada palabra.
LCDOUT $FE, 1
; limpiar pantalla
LCDOUT $FE, $86, "Hola"
'pasar el cursor a la 7ma casilla de 1ra lnea y escribe
LCDOUT $FE, $C4, "micro PIC"
'pasar a la casilla 5ta de la 2da lnea y escribe micro PIC

Se debe entender que existe un cursor que aunque no lo vemos, pues este es el que indica donde
aparecer la siguiente letra, para poder entender haremos un ejercicio completo, as podrn
aprender ms de LCD y las funciones de cada uno de los comandos. Primero que nada haremos
visible el cursor y luego pondremos PAUSE para poder ver el funcionamiento.
Programa de manejo del cursor:

@ device mclr_off 'apago MCLR


x var byte
pepa con $FE
pause 2000
lcdout pepa, 1
pause 2000
lcdout pepa, $0F 'muestra el cursor en casilla negra
pause 2000
lcdout pepa, $0E 'subraya el cursor
pause 2000
lcdout pepa, $14 'desplaza el cursor una casilla a la derecha
pause 2000
lcdout, "TABIN"
pause 2000
for x = 1 to 3
lcdout pepa, $10 'desplaza el cursos una casilla a la izquierda
pause 1000
next
lcdout, "V" 'enviar caracter ASCII "V" para corregir TAVIN
pause 2000
lcdout pepa, $C0+12, "8Vo"
pause 2000
lcdout pepa,2,"1" 'vuelve al inicio de la 1era fila y escribe 1

Observen que la constante $FE se le cambio por pepa, as mismo si se les dificulta memorizar
como pasar a la segunda lnea, puede definir la constante: lin2 CON $C0, y cuando desee escribir en
la segunda lnea pondran: LCDOUT pepa, lin2, Hola, o lo que es lo mismo utilizando nmeros
decimales: LCDOUT 254, 192, Hola. Tambin cabe recalcar que el LCD tiene una memoria RAM
(Random Access Memory) que lo explicaremos ms adelante, por lo que una vez que se enva el
texto, este permanecer ah y el PIC se lo puede utilizar para otras tareas o podemos desconectarlo
si lo deseamos.
En ocasiones especiales se debe cambiar la configuracin de los pines del PIC hacia el LCD, por
ejemplo para utilizar los comparadores de voltaje que se encuentran en el puerto A, necesitamos
dejar disponibles estos pines, esto se logra adicionando al principio lo siguiente:
DEFINE LCD_DREG PORTB define pines del LCD B4 a B7
DEFINE LCD_DBIT 4 empezando desde el puerto B4 hasta el B7
DEFINE LCD_RSREG PORTB define pin para conectar el bit RS
DEFINE LCD_RSBIT 3 en el puerto B3
DEFINE LCD_EREG PORTB define el pin par conectar el bit Enable
DEFINE LCD_EBIT 2 en el puerto B2

Una vez que se define la nueva configuracin de pines para el LCD, programamos de la misma
forma que las ocasiones anteriores, es importante adems saber que los 4 bits de datos solo se
pueden configurar en los 4 bits ms bajos (B.0 al B.3) o los 4 bits ms altos (B.4 al B.7) de un puerto
del PIC, y si deseamos hacer una comunicacin a 8 bits con el LCD, estos deben estar en un solo
puerto, adems debemos definir en el PBP que vamos a utilizar un bus de 8 bits, esto es de la
siguiente manera:
DEFINE LCD_BITS 8 ; Define comunicacin a 8 bits con el LCD y si nuestro LCD posee 4 lneas,
tambin debemos definirlo de la siguiente forma:
DEFINE LCD_BITS 4 ;Define comunicacin 4 8 bits con el LCD
Nunca debes olvidarte de colocar el potencimetro en el display y las alimentaciones,
en nuestras simulaciones vamos a obviar esto.

Configuracin de un LCD a 4 bits con una configuracin diferente a la predefinida por el PBP, esta vez utilizando el
puerto B.3 para el bit R/S al B2 pare el Enable y desde el B.4 al B.7 para los bits de comunicacin.

PRESENTACIN DE CARCTER POR CARCTER EN LCD


En las practicas anteriores se presentaron mensajes completos en un instante, en esta nueva
prctica incluimos la declaracin LOOKUP, que nos servir para enviar carcter por carcter con un
intervalo de 400 mls, dando como resultado un efecto especial en la visualizacin. Como conexin
para esta practica utilizaremos la nueva configuracin aprendida.
@ device mclr_off 'apago MCLR
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
x var byte
abc var byte
pause 200
ini:
lcdout $FE,1
for x = 0 to 15
lookup x,["Microcontrolador"],abc
lcdout ,abc
pause 400
next
pause 2000
goto ini
end

DESPLAZAMIENTO DE UN TEXTO LCD


El LCD dispone en cada una de las lneas 40 posiciones de memoria, de los cuales nicamente 16
son visibles, en el siguiente ejercicio escribiremos un mensaje desde el casillero 17 ($90), el cual no
es visible y luego iremos desplazando a la izquierda, como resultado tendremos un texto que se
mantiene en movimiento, una vez que este termina recorrer 16 posiciones en blanco y luego
volver a parecer los 24 caracteres del texto.
@ device mclr_off 'apago MCLR
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
x var byte
abc var byte
lcdout $FE, $7
lcdout $FE, 1
pause 200
ini:
lcdout $FE,$90
for x = 0 to 23
lookup x,["Microcontroladores-PIC-"],abc
lcdout ,abc
pause 400
next
goto ini
end

CONTADOR DE PULSOS CON LCD


Este proyecto, consiste en contar el nmero de pulsos que ingresan por un pin en un determinado
periodo, este a su vez visualiza en un LCD, si la cantidad de este supera a los 120 pulsos por
segundo es decir 120Hz, se encender una alarma visual (un led rojo), y si la cantidad de pulsos
baja a menos de 100Hz, este encender un led Verde, si la frecuencia se mantiene entre estos 2
rangos, no se encender ningn led.
Para esta practica utilizaremos el C.I 555 que nos ayuda a generar un tren de pulsos variable, el
cual lo conectamos al PIC para su posterior conteo.
DECLARACIN PULSEIN. Sirve para contar el nmero de pulsos que ingresan por un pin en un
determinado tiempo, este a su vez lo guarda en una variable para su posterior procesamiento, la
manera de utilizarlo es la siguiente.
COUNT portb.0, 1000, abc
El cual se interpreta as: cuenta pulsos a travs del puerto B0 en un periodo de 1000 milisegundos
y lo guarda en la variable previamente creada llamada abc, el periodo podemos variarlo de 1 a
65535.
@ device mclr_off 'apago MCLR
cmcon = 7
ledred var portb.2

ledver var portb.1


puls var word
prog:
count portb.0, 1000, puls ' contar pulsos en el puerto B.0
lcdout $FE,1
LCDOut $FE,$82,"Frecuencia"
lcdout $FE,$C5, dec puls, "Hz"
if puls > 120 then alarmah
if puls < 100 then alarmal
low ledred : low ledver
goto prog
alarmah:
high ledred : low ledver
goto prog
alarmal:
low ledred : high ledver
goto prog
end

LA PALABRA DEC. Sirve para mostrar el nmero de la variable en decimal, tambin se lo puede
representar por el signo (#), adems existe las palabras BIN y HEX, el siguiente es un ejemplo de
cmo mostrara el LCD si puls = 105:
LCDOUT $FE,$C5, DEC puls, Hz ;muestra en el LCD as: 105Hz
Tambin se lo puede utilizar el signo # que equivale a DEC
LCDOUT $FE,$C5, # puls, Hz ;muestra en el LCD as: 105Hz
Si deseamos ver la variable en hexadecimal pondramos as:
LCDOUT $FE,$C5, HEX puls, Hz ;muestra en el LCD as: 69Hz
Y si queremos verlo en binario
LCDOUT $FE,$C5, BIN puls, Hz ;muestra en el LCD as: 1101001Hz

LECTURA DE UN POTENCIMETRO CON LCD


LA DECLARACIN POT: esta declaracin sirve para leer el estado de un potencimetro de 5K
hasta uno de 50K, o cualquier elemento resistivo cualesquiera, el principio de funcionamiento es muy
sencillo, utiliza la ayuda de un condensador de 0.1uf, al cual lo carga y descarga utilizando el
potencimetro para regular la corriente que circula, entonces a mayor resistencia el capacitor se
demora mas tiempo en cargarse, y la PIC nos dar un valor alto u si giramos el potencimetro a la
mnima resistencia, el capacitor se cargara ms rpido y la variable nos dar cero, en definitiva
estaremos leyendo el estado de un potencimetro.

Conexin de un potencimetro para leerlo.

@ device mclr_off 'apago MCLR


DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
dato var byte
medir
pot portb.0,255,dato 'leer el potenciometro y guardar en dato
lcdout $FE,1," Rango= "
lcdout ,#dato
pause 100
goto medir
end

Seccin de programa vmetro


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

BARRA: 'spanish
IF MARCA1 = 1 THEN 'Si es verdadero
LINEA = $2 '1 Linea LCD, muestra canal L
ADCIN 7, CANAL
MARCA1 = 0
ELSE 'Si no lo es
LINEA = $c0 '2 Linea LCD, muestra canal R
ADCIN 6, CANAL
MARCA1 = 1
ENDIF
BAR : 'english
IF Mark1 = 1 THEN
LINE = $2: ADCIN 7, CHANNEL: Mark1 = 0
ELSE
LINE = $c0: ADCIN 6, CHANNEL: Mark1 = 1

'
'
'
'

If true
1st line LCD shows L channel
If it is not
2nd Line LCD shows R channel

PROGRAMA EN CODE

17. '*******************************************************************************
18. '* Archivo : VUMETER.PBP
*
19. '* Autor
: Sal (Alias Zaxione)
*
20. '* Fecha
: 08/11/2009
*
21. '* Versin : 1.0
*
22. '* Nota
: VU Meter Estreo con varias visualizaciones.
*
23. '* Web
: http://www.zaxione.com
*
24. '*******************************************************************************
25. #CONFIG
26. __config _HS_OSC & _WDT_OFF & _CP_OFF & _BOREN_OFF
27.
28. #ENDCONFIG
29.
DEFINE OSC 20
'Oscilador de 20 MHz
30.
31. '*******************************************************************************
32. ' LCD I/O DEFINITIONS
33. DEFINE LCD_DREG PORTB 'LCD PORT para envo de datos B
34. DEFINE LCD_DBIT 4
'LCD utiliza los Bit inferior 0 o superior 4
35. DEFINE LCD_RSREG PORTB 'LCD RS en el PORTB
36. DEFINE LCD_RSBIT 0
'LCD RS PORTB.0
37. DEFINE LCD_EREG PORTB 'LCD E en el PORTB
38. DEFINE LCD_EBIT 1
'LCD E PORTB.1
39. DEFINE LCD_BITS 4
'LCD se utilizan 4 o 8 bits para datos
40. DEFINE LCD_LINES 2
'Numero de lineas del lcd
41.
42. '*******************************************************************************
43. ' LCD DEFINITIONS
44. DEFINE ADC_BITS 8
'Resultado del ADC 8 o 10 bits
45. DEFINE ADC_CLOCK 3
'Ajuste del reloj
46. DEFINE ADC_SAMPLEUS 50 'Ajuste del tiempo de muestreo en microsegundos
47.
48. '*******************************************************************************
49. ' VARIABLES
50. CANAL
var BYTE
'Nombre de la variable
51. LINEA
VAR BYTE
'Nombre de la variable
52. CONTADOR VAR BYTE
'Nombre de la variable
53. RESTO
VAR BYTE
'Nombre de la variable
54. MARCA1
VAR BIT
'Nombre de la variable
55. MARCA2
var BYTE
'Nombre de la variable
56. PULSADOR var PORTB.2
'Pulsador en el PORTB.2
57.
58. '*******************************************************************************

59. ' PROGRAM


60. PAUSE 500
'Tiempo necesario para la iniciacin del LCD 7
61. ADCON1 = 00000000
'Definir todos los PORTA y PORTE como analgicos
62.
63. '*******************************************************************************
64. ' INITIAL MESSAGE --> "Zaxione"
65. LCDOUT 254, 64, 1 ,2 ,5, 5 ,5 ,5 ,2 ,1
'cgram posicin 0
66. LCDOUT 254, 72, 24 ,4 ,26, 2 ,2 ,26 ,4 ,24
'cgram posicin 1
67. LCDOUT $FE, 1
'Borrado de la pantalla
68. ' Shift message Left
69. FOR CONTADOR = 144 TO 130 STEP -1
'Cuenta atras
70.
LCDOUT $FE, CONTADOR, 20, 0, 1, "Zaxione "
'Imprimir en pantalla
71.
PAUSE 150
'Pausa de 0,15 segundos
72. NEXT CONTADOR
'Regresa a CONTADOR
73. PAUSE 2000
'Pausa de 2 segundos
74. ' Shift message Right
75. FOR CONTADOR = 130 TO 144
'Cuenta hacia delante
76.
LCDOUT $FE, CONTADOR, 20, 0, 1, "Zaxione "
'Imprimir en pantalla
77.
PAUSE 150
'Pausa de 0,15 segundos
78. NEXT CONTADOR
'Regresa a CONTADOR
79. LCDOUT $FE, 1
'Borrado de la pantalla
80.
81. '*******************************************************************************
82. ' VU line style 1 (graphic bitmaps)
83. GRAF1:
84. MARCA2 = 1
85. LCDOUT 254,64, 0 ,16 ,16, 16 ,16 ,16 ,16 ,0
'cgram posicin 0
86. LCDOUT 254,72, 0 ,24 ,24, 24 ,24 ,24 ,24 ,0
'cgram posicin 1
87. LCDOUT 254,80, 0 ,28 ,28, 28 ,28 ,28 ,28 ,0
'cgram posicin 2
88. LCDOUT 254,88, 0 ,30 ,30, 30 ,30 ,30 ,30 ,0
'cgram posicin 3
89. LCDOUT 254,96, 0 ,31 ,31, 31 ,31 ,31 ,31 ,0
'cgram posicin 4
90. PAUSE 300
91. GOTO BARRA
92.
93. '*******************************************************************************
94. ' VU line style 2 (graphic bitmaps)
95. GRAF2:
96. MARCA2 = 2
97. LCDOUT 254,64, 0 ,24 ,24, 24 ,24 ,24 ,24 ,0
'cgram posicin 0
98. LCDOUT 254,72, 0 ,24 ,24, 24 ,24 ,24 ,24 ,0
'cgram posicin 1
99. LCDOUT 254,80, 0 ,27 ,27, 27 ,27 ,27 ,27 ,0
'cgram posicin 2
100.
LCDOUT 254,88, 0 ,27 ,27, 27 ,27 ,27 ,27 ,0
'cgram posicin 3
101.
LCDOUT 254,96, 0 ,27 ,27, 27 ,27 ,27 ,27 ,0
'cgram posicin 4
102.
PAUSE 300
103.
GOTO BARRA
104.
105.
'*******************************************************************************
106.
' VU line style 3 (graphic bitmaps)
107. GRAF3:
108.
MARCA2 = 3
109.
LCDOUT 254,64, 0 ,0 ,0, 16 ,16 ,0 ,0 ,0
'cgram posicin 0
110.
LCDOUT 254,72, 0 ,0 ,0, 24 ,24 ,0 ,0 ,0
'cgram posicin 1
111.
LCDOUT 254,80, 0 ,0 ,0, 28 ,28 ,0 ,0 ,0
'cgram posicin 2
112.
LCDOUT 254,88, 0 ,0 ,0, 30 ,30 ,0 ,0 ,0
'cgram posicin 3
113.
LCDOUT 254,96, 0 ,0 ,0, 31 ,31 ,0 ,0 ,0
'cgram posicin 4
114.
PAUSE 300
115.
GOTO BARRA
116.
117.
'*******************************************************************************
118.
' VU Line style 4 (graphic bitmaps)
119.
120. GRAF4:
121.
MARCA2 = 4
122.
LCDOUT 254,64, 0 ,16 ,16, 16 ,16 ,16 ,16 ,0
'cgram posicin 0
123.
LCDOUT 254,72, 0 ,16 ,16, 16 ,16 ,16 ,16 ,0
'cgram posicin 1
124.
LCDOUT 254,80, 0 ,20 ,20, 20 ,20 ,20 ,20 ,0
'cgram posicin 2
125.
LCDOUT 254,88, 0 ,20 ,20, 20 ,20 ,20 ,20 ,0
'cgram posicin 3
126.
LCDOUT 254,96, 0 ,21 ,21, 21 ,21 ,21 ,21 ,0
'cgram posicin 4

127.
PAUSE 300
128.
GOTO BARRA
129.
130.
'*******************************************************************************
131.
' VU Line style 5 (graphic bitmaps)
132. GRAF5:
133.
MARCA2 = 5
134.
LCDOUT 254,64, 0 ,0 ,0, 4 ,0 ,0 ,0 ,0
'cgram posicin 0
135.
LCDOUT 254,72, 0 ,0 ,4, 14 ,4 ,0 ,0 ,0
'cgram posicin 1
136.
LCDOUT 254,80, 0 ,0 ,14, 14 ,14 ,0 ,0 ,0
'cgram posicin 2
137.
LCDOUT 254,88, 0 ,4 ,14, 31 ,14 ,4 ,0 ,0
'cgram posicin 3
138.
LCDOUT 254,96, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0
'cgram posicin 4
139.
PAUSE 300
140.
GOTO BARRA
141.
142.
'*******************************************************************************
143.
' VU Line style 5 (graphic bitmaps)
144. GRAF6:
145.
MARCA2 = 6
146.
LCDOUT 254,64, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0
'cgram posicin 0
147.
LCDOUT 254,72, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0
'cgram posicin 1
148.
LCDOUT 254,80, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0
'cgram posicin 2
149.
LCDOUT 254,88, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0
'cgram posicin 3
150.
LCDOUT 254,96, 0 ,0 ,0, 31 ,0 ,0 ,0 ,0
'cgram posicin 4
151.
PAUSE 300
152.
153.
'*******************************************************************************
154.
' Read ADC input
155. BARRA:
156.
IF MARCA1 = 1 THEN
'Si es verdadero
157.
LINEA = $2
'1Linea LCD, muestra canal L
158.
ADCIN 7, CANAL
159.
MARCA1 = 0
160.
ELSE
'Si no lo es
161.
LINEA = $c0
'2Linea LCD, muestra canal R
162.
ADCIN 6, CANAL
163.
MARCA1 = 1
164.
ENDIF
'Fin de la comparacin
165.
166.
'*******************************************************************************
167.
' Remainder of DIV5 --> nro of pixels columns of last char in VU graph
168.
RESTO = (CANAL // 5)
'Operacin rest de la divisin
169.
LCDOUT $FE, LINEA
'Inicia la escritura en el LCD
170.
FOR CONTADOR = 1 TO (CANAL / 5)
'Cuenta hacia delante
171.
LCDOUT 4
'Imprime cgram posicin 4
172.
NEXT CONTADOR
'Regresa a CONTADOR
173.
174.
' Select last character in VU graph depending on the remainder value
175.
IF RESTO = 1 THEN LCDOUT 0
'Imprime cgram posicin 0
176.
IF RESTO = 2 THEN LCDOUT 1
'Imprime cgram posicin 1
177.
IF RESTO = 3 THEN LCDOUT 2
'Imprime cgram posicin 2
178.
IF RESTO = 4 THEN LCDOUT 3
'Imprime cgram posicin 3
179.
' ??? Erase 3 full chars after VU indicator
180.
LCDOUT 20, 20, 20
'Borrado de 3 caracteres
181.
182.
'*******************************************************************************
183.
' Select graphic style (progress with push-button presses
184.
IF (PULSADOR = 1) and (MARCA2 = 6) THEN GRAF1 '1 Visualizacin
185.
IF (PULSADOR = 1) and (MARCA2 = 1) THEN GRAF2 '2 Visualizacin
186.
IF (PULSADOR = 1) and (MARCA2 = 2) THEN GRAF3 '3 Visualizacin
187.
IF (PULSADOR = 1) and (MARCA2 = 3) THEN GRAF4 '4 Visualizacin
188.
IF (PULSADOR = 1) and (MARCA2 = 4) THEN GRAF5 '5 Visualizacin

189.
190.
191.
192.
193.

IF (PULSADOR = 1) and (MARCA2 = 5) THEN GRAF6 '6 Visualizacin


'*******************************************************************************
GOTO BARRA
END

Changes TO PROGRAM:
1. added "ADCON1 = %00000001"
2. added "CANAL = CANAL * 4" in two places
you could also use 10 bit mode
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.

'*******************************************************************************
'* Archivo : VUMETER.PBP
*
'* Autor
: Sal (Alias Zaxione)
*
'* Fecha
: 08/11/2009
*
'* Versin : 1.0
*
'* Nota
: VuMeter Estreo con varias visualizaciones.
*
'* Web
: http://www.zaxione.com
*
'*******************************************************************************
DEFINE OSC 20
'Oscilador de 20 MHz
'*******************************************************************************
ADCON0 = %00000000
'Definir todos los PORTA y PORTE como analgicos
ADCON1 = %00000001
'Definir todos los PORTA y PORTE como analgicos
PAUSE 500
'Tiempo necesario para la iniciacin del LCD
DEFINE LCD_DREG PORTB 'LCD PORT para envo de datos B
DEFINE LCD_DBIT 4
'LCD utiliza los Bit inferior 0 o superior 4
DEFINE LCD_RSREG PORTB 'LCD RS en el PORTB
DEFINE LCD_RSBIT 0
'LCD RS PORTB.0
DEFINE LCD_EREG PORTB 'LCD E en el PORTB
DEFINE LCD_EBIT 1
'LCD E PORTB.1
DEFINE LCD_BITS 4
'LCD se utilizan 4 o 8 bits para datos
DEFINE LCD_LINES 2
'Numero de lineas del lcd
'*******************************************************************************
DEFINE ADC_BITS 8
'Resultado del ADC 8 o 10 bits
DEFINE ADC_CLOCK 3
'Ajuste del reloj
DEFINE ADC_SAMPLEUS 50 'Ajuste del tiempo de muestreo en microsegundos
'*******************************************************************************
CANAL
var byte
'Nombre de la variable
LINEA
VAR BYTE
'Nombre de la variable
CONTADOR VAR BYTE
'Nombre de la variable
RESTO
VAR BYTE
'Nombre de la variable
MARCA1
VAR BIT
'Nombre de la variable
MARCA2
var byte
'Nombre de la variable
PULSADOR var PORTB.2
'Pulsador en el PORTB.2
'*******************************************************************************
LCDOUT 254, 64, 1 ,2 ,5, 5 ,5 ,5 ,2 ,1
'cgram posicin 0
LCDOUT 254, 72, 24 ,4 ,26, 2 ,2 ,26 ,4 ,24
'cgram posicin 1
LCDOUT $FE, 1
'Borrado de la pantalla
FOR CONTADOR = 144 TO 130 STEP -1
'Cuenta atras
LCDOUT $FE, CONTADOR, 20, 0, 1, "Zaxione "
'Imprimir en pantalla
PAUSE 150
'Pausa de 0,15 segundos
NEXT CONTADOR
'Regresa a CONTADOR
PAUSE 2000
'Pausa de 2 segundos
FOR CONTADOR = 130 TO 144
'Cuenta hacia delante
LCDOUT $FE, CONTADOR, 20, 0, 1, "Zaxione "
'Imprimir en pantalla
PAUSE 150
'Pausa de 0,15 segundos
NEXT CONTADOR
'Regresa a CONTADOR
LCDOUT $FE, 1
'Borrado de la pantalla
'*******************************************************************************

49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.

GRAF1:
MARCA2 = 1
lcdout 254,64, 0 ,16 ,16, 16 ,16 ,16 ,16 ,0 'cgram posicin 0
lcdout 254,72, 0 ,24 ,24, 24 ,24 ,24 ,24 ,0 'cgram posicin 1
lcdout 254,80, 0 ,28 ,28, 28 ,28 ,28 ,28 ,0 'cgram posicin 2
lcdout 254,88, 0 ,30 ,30, 30 ,30 ,30 ,30 ,0 'cgram posicin 3
lcdout 254,96, 0 ,31 ,31, 31 ,31 ,31 ,31 ,0 'cgram posicin 4
pause 300
goto barrA
'*******************************************************************************
GRAF2:
MARCA2 = 2
lcdout 254,64, 0 ,24 ,24, 24 ,24 ,24 ,24 ,0 'cgram posicin 0
lcdout 254,72, 0 ,24 ,24, 24 ,24 ,24 ,24 ,0 'cgram posicin 1
lcdout 254,80, 0 ,27 ,27, 27 ,27 ,27 ,27 ,0 'cgram posicin 2
lcdout 254,88, 0 ,27 ,27, 27 ,27 ,27 ,27 ,0 'cgram posicin 3
lcdout 254,96, 0 ,27 ,27, 27 ,27 ,27 ,27 ,0 'cgram posicin 4
pause 300
goto BARRA
'*******************************************************************************
GRAF3:
MARCA2 = 3
lcdout 254,64, 0 ,0 ,0, 16 ,16 ,0 ,0 ,0
'cgram posicin 0
lcdout 254,72, 0 ,0 ,0, 24 ,24 ,0 ,0 ,0
'cgram posicin 1
lcdout 254,80, 0 ,0 ,0, 28 ,28 ,0 ,0 ,0
'cgram posicin 2
lcdout 254,88, 0 ,0 ,0, 30 ,30 ,0 ,0 ,0
'cgram posicin 3
lcdout 254,96, 0 ,0 ,0, 31 ,31 ,0 ,0 ,0
'cgram posicin 4
pause 300
goto BARRA
'*******************************************************************************
GRAF4:
MARCA2 = 4
lcdout 254,64, 0 ,16 ,16, 16 ,16 ,16 ,16 ,0 'cgram posicin 0
lcdout 254,72, 0 ,16 ,16, 16 ,16 ,16 ,16 ,0 'cgram posicin 1
lcdout 254,80, 0 ,20 ,20, 20 ,20 ,20 ,20 ,0 'cgram posicin 2
lcdout 254,88, 0 ,20 ,20, 20 ,20 ,20 ,20 ,0 'cgram posicin 3
lcdout 254,96, 0 ,21 ,21, 21 ,21 ,21 ,21 ,0 'cgram posicin 4
pause 300
GOTO BARRA
'*******************************************************************************
GRAF5:
MARCA2 = 5
lcdout 254,64, 0 ,0 ,0, 4 ,0 ,0 ,0 ,0
'cgram posicin 0
lcdout 254,72, 0 ,0 ,4, 14 ,4 ,0 ,0 ,0
'cgram posicin 1
lcdout 254,80, 0 ,0 ,14, 14 ,14 ,0 ,0 ,0
'cgram posicin 2
lcdout 254,88, 0 ,4 ,14, 31 ,14 ,4 ,0 ,0
'cgram posicin 3
lcdout 254,96, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0 'cgram posicin 4
pause 300
GOTO BARRA
'*******************************************************************************
GRAF6:
MARCA2 = 6
lcdout 254,64, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0 'cgram posicin 0
lcdout 254,72, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0 'cgram posicin 1
lcdout 254,80, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0 'cgram posicin 2
lcdout 254,88, 0 ,14 ,31, 31 ,31 ,14 ,0 ,0 'cgram posicin 3
lcdout 254,96, 0 ,0 ,0, 31 ,0 ,0 ,0 ,0
'cgram posicin 4
pause 300
'*******************************************************************************
BARRA:
IF MARCA1 = 1 THEN
'Si es verdadero
LINEA = $2
ADCIN 7, CANAL
CANAL = CANAL * 4
MARCA1 = 0
'1Linea LCD, muestra canal L
ELSE
'Si no lo es
LINEA = $c0
ADCIN 6, CANAL

117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.

CANAL = CANAL * 4
MARCA1 = 1
'2Linea LCD, muestra canal R
ENDIF
'Fin de la comparacin
'*******************************************************************************
RESTO = (CANAL // 5)
'Operacin rest de la divisin
LCDOUT $FE, LINEA
'Inicia la escritura en el LCD
FOR CONTADOR = 1 TO (CANAL / 5)
'Cuenta hacia delante
LCDOUT 4
'Imprime cgram posicin 4
NEXT CONTADOR
'Regresa a CONTADOR
IF RESTO = 1 THEN LCDOUT 0
'Imprime cgram posicin 0
IF RESTO = 2 THEN LCDOUT 1
'Imprime cgram posicin 1
IF RESTO = 3 THEN LCDOUT 2
'Imprime cgram posicin 2
IF RESTO = 4 THEN LCDOUT 3
'Imprime cgram posicin 3
LCDOUT 20, 20, 20
'Borrado de 3 caracteres
'*******************************************************************************
IF (PULSADOR = 1) and (MARCA2 = 6) THEN GRAF1 '1 Visualizacin
IF (PULSADOR = 1) and (MARCA2 = 1) THEN GRAF2 '2 Visualizacin
IF (PULSADOR = 1) and (MARCA2 = 2) THEN GRAF3 '3 Visualizacin
IF (PULSADOR = 1) and (MARCA2 = 3) THEN GRAF4 '4 Visualizacin
IF (PULSADOR = 1) and (MARCA2 = 4) THEN GRAF5 '5 Visualizacin
IF (PULSADOR = 1) and (MARCA2 = 5) THEN GRAF6 '6 Visualizacin
'*******************************************************************************
GOTO BARRA
END

'Programa 7_2.bsp

'Este programa tiene por objetivo mostrar como configurar en los


distintos modos de
'operacin de la pantalla LCD
'============================================================================
=======
'{$STAMP BS2p}
'{$PBASIC 2.5}
'________________________________________________________________________________
___
'Declaracin de Variables y Constantes
BorrarLCD CON %00000001 'Limpiar pantalla, $FE,1
MoverCrsr CON %10000000 'Posicionar el cursor, $FE,$80
Despertar CON %00110000 'Despertar al LCD, $FE, $30
Modo4bits CON %00100000 'Modo de 4 bits de datos,$FE,$20
Modo2linea CON %00101000 'Modo de 2 lneas, tamao de 5x8 (%00101100 5x10), $FE,$28
LCDOFF CON %00001000 'Apagar la pantalla, $FE,$08
LCDON CON %00001100 'Encender, sin cursor la pantalla, $FE,$0C
LCDONCrsr CON %00001110 'Encender, con cursor la pantalla, $FE,$0E
LCDONCrsrParp CON %00001111 'Encender, con cursor la pantalla, $FE,$0F
LCDONParp CON %00001101 'Encender, sin cursor la pantalla, $FE, $0D
IncrCrsr CON %00000110 'Auto-incremento del cursor, $FE,$06
Moverpizq CON %00011000 'Desplazar pantalla a la izquierda, $FE,$18
Moverpder CON %00011100 'Desplazar pantalla a la derecha, $FE, $1C
Movercizq CON %00010000 'Desplazar cursor a la izquierda, $FE, $10
Movercder CON %00010100 'Desplazar cursor a la derecha, $FE,$14
Linea2 CON %11000000 'Ir a la lnea inferior de la pantalla, $FE,$C0
LCDpin CON 0 'Terminal Enable de la LCD

Pulset1 VAR Byte 'Espacio de trabajo del pulsador 1


Pulset2 VAR Byte 'Espacio de trabajo del pulsador 2
Pulset3 VAR Byte 'Espacio de trabajo del pulsador 3
Pulset4 VAR Byte 'Espacio de trabajo del pulsador 4
S1 PIN 8 'Pulsador PB1
S2 PIN 9 'Pulsador PB2
S3 PIN 10 'Pulsador PB3
S4 PIN 11 'Pulsador PB4
x VAR Byte 'Variable de uso general

'Programa Principal:
Inicio:
GOSUB IniLcd
Menu:
LCDCMD LCDpin,LCDON 'Configuracin Inicial
LCDOUT LCDpin,MoverCrsr,["PROGRAMA 7_2.bsp"]
LCDOUT LCDpin,Linea2,["PB1 = CONTINUAR"]
NPS1:
BUTTON S1,0,255,0,pulset1,0,NPS1 'Espera hasta que PB1 sea presionado
PAUSE 100
LCDCMD LCDpin,BorrarLCD 'Limpiar la pantalla
LCDOUT LCDpin,MoverCrsr,["1-SCur 2-CCur"] 'Permite desplegar el
LCDOUT LCDpin,Linea2,["3-SCurB 4-CCurB"] 'siguiente men de opciones
DO
BUTTON S1,0,255,0,pulset1,1,SinCrsr 'Si PB1 fue presionado => Sin Cursor
BUTTON S2,0,255,0,pulset2,1,ConCrsr 'Si PB2 fue presionado => Con Cursor
BUTTON S3,0,255,0,pulset3,1,SinCrsrPar 'Si PB3 fue presionado => Con Parpadeo
BUTTON S4,0,255,0,pulset3,1,ConCrsrPar 'Si PB4 fue presionado => Sin Parpadeo
LOOP
SinCrsr:
LCDCMD LCDpin,LCDOFF 'Apagar pantalla
LCDCMD LCDpin,LCDON 'Encender la pantalla sin cursor
GOSUB Efectos 'Llamar a la subrutina Efectos
GOTO Menu
ConCrsr:
LCDCMD LCDpin,LCDOFF 'Apagar pantalla
LCDCMD LCDpin,LCDONCrsr 'Encender pantalla con cursor
GOSUB Efectos 'Llamar a la subrutina Efectos
GOTO Menu
SinCrsrPar:
LCDCMD LCDpin,LCDOFF 'Apagar pantalla
LCDCMD LCDpin,LCDONParp 'Encender pantalla con parpadeo activo,
GOSUB Efectos 'sin cursor
GOTO Menu
ConCrsrPar:
LCDCMD LCDpin,LCDOFF 'Apagar pantalla
LCDCMD LCDpin,LCDONCrsrParp 'Encender pantalla con parpadeo activo,

GOSUB Efectos 'con cursor


GOTO Menu

'Programa 7_3.bsp
'Este programa tiene por objetivo mostrar:
'1) El uso de los comandos LCDCMD y LCDOUT para enviar comandos y
mensajes al LCD
'2) El uso del comando LCDIN para leer informacin de la memoria
DDRAM
'2) El uso de los comandos LOOKUP Y LOOKDOWN

'=======================================================================
============

'{$STAMP BS2p}
'{$PBASIC 2.5}
'________________________________________________________________________________
___
'Declaracin de Variables y Constantes
BorrarLCD CON %00000001 'Limpiar pantalla, $FE,1
MoverCrsr CON %10000000 'Posicionar el cursor, $FE,$80
Despertar CON %00110000 'Despertar,$FE,$30
Modo4bits CON %00100000 'Modo de 4 bits de datos, $FE,$20
Modo2linea CON %00101000 'Modo de 2 lneas, tamao de 5x8, $FE,$28
LCDOFF CON %00001000 'Apagar la pantalla, $FE, $08
LCDON CON %00001100 'Encender, con cursor la pantalla,$FE,$1C
IncrCrsr CON %00000110 'Auto-incremento del cursor,$FE,$06
InicioLCD CON %00000010 'Posicin inicial del LCD,$FE,$02
LCDONCrsr CON %00001110 'Encender, con cursor la pantalla,$FE,$0E

;Programa para variar la velocidad de un motor DC


botsubir VAR portb.1 ;nombre para el pin B.1
botbajar VAR portb.2 ;nombre para el pin B.2
LED VAR portb.3 ;nombre para el pin B.3
FREC VAR BYTE ;variable FREC tamao 255
bandera VAR BIT ;variable bandera de 1 bit
FREC = 125 ;valor inicial para variable FREC
HIGH LED ;encender led para saber si arranc
PAUSE 500 ;por medio segundo
LOW LED ;apagar el led
PROG:
PWM PORTB.0,FREC,30 ;sacar PWM 30 ciclos de 125 seal til
LOW LED ;apagar el led
IF botsubir =0 THEN SUBIR ;si se pulsa el botn S ir a subir
IF botbajar =0 THEN BAJAR ;si se pulsa el botn B ir a bajar
bandera =0 ;bandera cargado con cero
GOTO PROG
SUBIR:
IF FREC > 249 THEN aviso ;si supera a 249 ir a aviso
IF bandera = 1 THEN prog ;si la bandera esta en 1 salir
HIGH LED ;encender el led
bandera=1 ;cargar la bandera con uno
FREC = FREC +25 ;sumar 25 a la variable FREC
GOTO PROG ;ir a prog
BAJAR:
IF FREC < 26 THEN aviso ;si baja de 26 ir a aviso
IF bandera = 1 THEN prog ;si la bandera esta en 1 salir
HIGH LED ;encender el led
bandera=1 ;cargar la bandera con uno
FREC = FREC-25 ;restar 25 a la variable FREC
GOTO PROG ;ir a prog
aviso:
HIGH LED ;encender el led
GOTO PROG ;ir a prog
END

;Programa para un controlde temperatura con LM35


DefineLCD_DREGPORTB ;bit de datos del LCD empezando
DefineLCD_DBIT0 ;por B.0 ,B.1, B.2 y B.3
DefineLCD_RSREGPORTB ;bit de registro del LCD conectar
DefineLCD_RSBIT5 ;en el puerto B.5
DefineLCD_EREGPORTB ;bit de Enable conectar en el
DefineLCD_EBIT4 ;puerto B.4
DefineADC_BITS8 ;Fije nmero de BITS del resultado (5,8,10)
DefineADC_CLOCK3 ;Fije EL CLOCK (rc = 3
DefineADC_SAMPLEUS 50 ;Fije el tiempode muestreo en Us;
ADC_SAMPLEUS es el nmero de microsegundos que el programa espera;entre fijar el canal y comenzar
la conversin analogica/digital.
TRISA =%1 ;el puerto A es de entrada
ADCON1 = %00001110 ;el puerto A.0 es conversorlos dems Digitales
datovarBYTE;crear variable dato para guardar
tempbaj var byte
tempalt var byte
x var byte
releF var portD.2 ;nombres para los pines
releC var portD.3
led var portD.4
enter var portD.5
bsubir var portD.6
bbajar var portD.7
eeprom 0,[22,26] ;contenido inicial de la EEPROM
inicio:
;3 parpadeos del led indica que funciona
for x =1 to 3
HIGH led
pause 200
low led
pause 200
next
READ 0,tempbaj ;lee la EEPROM 0 y lo guarda en tempbaj
READ 1,tempalt ;lee la EEPROM 1 y lo guarda en tempalt
sensar:
ADCIN 0, dato ;leer el canal 0 (A0) y guarde en dato
Lcdout $fe, 1 ,"T.mi T.actu T.ma" ;limpiar LCD y sacar texto
dato = dato /2 ;el dato dividir para 2
Lcdout $fe,$c6,DEC dato,"oC" ;Display el decimal de dato

Lcdout $fe,$c0,DEC tempbaj,"oC" ;Display el decimal de tempbaj


Lcdout $fe,$cc,DEC tempalt,"oC" ;Display el decimal de tempalt
for x = 1 to 50 ;repetir 50 veces
if enter =0 then grabar1a
pause 10
next
if dato < tempbaj then calentar ;si dato es<tempbaj ir a calentar
if dato > tempalt then enfriar
low releC : low releF ;apagar los 2 rels
goto sensar ;continuar sensando
calentar:
high releC :low releF
goto sensar
enfriar:
high releF : low releC
goto sensar
grabar1a:
gosub soltar
grabar1:
Lcdout $fe, 1 ,"Programar temp."
lcdout $fe,$c0,"baja= ",dec tempbaj ," oC"
pause 100
if bbajar=0 then restar1
if bsubir=0 then sumar1
if enter=0 then grabara
goto grabar1
restar1:
gosub soltar ;programa antirrebote de tecla
if tempbaj < 1 then grabar1
tempbaj= tempbaj-1
goto grabar1
sumar1:
gosub soltar
if tempbaj > 40 then grabar1
tempbaj= tempbaj + 1
goto grabar1
grabarA:
gosub soltar
write 0,tempbaj ;escribir en la direccin 0 de la EEPROM
grabar2:
Lcdout $fe, 1 ,"Programar temp."
lcdout $fe,$c0,"alta= ",dec tempalt ," oC"
pause 100
if bbajar=0 then restar2
if bsubir=0 then sumar2
if enter=0 then grabarB
goto grabar2
restar2
:gosub soltar
if tempalt < 5 then grabar2
tempalt= tempalt-1
goto grabar2
sumar2:
gosub soltar

if tempalt > 50 then grabar2


tempalt= tempalt + 1
goto grabar2
grabarB:
gosub soltar
write 1,tempalt ;escribir en la direccin 1 de la EEPROM
goto inicio
soltar:
;programa antirrebote de tecla
high led
pause 150low led
soltar2:
if bbajar=0 then soltar2
if bsubir=0 then soltar2
if enter=0 then soltar2
PAUSE 100
RETURN
END

Вам также может понравиться