Autor Tema: pequeños proyectos  (Leído 55104 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
pequeños proyectos
« en: 10 de Enero de 2009, 22:47:46 »
hola,queria abrir este tema para publicar pequeños proyectos en asm.muy basicos pero de gran ayuda.
para  hacer funcionar los diferentes modulos integrados en nuestros PICs.sin extendernos en amplios programas que complicarian
el entendimiento de las funciones de estos modulos.

y si hubiera algun error agradeceria me lo indicasen para corregirlo.
« Última modificación: 11 de Enero de 2009, 14:11:58 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #1 en: 10 de Enero de 2009, 22:57:33 »
en este programa,se visualizara por el puerto B. el dato que se reciva por el pin Rx de la usart del pic 16f876.

como practica principal he usado el hiperterminal de windows.que conectando un conversor USB-RS232 con una conexion a 9600 bps.
y culla señal tx.se ha conectado a un adaptador de señales con un MAX232.y de este a la usart del pic(RC7  pin rx)





;****************************************** http://www.ingeniopic.com *******
; PROGRAMA : usart_rx.asm
; Funcion : visualizar datos recividos de la usart por el puerto B.
;           Serial port config: 9600 baudios,8 bits,paridad = none
;   
;  Revision : 1.0        6/1/2009            Programa para : PIC16F876
; CPU Clock : 4 MHz                      Reloj instruccion : 4 MHz = 0.25 us
;       WDT : Deshabilitado                  Tipo de reloj : XT 
; Code Prot : OFF                        velocidad usart: 9.600 Kbps
;****************************************** http://www.ingeniopic.com *******

            LIST   P=16F876         ;Se indica el modo de procesador
     
            RADIX   HEX            ;Sistema de numeracion hexadecimal

            INCLUDE   <P16f876.inc>  ;se incluye la definicion de los registros
               ;registros internos
            __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
            ERRORLEVEL      -302     ;para que no se notifiquen los errires por los registros fuera del banco de ram.
                 
BANK0         MACRO               ;macro para la seleccion del banco 0
            BCF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

BANK1         MACRO               ;macro para la seleccion del banco 1
            BSF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
            ORG   0x00            ;Inicio en el Vector de Reset
     
            goto   INICIO            ;Va a la primera instruccion del programa
               
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>

            ORG   0x04            ;Vector de interrupcion

           goto   INTER         ;salta a la linea INTER

;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO      BANK1
            clrf   TRISB            ;Puerto B como salida
            bsf    TRISC,7      ;RC7/Rx como entrada 
            movlw   .25            ;valor para seleccionar 9600 baudios
            movwf   SPBRG
            movlw   b'00100100'      ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
            movwf   TXSTA            ;carga valor anterior en registro asociado al generador del baud rate
            bsf     PIE1,RCIE      ;Habilitacion interrupcion RX
           BANK0               ;Cambio al banco 0
            movlw   b'10010000'      ;Configuracion de la usart
            movwf   RCSTA            ;para recepcion continua y habilitacion de la usart
            movlw   b'11000000'      ;Habilitacion para las
            movwf   INTCON         ;interrupciones generales
            clrf      PORTB         ;borra las salidas del puerto b
;<<<<<<<<-----------------------------PROGRAMA PRINCIPAL--------------------------->>>>>>>>>>>>>>>>>>>>>>>>     
           
BUCLE         goto      BUCLE            ;espera aqui hasta que salte la interuupcion.




;<<<<<<<<-------------------COMPROVACION DE TIPO DE INTERRUPCION------------>>>>>>>>>>>>>>
   
INTER         BANK0
            btfss   PIR1,RCIF      ;comprueba si el shift register(RSR)esta lleno.y si es asi salta
            retfie               ;retorno de interrupcion si no se ha dado la circunstancia anterior
            
;<<<<<<<<-------------------------VISUALIZACION DE DATO RECIVIDO------------>>>>>>>>>>>>>>
         
LEEDATO     movf      RCREG,W         ;Lectura dato recibido
           movwf   PORTB            ;Visualiza dato recibido
            retfie                  ;retorna de la interrupcion.
     
           END 
« Última modificación: 11 de Enero de 2009, 14:09:09 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #2 en: 11 de Enero de 2009, 13:30:03 »
en este programa se transmite por el pin Tx de la usart del pic 16f876 el dato que metamos en el puerto A.

igual que en el caso anterior he usado el hiperterminal de windows ,el conversor y el adaptador de señales.




;****************************************** http://www.ingeniopic.com *******
; PROGRAMA : usart_tx.asm
; Funcion : transmitir el valor del puerto A.por la usart interna del pic.
;           Serial port config: 9600 baudios,8 bits,paridad = none
;   
;  Revision : 1.0       11/1/2009            Programa para : PIC16F876
; CPU Clock : 4 MHz                      Reloj instruccion : 4 MHz = 0.25 us
;       WDT : Deshabilitado                  Tipo de reloj : XT 
; Code Prot : OFF                        velocidad usart: 9.600 Kbps
;****************************************** http://www.ingeniopic.com *******

            LIST   P=16F876         ;Se indica el modo de procesador
     
            RADIX   HEX            ;Sistema de numeracion hexadecimal

            INCLUDE   <P16f876.inc>  ;se incluye la definicion de los registros
               ;registros internos
            __CONFIG    _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
            ERRORLEVEL      -302     ;para que no se notifiquen los errires por los registros fuera del banco de ram.

CounterA   EQU   20h            ;registros para retardo
CounterB   EQU   21h
CounterC   EQU   22h
                 
BANK0         MACRO               ;macro para la seleccion del banco 0
            BCF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

BANK1         MACRO               ;macro para la seleccion del banco 1
            BSF   STATUS,RP0
            BCF   STATUS,RP1
            ENDM

;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
            ORG   0x00            ;Inicio en el Vector de Reset
     
            goto   INICIO            ;Va a la primera instruccion del programa
               

;<<<<<<----------------- CONFIGURACION DE LOS REGISTROS GENERALES ------------------->>>>>>>
INICIO      BANK0               ;Cambio al banco 0
         clrf   PORTA         ;borra PORTA (para inicializar el puerto)
         movlw   b'10010000'      ;Configuracion de la usart
            movwf   RCSTA            ;para recepcion continua y habilitacion de la usart
         
         BANK1
         movlw   0x06         ;configura PORTA como entradas digitales
         movwf   ADCON1
         movlw   0xff
         movwf   TRISA         ;PORTA como entrada de datos
            bcf      TRISC,6         ;RC6/Tx como salida   
            movlw   .25            ;valor para seleccionar 9600 baudios
            movwf   SPBRG
            movlw   b'00100100'      ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
            movwf   TXSTA            ;carga valor anterior en registro asociado al generador del baud rate
            
;<<<<<<<<-----------------------------PROGRAMA PRINCIPAL--------------------------->>>>>>>>>>>>>>>>>>>>>>>>     
           

;<<<<<<<<-------------------------------ENVIO DE DATOS--------------------------->>>>>>>>>>>>>>
ESCRIBEDATO   BANK0
                              movfw   PORTA
         movwf   TXREG
         
COMP_TX     btfsc   TXSTA,TRMT      ;comprueba si el shift register(TSR)esta lleno.y si es asi salta.
            goto      COMP_TX
         call    RETARDO         ;pausa para el envio de datos
         GOTO   ESCRIBEDATO
         
;<<<<<<----------------------- RUTINAS DE RETARDO ------------------------->>>>>>>

RETARDO     
            movlw   D'6'
            movwf   CounterC
            movlw   D'24'
            movwf   CounterB
            movlw   D'168'
            movwf   CounterA
loop         decfsz   CounterA,1
            goto   loop
            decfsz   CounterB,1
            goto   loop
            decfsz   CounterC,1
            goto   loop
            return         
         
     
           END 
« Última modificación: 17 de Enero de 2009, 17:47:38 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: pequeños proyectos
« Respuesta #3 en: 11 de Enero de 2009, 15:22:12 »
Gracias por tu aporte pero creo que este tópico iría mejor en la sección ALMACEN DEL ASSEMBLER , donde hay todo tipo de ejemplos en asm.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #4 en: 11 de Enero de 2009, 19:30:00 »
se que en parte deberia estar dode dices.ya lo habia pensado.
lo que pasa es que mi intencion es añadirle a las respuestas enlaces para la descarga de los circuitos con los que van
a funcionar.almenos para algunos de los pequeños proyectos que posteare.y veia que seria engorroso tener los proyectos en distintos hilos.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: pequeños proyectos
« Respuesta #5 en: 11 de Enero de 2009, 20:48:20 »
Puedes postear todos los proyectos en este hilo y si te parece bien lo movemos al almacén de ASM, que yo también creo que estará mejor allí.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #6 en: 11 de Enero de 2009, 21:15:55 »
de acuerdo,no hay ningun problema.se podria mober al almacen del ensembler.
y los proyectos los pondria en el hilo de pequeños proyectos.

voy a ver que tal queda.y si algo queda mal supongo que se podria arreglar.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: pequeños proyectos
« Respuesta #7 en: 11 de Enero de 2009, 21:46:13 »
Muy útil será este tema. Gracias Groudman
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #8 en: 12 de Enero de 2009, 18:54:46 »
no hay de que darlas.para mi es muy gratificante el poder contribuir en el foro, para avanzar en el conocimiento de este tipo de microcontroladores.

en el foro hay mucho codigo asm para el desarollo de aplicaciones y me han sido de gran utilidad en mis proyectos.
pero resultaria mas util para los principiantes,tener un programa listo para funcionar.sin instrucciones de mas.
basicamente utilizar el puerto A para enviar datos y el puerto B para recivirlos.

saludos.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: pequeños proyectos
« Respuesta #9 en: 12 de Enero de 2009, 21:43:49 »
Yo no programo en ASM mas que lo estrictamente necesario, pero creo que tu idea es muy buena y puede ayudar a mucha gente que comience. Animo y gracias por tu esfuerzo hombre masa, digo groundman  :-)

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #10 en: 13 de Enero de 2009, 12:50:35 »
jejeje.parece que has descifrado el nick.resulta que hace mucho tiempo buscaba un nick relacionado con la electronica.y vi por ahi el de vccman.
y se me ocurrio poner groundman.para que sepais que lo de hombre masa no va por los musculos. :D
ya que los tecnicos electronicos por norma general no solemos ejercitar mucho los musculos del cuerpo.quizas el unico musculo que solemos ejercitar  el que tenemos dentro de la cabeza.y en estos ultimos años tambien el de los dedos.quien  iva a decir que los ordenadores fueran a ser la herramienta imprescindible.
aun me acuerdo cuando cojia una libreta y un boli.y empezaba a dibujar puertas logicas para crear mis proyectos de electronica.

el primer circuito digital que realize y sin copiarme de ningun circuito ya hecho.fue un dado electronico.con un display y otros cuantos componentes.
y la primera vez que conoci los pic.fue en una revista,donde se explicaba como montar un circuito para recivir la señal meteosat.y visualizar la imagen
de españa desde el satelite.pero lo vi un poco complicado y descarte el montage.aparte de que por aquel tiempo todavia realizaba las placas con rotulador.
por entonces no habia la informacion que hay hoy en dia en internet.

bueno no me enrroyo y haver si pronto empiezo a subir mas ejemplos para experimentar.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado pity

  • PIC10
  • *
  • Mensajes: 4
Re: pequeños proyectos
« Respuesta #11 en: 16 de Enero de 2009, 10:07:28 »
Asi vamos armando esto
este es un programa que toma un valor analogico por el puerto A pin 1 , lo compara con un valor prefijado, que en este caso es 100 en decimal, y si es mayor prende un led y si es menor prende otro. de paso muestra el valor medido en el puerto B

inicialmente esta pensado para un termostato, y de paso, ver el valor
ahora estoy trabajando en esto mismo, pero que me muestre el valor en decimal en un LCD 2 x 16, pero para eso falta todavia q2ue descule como se pasa un numero binario a los 3 valores decimales de unidad decena y centena


list   P=16F877   ;Se indica el modo de procesador
      
include   "P16f877.inc"   ;se incluye la definicion de los
               ;registros internos
PDel0         EQU       0x21      
PDel1          EQU      0x22
PDel2         EQU    0x23
Temp         EQU      0x24      
Seteo         EQU      b'1100100'

;      PORTA COMO ENTRADA ANALOGICA
;
;
;----------------------------------------------------------------------------
INICIO

      org       0x00      ;vector de inicio
      nop      
      nop
      


      

;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>

      bsf      STATUS,RP0   ;Pone en 1 RP0 (para seleccionar banco 1)
      bcf      STATUS,RP1   ;Pone en 0 RP1 (para seleccionar banco 1)
      clrf   Temp      ;cargo todos 0 en Temp

                  ;Configuracion de puertos
      clrf      TRISB      ;PORTB como salida
      clrf      TRISC      ;PORTC como salida
      clrf      TRISD      ;PORTD como salida
      clrf      TRISE      ;PORTE como salida
      movlw      b'11111111'   ;Carga W con b'11111111'
      movwf      TRISA      ;PORTA como entrada

      movlw      b'11000001'   ;Configura ADCON1
      movwf      ADCON1      ;Todo el PORTA como entrada analógica, VDD = VREF+, VSS = VREF-





      bcf         STATUS,RP0   ;Pone en 0 RP0 (para seleccionar banco 0)
      bcf         STATUS,RP1   ;Pone en 0 RP1 (para seleccionar banco 0)
   
      clrf      PORTA      ;Limpia todos los puertos
      clrf      PORTB
      clrf      PORTC
      clrf      PORTD
      clrf      PORTE
   
      movlw      b'10000111'   ;Configura ADCON0
      movwf      ADCON0      ;FOSC/64
                  ;Channel 0 (AN0)
                  ;GO = 1 ADON = 1



LOOP   
      clrf      PORTA
      bsf         ADCON0,GO   ;Set en GO para iniciar la conversion del coversor AD
      call      DEMORA      ;Salta a demora de 50 ms
      movf      ADRESH,W    ;mueve la parte alta de la conversion al PORTB
      movwf      PORTB
      
               
            
      bsf         STATUS,RP0   ;Pone en 1 RP0 (para seleccionar banco 1)
      bcf         STATUS,RP1   ;Pone en 0 RP1 (para seleccionar banco 1)
   
      movf      ADRESL,W    ;mueve la parte baja de la conversion al PORTD
      bcf         STATUS,RP0   ;Pone en 0 RP0 (para seleccionar banco 0)
      bcf         STATUS,RP1   ;Pone en 0 RP1 (para seleccionar banco 0)
      movwf      Temp      ;cargo el valor leido en la posicion de memoria Temp

      movwf      PORTD      ;cargo el valor leido en el puerto D

       movlw      b'1100100'   ;cargo el valor de seteo 100 en W
      subwf      Temp,W      ; resto punto seteado contra lo leido
      movwf      PORTC
      btfss      STATUS,C   ;si el status c es 1 es que el seteo es mayor o igual que el valor medido y la dif es negativa
      goto      ENFRIA      ;si es 0
      bsf         PORTB,7      ;si es 1 es que la resta dio negativa, prende el calefactor y el led
      bcf         PORTB,6      ;apaga el led anterior al que prendi
      goto       LOOP
      



   
ENFRIA
      bcf         PORTC,0      ;la temp es mayor a lo seteado, apaga el led
      bcf         PORTB,7      ;apaga el calefactor
      bsf         PORTB,6      ;funcion inversa al del anterior
      call      DEMORA      ;espera
      goto      LOOP      ;vuelve al loop



;-------------------------demora de 50 ms-----------------
DEMORA  movlw     .197      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .253      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2 
        return              ; 2+2 Fin.



   END

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pequeños proyectos
« Respuesta #12 en: 16 de Enero de 2009, 10:50:34 »
Esta muy buena la idea!! Los que estamos empezando siempre nos viene bien un ejemplito que "abra la cabeza"  :-)
En cualquier momento posteo algo...
No contesto mensajes privados, las consultas en el foro

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: pequeños proyectos
« Respuesta #13 en: 16 de Enero de 2009, 19:08:57 »
hola pity.me parece muy bueno tu proyecto.lo que pasa es que mi intencion era crear mini proyectos basicos. para que el principiante entienda el funcionamiento basico de los modulos internos de nuestros pic.
hubiera estado muy bien que hubieras puesto el proyecto que describes en dos partes en la que se maneja el modulo analogico.y la funcion de comparacion entre dos valores.
y despues si que estaria muy bien el avanzar con la mezcla de ambos.
queria sugerirte que hay una funcion para comparar valores analogicos en este modulo interno del pic.y tu proyecto quedaria muy bien si utilizaras esta funcion.
se basa en la comparacion de dos valores que estan en AN2(Vref-) o AN3(Vref+) y otro valor que puedes meter con el sensor de temperatura en AN1 o la entrada analogica que te quede libre.pero no puedo decirte mas porque nunca he experimentado con esta funcion.y tampoco se si estoy en lo cierto.
aunque experimentando un poco creo que tiene que ser facil.
y te animo a que contrivuyas con tu experiencia en estos cacharritos.saludos.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: pequeños proyectos
« Respuesta #14 en: 16 de Enero de 2009, 21:14:29 »
Este es un programita que se encarga de controlar un LCD, es flexible y se puede modificar el puerto que lo controla.
Es para control a 4 bits.-
Se adjunta esquematico del Hardware
;============================================
;   Compilado en MPLAB IDE v7.42
;   inf.labwindows@live.com.ar
;============================================

   List p=16f84a
   #include <p16f84a.inc>
   __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


;===============================
;                  Declaración de Registros
;===============================
datoa      equ     0x0C   ;registro para enviar a LCD el nible alto
datob        equ    0x0D   ;registro para enviar a LCD el nible bajo
PDel0       equ    0x0E   ;registro para demoras
PDel1       equ    0x0F   ;registro para demoras
PDel2      equ    0x10   ;registro para demoras
loop      equ    0x11   ;registro para inicializacion del LCD
Digito      equ    0x12   ;Registro para seleccionar digito a visualizar
Contador   equ    0x13   ;Registro para mover mensaje en Display

; Declaracionde bit del LCD
enable      equ    6
rs      equ    5
rw      equ    4
backlight   equ    7
bf      equ    3

; Declaracion de Bytes del LCD
PORT_LCD   equ    0x06 ; PORTB para control del LCD
TRIS_LCD   equ    0x86

; <<    COMANDO  >>
; Borrar Display         0x01
; Ir al Inicio            0x02
;--- Modos de Entrada
; Incrementa Direccion, Display fijo   0x06
; Decrementa Direccion, Display fijo   0x04
; Incrementa Direccion, Cursor fijo   0x07
; Decrementa Direccion, Cursor fijo   0x05
;--- Encendido Display
; Apagar Display         0x08
; Encender Display         0x0C
; Encender Display y Cursor      0x0E
; Encender Display y Cursor Parpadeando   0x0F
; Encender Display con parpadeo      0x0D
;--- Corriemiento Cursor
; Cursor a la Izquierda         0x10
; Cursor a la Derecha         0x14
; Display a la Izquierda      0x18
; Display a la Derecha         0x1C
;--- Fijar Sistema
; Bus 8 bits, 1 línea, 5x7      0x30
; Bus 8 bits, 1 linea, 5x10      0x34
; Bus 8 bits, 2 líneas, 5x7      0x38
; Bus 4 bits, 1 línea, 5x7      0x20   
; Bus 4 bits, 1 linea, 5x10      0x24
; Bus 4 bits, 2 líneas, 5x7       0x28
;---Control de Posicion de Cursor
; Linea 1            0x80 hasta 0x8F
; Linea 2            0xC0 hasta 0xCF



      goto         inicio
;**********************************************

;==============================================
;                           INICIO
;==============================================
;==============================================
;     configuracion de puertos
;==============================================
inicio
      banksel         TRIS_LCD   ;Seleccionamos bank de TRIS_LCD
      clrf         TRIS_LCD   ;Configuramos puerto
;==============================================
;configuracion de LCD
;==============================================
      banksel         PORT_LCD
      call         demora_150ms
      movlw         0x03
      movwf         loop   ; 3 ciclos para inicializacion
Inicializacion
      movlw         0x03
      movwf         PORT_LCD
      bsf            PORT_LCD,enable          
      call         demora_4ms   
      bcf            PORT_LCD,enable
      call         demora_4ms   
      decfsz         loop
      goto         Inicializacion
;Interfase de 4 bits
      movlw         0x02
      movwf         PORT_LCD
      bsf            PORT_LCD,enable   ;enable      
      call         demora_4ms   
      bcf            PORT_LCD,enable
      call         demora_4ms   
         
;Fijar sistema...<< Bus de 4 bits, 2 lineas, 5x7>>
      movlw         0x28
      call         prep_dato_lcd   ;   Prepara los datos para enviar (Nible alto y nible Bajo)
      call         lcd_envia_coman   ;   Envia comando al LCD --> RS=0
   
;Limpia display y retorna al origen
      movlw         0x01
      call         prep_dato_lcd
      call         lcd_envia_coman
;Encendemos el LCD
      movlw         0x0C
      call         prep_dato_lcd
      call         lcd_envia_coman

;==============================================
;Datos al LCD
;==============================================
;Colocamos cursor en Linea 1, Posicion 8.-
      movlw         0x88         
      call         prep_dato_lcd
      call         lcd_envia_coman
;*************************************************
;Escribimos TODO PIC en el diplay
      clrf         Digito
repetir     movf            Digito,w         
                  call            tabla            ;obtiene el caracter
                  iorlw           0                ;Compara
                  btfsc           STATUS,2         ;Es el ultimo?
                  goto            seguir           ;Si
                  call             prep_dato_lcd   ;Se prepara para enviar
      call         lcd_envia_carac   ;Visualiza caracter --> RS=0
                  incf              Digito,f         ;Incrementa numero de Digito
                  goto           repetir          ;Vuelve a escribir
;*************************************************
;Movemos Display de derecha a izquierda y viceverza
                  
      clrf         Contador      ;Para contar las posiciones de movimiento del Display      
seguir         
               
      call         demora_150ms      ; Demora para visualizar el efecto
      movlw         0x1C         ; Comando para mover Display a la Izquierda
      call         prep_dato_lcd
      call         lcd_envia_coman
      incf         Contador,1
      movlw         d'8'
      subwf         Contador,0
      btfss         STATUS,Z      ; Se movio 8 posiciones?
      goto         seguir         ; No
      clrf         Contador      ; Si, comenzamos a mover a la Derecha
re_seguir      
                  
      call         demora_150ms
      movlw         0x18         ; Comando para mover Display a la Derecha
      call         prep_dato_lcd
      call         lcd_envia_coman
      incf         Contador,1
      movlw         d'8'
      subwf         Contador,0
      btfss         STATUS,Z      ; Se movio 8 posiciones?
      goto         re_seguir      ; No
      clrf         Contador      ; Si, Comenzamos a mover a la Izquierda
                 goto              seguir          ; Buclee infinito

;***********************************************
; Caracteres a enviar al LCD
tabla
      addwf          PCL,1
      retlw           'T'
      retlw           'O'
      retlw           'D'
      retlw           'O'
      retlw           ' '
      retlw           'P'
      retlw           'I'
      retlw           'C'
      retlw          0x00


 
;==============================================
;SUBRUTINAS
;==============================================
;**********************************************
;Prepara nible bajo y nible alto para enviar.(Si el nible del LCD es el bajo del puerto (Ver esquematico))
prep_dato_lcd
      movwf         datob      ; 0xXY
      swapf         datob,w      ; 0xYX
      movwf         datoa      ; 0xYX
      movlw         0x0F      
      andwf         datoa,1      ; 0x0X
      andwf         datob,1      ; 0x0Y   
               return
;**********************************************
prender_backlight
      banksel       PORT_LCD
      bsf          PORT_LCD,backlight
      return
;**********************************************
apagar_backlight
      banksel         PORT_LCD
      bcf            PORT_LCD,backlight
      return
;**********************************************
LCD_BANDERA
      bcf         PORT_LCD,0  ; para borrar datos anteriores sin borrar backligth
      bcf         PORT_LCD,1
      bcf         PORT_LCD,2
      bcf         PORT_LCD,3
      bcf         PORT_LCD,rw
      bcf         PORT_LCD,rs
      bcf         PORT_LCD,enable
      nop
      bsf         PORT_LCD,rw   ; R/W =1 Lectura
      banksel       TRIS_LCD
      movlw         0x0F   ;configuramos banco para leer bandera
      movwf         TRIS_LCD
      banksel       PORT_LCD
      bsf         PORT_LCD,enable   ; Enable =1   
      nop
espera      btfsc         PORT_LCD,bf ;testea estado
      goto          espera   ; No esta desocupado, esperamos
      bcf           PORT_LCD,enable   ; Si seguimos, Enable =0
      banksel       TRIS_LCD
      clrf          TRIS_LCD
      banksel         PORT_LCD
      return
;**********************************************
LCD_ENABLE
      bsf          PORT_LCD,enable   ; Enviamos un pulso de Enable
      nop
      nop
      bcf         PORT_LCD,enable
      return
;**********************************************
lcd_envia_coman ;RS=0 Selección registro de control
      ;call         LCD_BANDERA  ;Controla si el LCD esta en condiciones de recibir un nuevo dato
      call         demora_4ms
      btfss          PORT_LCD,backlight ; Preguntamos estado del Backlight >>
      goto          back0_1   ; << para mantener su estado despues de enviar el dato >>
      movlw          0x80   ; << al LCD
      addwf          datoa,W   
      movwf         PORT_LCD   ;Enviamos nible alto al LCD
      call          LCD_ENABLE   
Preg0
      btfss          PORT_LCD,backlight   ; Preguntamos estado del Backlight
      goto          back0_2
      movlw          0x80
      addwf         datob,W   
      movwf            PORT_LCD   ; Enviamos nible bajo al LCD
      call         LCD_ENABLE
      return
back0_1
      movf            datoa,W   ; No esta encendido Backlight
      movwf           PORT_LCD   ; Enviamos nible alto al LCD
      call          LCD_ENABLE
      goto          Preg0
back0_2
      movf          datob,W   ; No esta encendido Backlight
      movwf          PORT_LCD   ; Enviamos nible bajo al LCD
      call         LCD_ENABLE
      return
;**********************************************
lcd_envia_carac ;RS=1 Selección registro de datos
      ;call         LCD_BANDERA ;Controla si el LCD esta en condiciones de recibir un nuevo dato
      call         demora_4ms
      btfss         PORT_LCD,backlight  ; Preguntamos estado del Backlight>>
      goto          back00_1 ; << para mantener su estado despues de enviar el dato>>
      movlw              0xA0    ; << al LCD
      addwf         datoa,w
      movwf         PORT_LCD   ;Enviamos nible alto al LCD
      call          LCD_ENABLE
Preg1   
      btfss          PORT_LCD,backlight
      goto          back00_2
      movlw           0xA0
      addwf         datob,w
      movwf         PORT_LCD   ; Enviamos nible bajo al LCD
      call          LCD_ENABLE
      return
back00_1
      movlw         0x20
      addwf         datoa,w   ; No esta encendido Backlight
      movwf         PORT_LCD   ;Enviamos nible alto al LCD
      call          LCD_ENABLE
      goto          Preg1
back00_2
      movlw         0x20
      addwf         datob,w   ; No esta encendido Backlight
      movwf         PORT_LCD   ; Enviamos nible bajo al LCD
      call         LCD_ENABLE
      return
;**********************************************

;----------------------------------------------------------------------------
;                             DEMORAS
;----------------------------------------------------------------------------
demora_150ms
      movlw           .117     
             movwf           PDel0   
PLoop0_     movlw           .213       
           movwf           PDel1     
PLoop1_     movlw           .1     
           movwf           PDel2     
PLoop2_     nop                 
           decfsz          PDel2, 1 
           goto            PLoop2_   
           decfsz          PDel1,  1
           goto            PLoop1_   
             decfsz          PDel0,  1
           goto            PLoop0_   
PDelL1_     goto          PDelL2_       
PDelL2_     nop                 
           return     
;**********************************************
demora_4ms
      movlw           .5     
      movwf           PDel0     
PLoop3      movlw           .159     
      movwf           PDel1     
PLoop4      NOP             
      decfsz          PDel1,1 
      goto            PLoop4   
      decfsz          PDel0,1 
      goto            PLoop3   
PDelL3      goto            PDelL4         
PDelL4      NOP           
      return   
;*********************************************       

      end

No contesto mensajes privados, las consultas en el foro


 

anything