Sei sulla pagina 1di 14

Manejo de un LCD

LIST P = 18F4550
INCLUDE <P18F4550.INC>
;************************************************************
CONFIG FOSC = HS
CONFIG PWRT = ON
CONFIG BOR = OFF
CONFIG WDT = OFF
CONFIG MCLRE = ON
CONFIG PBADEN = OFF
CONFIG LVP = OFF
CONFIG DEBUG = OFF
CONFIG XINST = OFF
; CODE ******************************************************
CBLOCK 0x0C
ENDC
#define LCD_RS PORTD,0
#define LCD_RW PORTD,1
#define LCD_E PORTD,2
ORG 0x00
clrf PORTB

clrf PORTD
clrf TRISB
clrf TRISD
call LCD_Inicializa
bcf LCD_E
Inicio
call Delay ;Esperar un tiempo antes de comenzar a escribir
movlw 'H'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
movlw 'l'
call LCD_Caracter
movlw 'a'
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'M'
call LCD_Caracter
movlw 'u'
call LCD_Caracter

movlw 'n'
call LCD_Caracter
movlw 'd'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
movlw '!'
call LCD_Caracter
call Delay
call Delay
call LCD_Borrar
goto Inicio
LCD_Inicializa
call Retardo_20ms ;Esperar 20 ms
movlw b'00110000' ;Mandar 0x30 -> W
movwf PORTB ;Enviar W -> PORTB
call Retardo_5ms ;Esperar 5ms
movlw b'00110000' ;Enviar 0x30 -> W
movwf PORTB
call Retardo_50us ;Acumular 100us
call Retardo_50us ;Acumular 100us

movlw b'00110000'
movwf PORTB
movlw 0x0F
movwf PORTB
bsf LCD_E
bcf LCD_E
return
LCD_Caracter
bsf LCD_RS ;Modo Caracter RS = 1
movwf PORTB ;Lo que se carg previamente en W -> PORTB
bsf LCD_E ;Activar Enable
call Retardo_50us ;Esperar 50us para enviar informacin
bcf LCD_E ;Transicin del Enable a 0
call Delay ;Esperar a poner la siguiente llamada
return
LCD_Borrar
movlw b'00000001' ;Comando para Borrar
call LCD_Comando ;Enviar un comando
LCD_Comando
bcf LCD_RS ;Modo Comando RS = 0
movwf PORTB ;Envia W -> PORTB

bsf LCD_E ;Activa Enable


call Retardo_50us ;Espera que se envie la informacin
bcf LCD_E ;Transicin del Enable
return
INCLUDE <LCD_Retardo.inc>
END ;Fin de Programa

7 segmentos
LIST P=18F4550
;Directiva para definir el procesador44. #include
<P18F4550.INC>
;Definicion de SFRs para el procesador45.
******************************************************************************47.
;Bits de Configuracion
48.;Microchip ha cambiado el formato para definir los bits de configuracion, por favo
r49.;revisar el archivo P18F4550.INC para informacion adicional de la notacin
50.;Abajo hay algunos ejemplos
51.
52.;******** Configuracion del Oscilador
53. CONFIG

FOSC = INTOSCIO_EC

**********

;Osc interno, RA6 como pin, USB usa Osc EC

54.;******** Otros bits de configuracion

**********

55.

CONFIG PWRT = ON

;PWRT habilitado

56.
57.

CONFIG BOR = OFF


CONFIG WDT = OFF

;Brown out resete deshabilitado


;Watch dog deshabilitado

58.

CONFIG MCLRE = OFF

;MCLR como entrada

59.
CONFIG PBADEN = ON
analgicas

;Todos los pines como entradas

60.
CONFIG LVP
apagado

;Programacion en bajo voltaje

= OFF

61.;********* Bits de proteccion

******************

62.
CONFIG CP0
programa

= OFF

;los bloques del codigo de

63.

CONFIG CP1

= OFF

;no estan protegidos

64.

CONFIG CP2

= OFF

65.

CONFIG CP3

= OFF

66.

CONFIG CPB

= OFF

;Sector Boot no esta protegido

67.

CONFIG CPD

= OFF

;La EEPROM no esta protegida

68.;*****************************************************************************
*69.; Definicion de variables
70.; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas.
71.; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de
72.; interrupcin
.73
. 74.

CBLOCK0x080

75.

WREG_TEMP

;variable usada para salvar contexto

76.

STATUS_TEMP

;variable usada para salvar contexto

77.

BSR_TEMP

;variable usada para salvar contexto

78.

ENDC

79.
80.

CBLOCK0x000 ;Variables en la ACCESS RAM (Banco 0) max 96 bytes

81.

Cantms:2

;variable para generar hasta 65535 ms

82.
seg83.

CantSeg
Cont

;Variable para producir retardos de hasta 255


;Variable para realizar el conteo

84.

TablaOffs

;Para movernos por la tabla

85.

ENDC

86.
87.;*****************************************************************************
*88.;Datos de la EEPROM
89.;Los Datos a ser programados en la EEPROM son definidos aqu
90.
91.

ORG

0xf00000

DE

"Test Data",0,1,2,3,4,5

92.
93.

94.
95.;*****************************************************************************
*96.; Vector de Reset.
97.; Este codigo comenzara a ejecutarse cuando suceda un reset
98.
99.

ORG

0x0000

goto

Main

100.
101.

;Se va al inicio del codigo principal

102.
103.;****************************************************************************
**104.; Vector de interrupcion de alta prioridad
105.; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
106.; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
107.; no estan habilitadas
108.
109.

ORG

0x0008

110.
111.
bra
HighInt
interrupcion de alta prioridad

;Va a la rutina de

112.
113.;****************************************************************************
**114.; Vector de interrupcion de baja prioridad y rutina
115.; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
116.; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
117.
118.

ORG

0x0018

119.
120.

movff STATUS,STATUS_TEMP

;Salva el registro STATUS

121.

movff WREG,WREG_TEMP

122.

movff BSR,BSR_TEMP

;Salva el registro de trabajo


;Salva el registro BSR

123.
124.;

*** El codigo de la interrupcion de baja prioridad va aqui ***

125.
126
. 127.

movff BSR_TEMP,BSR

128.

movff WREG_TEMP,WREG

129.

movff STATUS_TEMP,STATUS

130.

retfie

;recupera el registro BSR


;recupera el registro de trabajo
;recupera el registro STATUS

131.
132.;****************************************************************************
**133.; Rutina de interrupcion de alta prioridad
134.; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
135.; evitar conflictos con el vector de interrupciones de baja prioridad
136.
137.HighInt:
138.
139.; *** El codigo para las interrupciones de alta prioridad va aqui **
*140
. 141.

retfie FAST

142.
143.;****************************************************************************
**144.; Comienzo del programa principal
145.; El codigo del programa principal es colocado aqu
146.
147.Main:

148.;

*** EL codigo principal va aqui **

*149.
150.;******************** Inicializacion de perifericos

*********************

151.

movlw B'01100000

'152.
MHz

movwf OSCCON

153.

movlw B'00001111'

154.

movwf ADCON1,.0

;Todos los pines como I/O digitales

clrf

;Puerto D como salida

;Ajustamos el oscilador interno a 4

155.
156.

TRISD,.0

157.
como entradas

;Los demas se quedan

158.;******************** Inicializacion de Variables


159.

clrf

************************

Cont,.0

;Cont = 0

Cont,W,.0

;W = Cont, para realizar el despliegue

Conv7Seg

;realizamos la conversion de BCD a 7

160.
161.MainP0
162.
163.

movf

164. rcall
segmentos

165. movwf LATD,.0


D166. movlw .

;movemos el valor convertido al PORT

1167. movwf CantSeg


seg168. rcall RetardoSeg

;CantSeg = 1 , para el retardo de 1


;Esperamos 1 seg

169.

incf

;Cont ++

170.

movlw 0x0A

171.

cpfseq Cont,.0

Cont,F,.0

;Cont == 0x0A (Cont==WREG)?

172.

bra

173. clrf
0)174. bra

MainP0
Cont,.0

;No => continuamos en el ciclo


;Si =>

MainP0

reiniciamos la cuenta (Cont =


;Continuamos con el ciclo

175.
176.;**********************
Conv7Seg
*******************************************
177.;

Conv7Seg

Esta subrutina maneja realiza el acceso a la tabla BCD7Seg, recibe

178.;
en W un offset para que sea sumado a TBLPTRL para asi acceder
al179.; valor de 7 segmentos correspondiente al valor BCD recibido en WREG
180.
;181.; Devuelve el valor de 7 seg en el registro
W.182.;**************************************************************************
********183.Conv7Seg
184.

movwf TablaOffs,.0

185. movlw UPPER BCD7Seg


tabla186.
movwf TBLPTRU,.0
187.

movlw HIGH BCD7Seg

188.

movwf TBLPTRH,.0

;Guardamos el valor BCD recibido


;tomamos la parte mas alta de la dir de la
;y la actualizamos TBLPTRU
;tomamos la parte alta de la dir de la tabla
;y la actualizamos TBLPTRH

189. movlw LOW BCD7Seg


;tomamos la parte baja de la dir de la
tabla190.
movwf TBLPTRL,.0
;y la actualizamos TBLPTRL, Aqui
tenemos a TBLPTR191.
;apuntado
al inicio de la tabla BCD7seg192.
movf TablaOffs,W,.0
;Nos preparamos
para recorrer la tabla193.
addwf TBLPTRL,F,.0
;TBLPTR apunta al valor de
7 seg que necesitamos194.
tblrd *
;Leemos el
valor de la tabla195. movf TABLAT,W,.0
;guardamos el valor leido
en WREG196. return
;retornamos197.;***********************************************************
***********************198.
199.;**************************** RetardoSeg
**********************************
200.;

RetardoSeg

Realiza una espera de la cantidad de segundos indicados

201.;
mediante la variable CantSeg. CantSeg es de 8
bits202.;*************************************************************************
****203.RetardoSeg
204.

movf

CantSeg,W,.0

205.

btfsc

STATUS,Z

206.

return

207.

movlw 0x03

208.

movwf Cantms+1,.0

209.

movlw 0xE8

210.

movwf Cantms,.0

211.

rcall

Retardo_ms

212.

decf

CantSeg,F,.0

;CantSeg == 0?
;Si => retornamos
;No => hacemos Cantms = 1000

;realizamos un retardo de 1000 ms


;CantSeg

,213. bra
RetardoSeg
;Continuamos con el
ciclo214.;************************************************************************
*****215
. 216.;****************************
Retardo_ms
**********************************
217.;

Retardo_ms

Realiza un retardo de la cantidad de milisegundos indicados

218.;
mediante Cantms y Cantms+1, Cantms y Cantms+1 son tratados
como219.;
variables de 16
bits.220.;*************************************************************************
****221.Retardo_ms
222.

rcall

223.

decfsz Cantms,F,.0

0224. bra

Retardo1ms

;realizamos un retardo de 1 ms
;Cantms --, Cantms ==

Retardo_ms

225.

movf

Cantms+1,W,.0

226.

btfsc

STATUS,Z

227.

return

228.

decf

;no => vamos a Retardo_ms


;
;Cantms+1 == 0?
;Si => retornamos

Cantms+1,F,.0

;No => decrementamos

229.

bra
Retardo_ms
;Continuamos con el ciclo
230.;**********************************************************************
*******231.
232.;****************************
Retardo1ms
**********************************
233.;

Retardo1ms

realiza una espera de 1 ms decrementado W 249 veces en un ciclo

234.;
que ocupa 4
us235.;**************************************************************************
***236.Retardo1ms
237.

movlw

.249

238.Retardo1msP0
239.

addlw 0xFF

;W-

-240.

btfss

;W == 0?

241.

bra

STATUS,Z,.0
Retardo1msP0

;No => seguimos esperando

242.

return
;Si => ya paso 1 ms
243.;**********************************************************************
*******244
. 245.
246.

ORG

0x800

247.
248.
249.;*******************************
BCD7Seg
***********************************
250.; BCD7Seg
Es una tabla que se utiliza para convertir valores BCD a 7
Segmentos251.;252.;
|RB7|RB6|RB5|RB4 | |RB3|RB2|RB1|RB0| |253.;
|DP
|G
|F
|E
|
|D
|C
|B
|A
|Hex|254.;
|---|---|---|-------|---|---|---|---|---|255.;
0
|1
|1
|0
|0
0
|0
|0
|0
|C0
|256.; 1
|1
|1
|1
|1
1
|0
|0
|1
|F9
|257.; 2
|1
|0
|1
|0
0
|1
|0
|0 |A4 |258.; 3
|1
|0
|1
|1
|
|0
|0
|0
|B0
|259.; 4
|1
|0
|0
|1
|
|0
|0
|1
|99
|260.; 5
|1
|0
|0
|1
|

|
|
|
0
1
0

|0
|1
|0
|92
|261.; 6
|1
|0
|0
|0
|
0
|0
|1
|0
|82
|262.; 7
|1
|1
|1
|1
|
1
|0
|0
|0
|F8
|263.; 8
|1
|0
|0
|0
|
0
|0
|0
|0
|80
|264.; 9
|1
|0
|0
|1
|
0
|0
|0
|0
|90
|265.;*********************************************************************
*************266.BCD7Seg267.
;
0
1
2
3
4
5
6
7
8
9
268. DB
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90269.;**************************
********************************************************270. 271. 272.
END
;Directiva fin del programa

Potrebbero piacerti anche