TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Pepe en 13 de Diciembre de 2014, 02:19:15
-
Buenas amigos
Me encuentro realizando un proyecto con un lcd 16x2 con el pic 16f84a en ensamblador en el cual tengo cuatro pulsadores son decremento, incremento, derecha y izquierda esto para ir escribiendo letra por letra y llenar la pantalla solo de la "a" a la 'z" si alguien me puede ayudar
-
LCD y el ejemplo de Teclado Matricial ( para que veas como hacer funcionar los botones con las interrupciones de RB4 a RB7, obviamente tiene mas codigo que tendrias que sacar )
http://www.todopic.com.ar/foros/index.php?topic=858.0
Si no te manejaste nunca con interrupciones entonces te recomiendo que hagas primero lo de las mismas aprendas a usarlas, luego continuas con el LCD mostrando algo nomas y por fin uniendo ambos proyectos.
-
Buenas empece así solo con el de incrementar y después le voy agregar los demás pero tengo varias dudas
1 como hago para que empiece en a y termine en z minusculas yo lo intente con un contador pero no se si esta bien
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
Contador
ENDC
#DEFINE Incremente PORTA,4
; ZONA DE CÓDIGOS ********************************************************************
Inicio EQU 0x61
call LCD_Inicializa
bsf STATUS,RP0 ; Acceso al Banco 1.
bsf Incremente
bcf STATUS,RP0
Principal
btfsc Incremente ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Incremente ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
btfss Incremente ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin goto Principal
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------
IncrementaVisualiza
incf Contador,F ; Incrementa el contador y comprueba si ha
movlw 0x7A ; llegado a su valor máximo mediante una
subwf Contador,W
btfsc STATUS,C
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
LCD
movf Contador,W
call LCD_Caracter
return
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC> ; Subrutinas de retardo.
END ; Fin del programa.
lo probé pero no me funciona
-
en tu LCD tenes un codigo para cada caracter
(http://msnavas.files.wordpress.com/2011/01/sin-tc3adtulo1.png)
Esa es una de las tantas tablas que hay, algunos LCD tiene mas caracteres que otros, si te fijas la "a" es el 0110 0001 ( 0x61 ) y asi aumenta hasta la "z" que es 0111 1010 ( 0x7A ) asi que tu contador deberia ser desde 0x61 a 0x7A + el caracter vacio (como para borrar).
Esto esta simple si tenes 1 solo dato, pero por ejemplo si te moves a la segunda posicion y luego volves, te quedan 2 opciones para saber que habia en ese lugar (en la primera posicion).
1- Guardarla en el micro, es decir tener una "copia" de la memoria del LCD. ( Recorda que son 32 registro de 8 bits como minimo, no se si le da al 16f84 para esto )
2- Leer el LCD para saber que hay guardado en ese punto.
En el primer caso puede ser algo simple por que tu programa solo haria lo de "modificar" la memoria dentro del micro y luego cada tanto solo el micro ejecute una actualizacion del LCD en todas sus posiciones de memoria.
En el otro bueno cuando te muevas tanto para adelante o hacia atras deberias leer, montar ese valor en tu contador asi se modifica y luego escribirlo de nuevo.
---
Otra cosa, por que tenes los include debajo ? deberias tenerlo junto con el de p16f84.inc
-
Buenas gracias por la ayuda. si eso intento pero no se hacer que el contador me empiece de 0x61 y que me termine 0x7A, estoy utilizando un 16f84 A y el libro con el que estoy estudiando lo pone al final inc. y segun entiendo si yo pongo 0x61 ya me sale la a entonces no entiendo bien como guardar otra vez la tabla :(
-
borrar
gracias
-
Gracias pero 0x30 es el 0 en numero y lo que ocupo es de 'a' a la 'z'
-
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
Contador
ENDC
#DEFINE Incremente PORTA,4
; ZONA DE CÓDIGOS ********************************************************************
Inicio EQU 0x61
call LCD_Inicializa
bsf STATUS,RP0 ; Acceso al Banco 1.
bsf Incremente
bcf STATUS,RP0
Principal
btfsc Incremente ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Incremente ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
btfss Incremente ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin goto Principal
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------
IncrementaVisualiza
incf Contador,F ; Incrementa el contador y comprueba si ha
movlw 0x7A ; llegado a su valor máximo mediante una
subwf Contador,W
btfsc STATUS,C
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
LCD
movf Contador,W
call LCD_Caracter
return
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC> ; Subrutinas de retardo.
END ; Fin del programa.
Voy a decirte algunas cosas que estan mal/ o me parecen mal.
bsf STATUS,RP0 ; Acceso al Banco 1.
bsf Incremente
bcf STATUS,RP0
Esta mal eso, acordate que el PORTA se encuentra en el banco 0, no se por que estas accediendo al banco 1. Ademas de intentar poner un 1 en una entrada.
Principal
btfsc Incremente ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Incremente ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza
..........
..........
Fin goto Principal
Directamente pones goto Principal y listo no haces 2 saltos. Lo mismo con el otro goto Fin.
IncrementaVisualiza
incf Contador,F ; Incrementa el contador y comprueba si ha
movlw 0x7A ; llegado a su valor máximo mediante una
subwf Contador,W
btfsc STATUS,C
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
LCD
movf Contador,W
call LCD_Caracter
return
Contador tiene un valor que desconosco por que jamas se le asigno ningun valor a ese registro. Por lo que deberias al comienzo de tu programa ( cuando definis tus TRIS, INTCON, etc) poner el contador con un valor 0x61
MOVLW 0x61
MOVWF Contador
Luego ahora si dentro de la funcion no deberias de limpiarlo con el CLRF ya que estarias borrando todo, es decir poniendo a 0. Por lo que deberias reemplazar ese CLRF por lo mismo que pase antes, asi cuando sobrepasa el 0x7A el valor queda en 0x61.
Finalmente no encuentro donde definis tus TRIS no se si LCD_4BIT.inc ya los define y los usa. Pero al menos en tu codigo no lo veo. Y esto esta realizado sin interrupciones que obviamente lo podes hacer tranquilamente de esa forma (pero soy un fanatico de las mismas), y tambien te hubieras ahorrado codigo si tuvieras antirebote en hardware.
-
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
Contador
ENDC
#DEFINE Incremente PORTA,4
#DEFINE Decremente PORTA,3
#DEFINE Derecha PORTA,2
#DEFINE Izquierda PORTA,1
; ZONA DE CÓDIGOS ********************************************************************
Inicio
call LCD_Inicializa
bsf STATUS,RP0
bsf Incremente
bsf Decremente
bsf Derecha
bsf Izquierda
bcf STATUS,RP0
movlw 0X61
movwf Contador
CALL LCD_LINEA1
Principal
btfsc Incremente ; ¿Incremente presionado?, ¿(Incremente)=0?
goto FinIncremente ; No. Lee el siguiente.
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Incremente ; Comprueba si es un rebote.
goto FinIncremente ; Era un rebote y sale fuera.
goto SePulsoIncremente
FinIncremente
btfsc Decremente ; ¿Decremente presionado?, ¿(Decremente)=0?
goto FinDecremente ; No. Lee el siguiente.
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Decremente ; Comprueba si es un rebote.
goto FinDecremente ; Era un rebote y sale fuera.
goto SePulsoDecremente;
FinDecremente
btfsc Derecha
goto FinDerecha
call Retardo_20ms
btfsc Derecha
goto FinDerecha
goto SePulsoDerecha
FinDerecha
btfsc Izquierda
goto Principal
call Retardo_20ms
btfsc Izquierda
goto SePulsoIzquierda
SePulsoIncremente
incf Contador,F ; Al valor de contador se le suma 1 y lo guarda en sí mismo.
movlw 0x7B
subwf Contador,W
btfsc STATUS,C
Incializar Contador
movlw 0X61
movwf Contador
call LCD_Caracter ; Llama a esta subrutina de la librería para que muestre Caracter con su nuevo valor.
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC> ; Subrutinas de retardo.
END ; Fin del programa.
Buenas ahora esta asi me falta el resto de los pulsadores sepulso..... pero quiero saber si el reset del contador esta bien asíy si se mostraria
-
incf Contador,F ; Al valor de contador se le suma 1 y lo guarda en sí mismo.
goto Prueba
Prueba
movlw 0x7B
subwf Contador,W
btfsc STATUS,Z
goto InicializarContador
call LCD_Caracter
IncializarContador
movlw 0X61
movwf Contador
SePulsoDecremente
decf Contador,F
goto Prueba
Prueba
movlw 0x60
subwf Contador,W
btfsc STATUS,C
Inicializar Contador
movlw 0x7B
movwf Contador
call LCD_Caracter
Bueno lo cambie asi y agrege decremente
-
bueno tambien cambie decremento muy parecido a incremento pero como hago para pasar a la derecha y izquierda??? :(
-
exactamente no se cuales son las funciones en LCD_4bits.inc
Pero sino me equivoco deberias usar LCD_EnviaComando
Donde el comando se almacena en W.
Para setear la posicion de la DDRAM se usa el comando
"1AAAAAAA" Donde A es la direccion.
La primer linea comienza en 00h y terminaria en 0Fh
La segunda linea comenzaria en 40h y terminaria en 4Fh
Aca tenes el datasheet del controlador del LCD: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Ahi en la pagina 24 tenes todos los comandos.
en fin si quisieras ir a la cuarta columna de la primer fila entonces deberias cargar en W: 0x04 y usar LCD_EnviaComando
Inicializar Contador
movlw 0x7B
movwf Contador
call LCD_Caracter
Deberias poner 0x7A en esa parte del decrementar sino estarias mandando un "{" y no una "z"
Y perdon en el primer post yo puse sobre el teclado y el lcd y pense que habia copiado el siguiente link:
http://www.todopic.com.ar/foros/index.php?topic=24720.0
Pero termine copiando otro :/
-
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
Contador
ENDC
#DEFINE Incremente PORTA,4
#DEFINE Decremente PORTA,3
#DEFINE Derecha PORTA,2
#DEFINE Izquierda PORTA,1
; ZONA DE CÓDIGOS ********************************************************************
Inicio
call LCD_Inicializa
bsf STATUS,RP0
bsf Incremente
bsf Decremente
bsf Derecha
bsf Izquierda
bcf STATUS,RP0
movlw 0X61
movwf Contador
Principal
btfsc Incremente
goto FinIncremente
call Retardo_20ms
btfsc Incremente
goto FinIncremente
goto SePulsoIncremente
FinIncremente
btfsc Decremente
goto FinDecremente
call Retardo_20ms
btfsc Decremente
goto FinDecremente
goto SePulsoDecremente
FinDecremente
btfsc Derecha
goto FinDerecha
call Retardo_20ms
btfsc Derecha
goto FinDerecha
goto SePulsoDerecha
FinDerecha
btfsc Izquierda
goto Principal
call Retardo_20ms
btfsc Izquierda
goto SePulsoIzquierda
SePulsoIncremente
incf Contador,F
goto Prueba
Prueba
movlw 0x7B
subwf Contador,W
btfsc STATUS,Z
goto InicializarContador
call LCD_Caracter
IncializarContador
movlw 0X61
movwf Contador
SePulsoDecremente
decf Contador,F
goto Prueba2
Prueba2
movlw 0x60
subwf Contador,W
btfsc STATUS,Z
call LCD_Caracter
Inicializar Contador
movlw 0x7B
movwf Contador
SePulsoDerecha
incf Contador,F
goto Prueba3
Prueba3
movlw 0x00
subwf Contador,W
btfsc STATUS,Z
call LCD_posicionlinea1
Inicializar Contador
movlw 0x4F
movwf Contador
SePulsoIzquierda
decf Contador,F
goto Prueba4
Prueba4
movlw 0x4F
subwf Contador,W
btfsc STATUS,Z
call LCD_posicionlinea1
Inicializar Contador
movlw 0x00
movwf Contador
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END
esta librerias las tome de Microcontrolador Pic 16f84 de la editorial Alfaomega
-
SePulsoDerecha
incf Contador,F
goto Prueba3
Prueba3
movlw 0x00
subwf Contador,W
btfsc STATUS,Z
call LCD_posicionlinea1
Inicializar Contador
movlw 0x4F
movwf Contador
SePulsoIzquierda
decf Contador,F
goto Prueba4
Prueba4
movlw 0x4F
subwf Contador,W
btfsc STATUS,Z
call LCD_posicionlinea1
Inicializar Contador
movlw 0x00
movwf Contador
No deberias usar la variable contador. Deberias tener otra variable para la posicion.
Como dije de 0x00 a 0x0F es 1era linea si aumentas uno mas pasarias a 0x10 pero tendrias que modificarlo ya que la segunda linea comienza con 0x40
Pienso que podes hacerlo de 2 formas:
Tener 2 variables: Fila y Columna
De esa manera aumentas y decrementas Columna y luego revisas, si se paso de 0x00 o si supero a 0x0F para sumar o restar a fila
Y luego para formar la direccion es ( Fila * 0x40 ) + Columna . Donde Fila vale 0 y 1.
La otra que se me ocurre es implementar solo una variable: Posicion
limitas tu derecha e izquierda de 0x00 a 0x1F Y pones a 0 o a 1 el bit5 de Posicion si se supera cualquiera de los limites. Te haces una funcion que envie la direccion, en esa funcion harias algo asi
Bit5 de Posicion = 1 ? SI: Posicion XOR 0x50 -> W
NO: Posicion -> W
Envio
Vuelvo
Y faltaria algo aca ( lo pongo en negrita):
btfsc Izquierda
goto SePulsoIzquierda
goto Principal
SePulsoIncremente
incf Contador,F
Otra cosa que esta haciendo no se por que es ese salto sin sentido, en casi todos:
SePulsoIzquierda
decf Contador,F
goto Prueba4
Prueba4
Y los call serian a esta funcion: LCD_EnviaComando
Cuando pongas un codigo ponelo dentro de (code) (/code ) con corchetes [ ], es el que aparece como signo numeral en el foro.
A todo esto.... lo estas simulando o probando en una placa ?
-
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
Contador
Cursor
ENDC
#DEFINE Incremente PORTB,0
#DEFINE Decremente PORTB,1
#DEFINE Derecha PORTB,2
#DEFINE Izquierda PORTB,3
; ZONA DE CÓDIGOS ********************************************************************
Inicio
call LCD_Inicializa
bsf STATUS,RP0
bsf Incremente
bsf Decremente
bsf Derecha
bsf Izquierda
bcf STATUS,RP0
movlw 0X61
movwf Contador
Principal
btfsc Incremente
goto FinIncremente
call Retardo_20ms
btfsc Incremente
goto FinIncremente
goto SePulsoIncremente
FinIncremente
btfsc Decremente
goto FinDecremente
call Retardo_20ms
btfsc Decremente
goto FinDecremente
goto SePulsoDecremente
FinDecremente
btfsc Derecha
goto FinDerecha
call Retardo_20ms
btfsc Derecha
goto FinDerecha
goto SePulsoDerecha
FinDerecha
btfsc Izquierda
goto Principal
call Retardo_20ms
btfsc Izquierda
goto Principal
goto SePulsoIzquierda
SePulsoIncremente
incf Contador,F
movlw 0x7B
subwf Contador,W
btfsc STATUS,Z
goto InicializarContador1
movlw Caracter
call LCD_Caracter
goto Principal
InicializarContador1
movlw 0X61
movwf Contador
movwf Caracter ;/este tambien lo tengo que cargar caracter para que lo muestre
call LCD_Caracter
goto Principal
SePulsoDecremente
decf Contador,F
movlw 0x60
subwf Contador,W
btfsc STATUS,Z
goto InicializarContador2
movlw Caracter
call LCD_Caracter
goto Principal
InicializarContador2
movlw 0x7A
movwf Contador
movwf Caracter
call LCD_Caracter
goto Principal
SePulsoDerecha
incf Cursor,F ;Por qué si uno se mueve a la derecha incrementa el caracter que se ve?
movlw 0X10
subwf Cursor,W
btfsc STATUS,Z
goto MuestraLinea1
movlw 0X00
goto MuestraLinea1
SePulsoIzquierda
decf Cursor,F
movlw 0xFF
subwf Cursor,W
btfsc STATUS,Z
goto MuestraLinea1
movlw 0x0F
goto MuestraLinea1
MuestraLinea1
movfw Cursor
call LCD_PosicionLinea1
movfw Caracter
call LCD_Caracter
goto Principal
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END
Es para simular en proteus
-
Te pongo lo que estas haciendo mal y el por que, aunque ya tendrias que dar cuenta
Tu codigo solo funciona para una linea.
SePulsoDerecha
incf Cursor,F
movlw 0X10 ; Esto lo podes resumir preguntando si BTFSC o BTFSS Cursor,4
subwf Cursor,W
btfsc STATUS,Z
goto MuestraLinea1 ; Antes de enviar el comando deberias poner en 0x0F Cursor o hacele un decrementar. POr que estas mandando 0x10
movlw 0X00
goto MuestraLinea1
SePulsoIzquierda
decf Cursor,F
movlw 0xFF ; lo mismo que arriba si en realidad limitas los valores entonces con BTFSS / BTFSC Cursor,4 5 6 o 7 estaria
subwf Cursor,W
btfsc STATUS,Z
goto MuestraLinea1 ; lo mismo que arriba, estas enviando 0xFF cuando deberias enviar un 0x00
movlw 0x0F
goto MuestraLinea1
MuestraLinea1
movfw Cursor
call LCD_PosicionLinea1 ; lo repito creo que por 3ra ves, no tenes que llamar a esa funcion, tenes que llamar a otra, por que esa funcion siempre te posiciona en la primer posicion por mas valor que tengas de Cursor.
movfw Caracter
call LCD_Caracter ; Esto quiere decir que se va a copiar el mismo valor que antes.
goto Principal
Y todavia no resolviste el problema de como guardas los valores o de leerlos.