miércoles, 16 de marzo de 2011

Envio de cadena de caracteres y visualización en LCD

Programa para PIC16F84A
  • Este programa recibe una cadena de 16 caracteres ASCII de la calculadora HP 50g y la muestra en un LCD con controlador Hitachi 44780.
  • Se utiliza Direccionamiento Indirecto para guardar la cadena de caracteres en registros sucesivos a partir de la dirección 20h.
  • Los datos en serie se reciben a 9600 baudios por el pin RA4.
Funcionamiento:
  • Según el siguiente diagrama de tiempos de envio de datos en serie:
  •  El programa espera a que se presente un "0" (bit START). Cuando esto ocurre se ejecuta una rutina que guarda los bits que llegan en serie, a partir del menos significativo, en la dirección de memoria al que apunta el registro FSR (Direccionamiento indirecto). 
  • Una vez recibidos los 8 bits, debidamente sincronizados a 9600 baudios mediante retardos, se ejecuta un retardo más a la espera del primer bit STOP (para evitar falsas lecturas de "0" que podría ser el 8 bit de datos).
  • Se incrementa FSR para apuntar a la dirección sucesiva y se incrementa un contador de caracteres recibidos.
  • Si ya se recibieron 16 caracteres se salta a la rutina que muestra la cadena en un LCD, una vez finalizada se repite el proceso nuevamente . Caso contrario se espera un nuevo "0" (bit START) para recibir el siguiente caracter. 
Diagrama de Conexión:

  • La cantidad de caracteres a recibir se puede modificar en el archivo .ASM (donde se indica).
  • Opcional: para enviar caracteres desde la calculadora crear el siguiente programa que permite enviar 10 cadenas cada vez que se ejecuta. Escribir la cadena entre comillas (".....") cuando se solicite.
                       << 'a'    PURGE  
                            1    10
                            FOR   j
                               "CADENA   A   ENVIAR"
                               {":a:"  {0 0}   V}
                               INPUT
                                OBJ→    'a'    STO    a
                                9600 BAUD
                                XMIT
                                DROP
                            NEXT
                            'a'   PURGE >>

Archivos .ASM y .HEX:


    lunes, 14 de marzo de 2011

    Envio de datos por puerto serie de calculadora HP 50g

    Programa para PIC16F84A

    • Programa que recibe datos del puerto serie de la HP 50g a 9600 baudios.
    • La HP 50g envia caracteres ASCII por el puerto serie (Compatible con interfaz RS232, necesario adaptador de niveles de tensión) según el siguiente gráfico de tiempos:



    • Se utiliza el bit START para generar una interrupción por el pin RB0/INT por flanco de bajada.
    • La rutina de interrupción guarda los bits de datos recibidos en serie en el registro DATO.
    • Se incluye rutinas de retardo para sincronizar a 9600 baudios.
    • Una vez finalizada la recepción de datos se muestran los bits (en ASCII) mediante leds en los pines: RB7-RB4 y RA3 - RA0, nibles superior e inferior respectivamente.
    • Para enviar un caracter ASCII de la calculadora HP 50g crear el siguiente programa:
                                                <<9600 BAUD XMIT>>

              Guardar en una variable.
    • En modo RPN poner el caracter que se desea enviar en el nivel 1 de la pila entre " " y ejecutar el programa.

    Esquema de conexión:


    El transistor 2N3904 es necesario como adaptador de nivel de tensión ya que la calculadora transmite en niveles CMOS (3.3 V).

    Archivos .ASM y .HEX para PIC
    Descargar

    Se publicará mas información según avance.

    miércoles, 9 de marzo de 2011

    Ejemplos Ruta de Datos

    1. Ruta de datos simple.
        - 1 registro de 8 bit.
        - ALU de 8 operaciones. A: Registro y B: Inmediato

     
        Component: alu.vhd
        Component: registro_r0.vhd
        Programa principal: ruta_datos.vhd

    2. Ruta de datos sin acceso a memoria.
        - Banco de 4 registros de 1 byte.
        - Memoria de programa de 16 x 15 bits.
        - ALU de 8 operaciones
        - Ejecución de instrucción por cada pulso de botón.
        - Visualización de contenido de registros en display.
        - Sin acceso a memoria.    


        
        Palabra de comando:


    2
    2

    3
    1
    1
    SELA
    SELB
    6
    OP
    WR
    SELI
    SELD
    INMEDIATO

       Component para procesador.vhd : alu.vhd y registro.vhd
       Component para ruta_datos.vhd: procesador.vhd, mem16x15.vhd
                                                              y visor.vhd

    3. Ruta de datos con acceso a memoria.
        - Banco de 4 registros.
        - Memoria de programa de 16 x 17 bits.
        - ALU de 8 operaciones.
        - Acceso a memoria RAM de lectura/escritura de 16 bytes.
        - Ejecución de instrucción por cada pulso de botón.
        - Visualización de registros en display.        
                     
     

        Palabra de comando:



    2
    2


    2
    SELB


    3
    1
    1
    1
    1
    SELA
    DIR
    4
    OP
    WR
    W
    SELM
    SELI
    SELD
    INMEDIATO

       Component para procesador.vhd: alu.vhd y registro.vhd
       Component para ruta_datos.vhd: procesador.vhd, mem16x17.vhd,  
                                                              ram16x8.vhd, visor.vhd

       Todos los archivos:
        Descargar

    Ejemplos Estilo Estructural

    1. Sumador de 16 bit. Sentencia For..Generate.
        Component: full_adder.vhd

     
     
        Programa principal: add16.vhd


    2.Contador hexadecimal de pulsaciones de 4 botones. Bisualización en Display.

       Component: visor.vhd

       Programa principal: contador_4.vhd

    3. Memoria RAM 256 bytes. Para utilizar como componente para Ruta de Datos.


         Programa: ram256x8.vhd

      Todos los archivos:
       Descargar

    Ejemplos Máquina de Estados

    1. Semaforo peatonal 1: Luz normalmente en Verde para tráfico vehicular.   
              Cuando se presiona BOTON cambia a luz Roja por 20 segundos. 
              Los últimos 5 segundos se muestran en un Display.

               Diagrama de estados tipo Moore:


                 Archivo: semaforo_peatonal.vhd
           
           2. Luz normalmente en Verde para tráfico vehicular.
               Cuando se presiona botón STOP cambia a luz Ámbar y parpadea 
               por 3 segundos.  Cambia a luz Roja por 17 segundos. 
               Los últimos 5 segundos se muestran en un Display.
               Para un oscilador de 50 MHz.


          Diagrama de estados tipo Moore:
                      
     

                      Archivo: semaforo_peatonal_2.vhd
            
          3. Semáforo simple de cruce de 2 calles. Para un oscilador de 50 MHz.

        
               Diagrama de estados tipo Moore:
              
                   Archivo: semaforo_simple.vhd
           
          4. Semáforo en la intersección de una calle de tráfico muy denso con una calle de tráfico
              moderado.   La calle principal tiene luz Verde durante un mínimo de 25 segundos o 
              mientras no haya ningún vehículo en la calle perpendicular.
              La calle lateral tiene luz Verde hasta que no circule ningún coche por ella o durante un
        máximo de 25 segundos.  
        La luz ámbar de precaución dura 4 s en los cambios de luz Verde a Roja en ambas
        calles, principal y  lateral.

      
              Diagrama de estados tipo Moore:

             
        Archivo: semaforo.vhd

     Todos los archivos:

    Ejemplos Máquina de Estados

          1. Generador de paridad impar. Envío de bits en serie al presionar START.
                
                Archivo: paridad_serial.vhd
                
          2.  Detector de fraude y monedas falsas.
        Moneda falsa (SENSOR=01) => Z: Oscilador por 10 s.
        Fraude (SENSOR=10)=> X<=1 y Z<=0. STOP para apagar
        Moneda falsa y fraude (SENSOR=11)=>Ambas alertas activas. Z por 10 s
        y STOP para apagar X.
      
           Archivo: casino.vhd

    3.  Contador en doble sentido de la secuencia 0,4,7,1,5,9.
         UP=1 => Sentido 1
         UP=0 => Sentido 2

           Archivo: contador_u_d.vhd

    4.  Circuito generador de la secuencia 11010 cuando se presiona START. 
         La duración de bit es 100 veces el periodo del Oscilador.
          Archivo: secuencia.vhd

    5. Detector de secuencia 1011 con traslape.

          Archivo: detector1.vhd

    6.  Detector de secuencia 11X011


         Archivo: detector2.vhd

    7. Permite detectar el primer botón presionado de un grupo de 3.
        El número de participante se muestra en un Display.
        Se reinicia sólo cuando se presiona RESET.


                   Archivo: concurso.vhd

           8.  Un tanque de agua abierto por la parte superior dispone de tres sensores de 
           detección de llenado (A, B, C) que determinan 4 posibles niveles de llenado
           (VACIO, NORMAL, LLENO, ALARMA). El  nivel del tanque se controla 
            mediante dos válvulas (E, entrada y S, salida).
    • En condiciones de llenado normal, las válvulas E y S se encuentran abiertas.
    • Si el líquido llega al nivel de vacío, se  cierra la válvula de salida y se mantiene abierta la de entrada.
    • Si el líquido llega al nivel de lleno, se cierra la válvula de entrada y se mantiene abierta la de salida.
    • Si por cualquier circunstancia, por ejemplo lluvia, se llegara al nivel de alarma, se deberá cerrar la válvula de entrada y abrir la de salida. Esta situación se mantendrá hasta que el tanque llegue al estado de vacío.
     Datos adicionales: 

     El funcionamiento de los sensores digitales y las válvulas E y S se encuentra resumido en las tablas adjuntas:

            Entrada: SENSOR=ABC
            Salida: VALVULA=ES
         
            Diagrama de estados tipo Mealy:
     
           
         Archivo: tanque.vhd (Tipo Moore)
                       tanquemealy.vhd (Tipo Mealy)

    Todos los archivos:

    martes, 8 de marzo de 2011

    Ejemplos de programación VHDL

    1. Codificador BCD con prioridad. El circuito tiene las entradas desde E1,E2,…..E9 y las salidas Z3, Z2, Z1 y Z0.

    E9 E8  E7  E6 E5 E4  E3 E2  E1   Z3 Z2 Z1 Z0
    1    X   X   X   X   X   X   X   X      1   0   0   1
    0    1    X   X   X   X   X   X   X      1   0   0   0
    0    0    1    X   X   X   X   X   X      0   1   1   1
     ………….
    0    0    0    0    0    0    0    0   1      0   0   0   1
    0    0    0    0    0    0    0    0   0      0   0   0   0
         
         Archivo: codificador_bcd.vhd
    2. Circuito generador de paridad par de un conjunto de datos de 8 bits. El circuito tiene 8 entradas y 9 salidas (las mismas 8 entradas más el bit de paridad par).

          
         Archivo: paridad.vhd

    3. Contador BCD con CLR activo en nivel bajo.
      

        Archivo: contador_bcd.vhd

    4. Divisor de frecuencia. 4 frecuencias seleccionables.


        Archivo:  divisor4.vhd

           5. Divisor de frecuencia con selector. 16 frecuencia seleccionables.
      
       Archivo: divisor16.vhd

    6. LED parpadeante. La frecuencia de parpadeo se duplica cada vez que se presiona  BOTON (hasta
                8 veces).


        
         Archivo: led8.vhd

    7. Contador decimal de pulsaciones de BOTON. Visualización en Display.

         Archivo: cuenta_bcd.vhd
     
    8. Generador de las señales: 


           Archivo: generador.vhd

       Todos los Archivos .VHD
         Descargar

    miércoles, 2 de marzo de 2011

    LCD 16x2 - Controlador Hitachi 44780


    Un LCD (Liquid Crystal Display) es un dispositivo de visualización gráfica para presentación de caracteres, símbolos o incluso dibujos.

    Un LCD 16x2 dispone de 2 filas de 16 caracteres cada una. cada caracter se muestra en un a Matríz de 5x7 puntos (pixeles). Está gobernado por un microcontrolador Hitachi 44780 que facilita la comunicación con otros dispositivos.

    Características:
    • Pantalla de caracteres ASCII, caracteres Kanji y Griegos.
    • Desplazamiento de caracteres hacia la izquierda o hacia la derecha.
    • Memoria de 40 caracteres por linea.
    • Movimiento del cursor.
    • Programación de 8 caracteres por el usuario.
    • Conexión mediante interfaz de 4 u 8 bit.
    Funcionamiento

    La comunicación puede hacerse de 2 maneras: Con bus de 4 bits o con bus de 8 bits. Se utilizará bus de 8 bits por la mayor simplicidad de implementarlo en Assembler.

    Las líneas de datos son Tri-state, es decir, cuando el LCD no está habilitado sus pines de datos tienen alta impedancia.

    Nº PIN

    DESCRIPCION
    1
    VSS
    GND
    2
    VDD
    VDD (5 V)
    3
    V0
    Contraste ( 0 a +5V )
    4
    RS
    Registro de control/Registro de datos:
    RS=0 Selección registro de control
    RS=1 Selección registro de datos
    5
    R/W
    Lectura/Escritura:
    R/W=0 Escritura (Write)
    R/W=1 Lectura (Read)
    6
    E
    Habilitación:
    E=0 Deshabilitado
    E=1 Habilitado
    7-14
    D0-D7
    Bus de datos bidireccional.

















    Juego de Instrucciones del LCD con controlador Hitachi 44780

    Clear Display

    Borrar y colocar el cursor en la primera posición (dirección 0). Pone el bit I/D a 1 por defecto.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    1



    Home

    Colocar el cursor en la posición de inicio (dirección 0) y hacer que el display comience a desplazarse desde la posición original. El contenido de la memoria RAM de datos de visualización (DD RAM) permanece invariable. La dirección de la memoria RAM de datos para la visualización (DD RAM) se pone a 0.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    0
    0
    0
    0
    0
    0
    1
    X




    Entry Mode Set

    Establecer la dirección de movimiento del cursor y especificar si la visualización se desplaza a la siguiente posición de la pantalla o no. Estas operaciones se ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar normalmente poner el bit S=0.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    0
    0
    0
    0
    0
    1
    I/D
    S




    Display ON/OFF Control

    Activar o desactivar poniendo en ON/OFF tanto el LCD (D) como el cursor (C) y establecer si este último debe o no parpadear (B).

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    0
    0
    0
    0
    1
    D
    C
    B




    Cursor or Display Shift

    Mover el cursor y desplazar el LCD sin cambiar el contenido de la memoria de datos de visualización DD RAM.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    0
    0
    0
    1
    S/C
    R/L
    X
    X




    Function Set

    Establecer el tamaño de interface con el bus de datos (DL), número de líneas del LCD (N) y tipo de carácter (F).

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    0
    0
    1
    DL
    N
    F
    X
    X




    Set the CG RAM Address

    El módulo LCD además de tener definidos todo el conjunto de caracteres ASCII permite al usuario definir 4 u 8 caracteres. La composición de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carácter definido por el usuario se compone de 16 u 8 bytes que se almacenan en sucesivas posiciones de la CG RAM.

    Mediante esta instrucción se establece la dirección de memoria CG RAM a partir de la cual se irán almacenando los bytes que definen un carácter. Ejecutando este comando todos los datos que se lean o escriban posteriormente lo harán desde esta memoria CG RAM.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    0
    1
    Dirección de la CG RAM




    Set the DD RAM Address

    Los caracteres o datos a visualizar se almacenan en una memoria llamada DD RAM para luego pasar a la pantalla.

    Mediante esta instrucción se establece la dirección de la memoria DD RAM a partir de la cual se almacenarán los datos a visualizar. Ejecutando este comando todos los datos que se escriban o lean posteriormente lo harán desde esta memoria DD RAM.

    Las direcciones 80h a 8Fh corresponden a los 16 caracteres del primer renglón y las direcciones C0h a CFh a los 16 caracteres del segundo renglón, para este modelo de LCD.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    0
    1
    Dirección de la DD RAM




    Read Busy Flag and Address

    El módulo LCD tarda un cierto tiempo para ejecutar las instrucciones, tiempo en que no se debe enviar otra instrucción. Para ello dispone de un flag BUSY (ocupado) que indica que se está ejecutando una instrucción.

    Esta instrucción de lectura informa del estado de dicho flag además de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM según la última que se haya empleado.
    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    0
    1
    BF
    Dirección de la CG RAM o DD RAM



    Write data to CG or DD RAM

    Comando para escribir en la memoria DD RAM los datos que se quieren presentar en pantalla, en código ASCII.

    Igualmente se escribe en la memoria CG RAM los bytes para generar caracteres definidos por el usuario.

    Previamente se direcciona la memoria DD RAM o la memoria CG RAM en la que se quiere escribir datos.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    1
    0
    Código ASCII o byte del carácter gráfico




    Read Data from CG RAM or DD RAM

    Comando para leer los datos almacenados en la memoria DD RAM, en código ASCII.

    Igualmente se lee de la memoria CG RAM los bytes de los caracteres definidos por el usuario.

    Previamente se direcciona la memoria DD RAM o la memoria CG RAM de la que se quiere leer los datos.

    RS
    R/W
    DB7
    DB6
    DB5
    DB4
    DB3
    DB2
    DB1
    DB0
    1
    1
    Código ASCII o byte del carácter gráfico



    Programa para PIC16F84A


    Programa que incluye subrutinas para mostrar dos lineas de caracteres en el LCD 16x2.

    Diagrama de Conexión:


    Prueba:




    Programa en Assembler:

    ;----------------------------------------------------------
    ;Autor: LONELY113
    ; http://lonely113.blogspot.com
    ;
    ;Programa para control de LCD con controlador Hitachi 44780
    ;2x16 lineas
    ;Configuracion de pines:
    ;RA0: RS  (Pin 4)
    ;RA1: R/W (Pin 5)
    ;RA2: E   (Pin 6)
    ;RB0-RB7: D0-D7 (Pines 7-14)
    ;----------------------------------------------------------
    include "p16f84a.inc"
    LIST P=16f84a
    
    __CONFIG _WDT_OFF & _XT_OSC
    
    COUNT1 equ 0x0C
    COUNT2 equ 0x0D
    CURSOR equ 0x0E
    
     org 0x00 ; Inicio de Programa
    BEGIN: bsf STATUS,5; Inicio configuracion E/S
     clrf PORTB ; Puerto B como salida
     clrf PORTA ; Puerto A como salida
     bcf STATUS,5; Fin configuracion E/S
     clrf PORTA  
     call DELAY
    START: call INI ; Inicializacion de LCD
     movlw 0x01 ; b'00000001' Clear display
     call REG   
     movlw 0x06 ; b'00000110' Incrementa cursor I/D=1
     call REG ; y visualizacion modo normal S=0
     movlw 0x0C ; b'00001100' Display ON D=1
     call    REG ; Cursor OFF C=0 y Parpadeo OFF B=0
     movlw 0x80 ; Direccion inicio de almacenamiento
     call REG ; de datos (Linea 1 comienza en 80h) 
     clrf CURSOR ; CURSOR almacena #caracter a enviar
    ROW1: movf CURSOR,0
     call CONV
     call DAT ; Enviar a memoria de datos
     incf CURSOR,1
     movlw 0x09
     subwf CURSOR,0; Enviar datos hasta que CURSOR=9
     btfss STATUS,2
     goto ROW1
     movlw 0xC0 ; Direccion inicio de almacenamiento
     call REG ; de datos (Linea 2 comienza en C0h)
    ROW2: movf CURSOR,0
     call CONV
     call DAT ; Enviar a memoria de datos
     incf CURSOR,1
     movlw 0x15
     subwf CURSOR,0; Enviar datos hasta que CURSOR=15
     btfss STATUS,2
     goto ROW2
    ILOOP: nop  ; Bucle infinito cuando se termine de
     goto ILOOP ; enviar todos los datos
    
    ;Subrutinas
    
    ;BUSY: Subrutina para no enviar datos al LCD cuando 
    ;      esta ocupado
    BUSY bsf PORTA,1 ; R/W=1 (Lectura de LCD) 
     bsf STATUS,5 
     movlw 0xFF  
     movwf PORTB ; RB7 como entrada (BF:Busy Flag)
     bcf STATUS,5 
     bsf PORTA,2 ; E=1 (Habilitar LCD)
     nop
    LCD_BU: btfsc PORTB,7 ; Verificar si LCD esta ocupado
     goto LCD_BU ; Bucle mientras BF=1
     bcf PORTA,2 ; E=0 (Deshabilitar LCD)
     bsf STATUS,5 
     clrf PORTB ; Puerto B como salida
     bcf STATUS,5 
     bcf PORTA,1 ; R/W=0 (Escritura de LCD)
     return
    
    ;Subrutina para enviar datos a Registro de control
    REG bcf PORTA,0 ; Seleccion de reg. de control
     movwf PORTB ; Preparar envio de datos
     call BUSY ; Verificar si LCD esta ocupado
     bsf PORTA,2 ; E=1 (Habilitar LCD)
     nop  ; Almacena dato en reg. control
     bcf PORTA,2 ; E=0 (Deshabilitar LCD)
     return
    
    ;Subrutina para enviar datos a memoria de datos
    DAT bcf PORTA,0 ; Seleccion de reg. de control
     movwf PORTB ; Preparar envio de datos
     call BUSY ; Verificar si LCD esta ocupado
     bsf PORTA,0 ; Seleccion de reg. de datos
     bsf PORTA,2 ; E=1 (Habilitar LCD)
     nop  ; Almacena dato en memoria
     bcf PORTA,2 ; E=0 (Deshabilitar LCD)
     return
    
    ;Subrutina de inicializacion de LCD
    INI     movlw 0x38 ; b'00111000'
     call REG ; DL=1, N=1, F=0
     call DELAY ; linea de 8 bits, 2 lineas
     return  ; caracter 5x7 puntos
    
    ;Subrutina de retardo para que LCD complete operaciones
    DELAY movlw 0xFF
     movwf COUNT2
     clrf COUNT1
    LOOP: decfsz COUNT1,1
     goto LOOP
     decfsz COUNT2,1
     goto LOOP
     return
    
    ;Subrutina que devuelve en W el codigo ascii de caracter
    ;a enviar a LCD
    CONV addwf PCL,1
     retlw 'l'
     retlw 'o'
     retlw 'n'
     retlw 'e'
     retlw 'l'
     retlw 'y'
     retlw '1'
     retlw '1'
     retlw '3'
     retlw 'b'
     retlw 'l'
     retlw 'o'
     retlw 'g'
     retlw 's'
     retlw 'p'
     retlw 'o'
     retlw 't'
     retlw '.'
     retlw 'c'
     retlw 'o'
     retlw 'm'
     return
    
     end  ;Fin de programa
      


    ****Programa en Pic Basic (Microcode)****

    '****************************************************************
    '*  Name    : UNTITLED.BAS                                      *
    '*  Author  : LONELY113                                         *
    '*  Notice  : Copyright (c) 2011 LONELY113                      *
    '*          : All Rights Reserved                               *
    '*  Date    : 12/05/2011                                        *
    '*  Version : 1.0                                               *
    '*  Notes   : PIC16f84a                                         *
    '*          : Pines de LCD: RB7-RB4=D7-D4  (Modo de 4 bits)     *
    '*          :               RA0=RS, RA1=RW, RA2=E               *
    '****************************************************************
    
    @ __CONFIG _HS_OSC & _WDT_OFF
    
    define OSC 10         '10 MHz'Definiciones para módulo LCDDEFINE LCD_BITS 4      'Bus de 4 bits
    DEFINE LCD_LINES 2     'LCD de 2 filas 
    DEFINE LCD_DREG PORTB  'Puerto de datos a LCD 
    DEFINE LCD_DBIT 4      'Bits 4 a 7 de PORTB
    DEFINE LCD_RSREG PORTA 'Puerto A seleccion de registro
    DEFINE LCD_RSBIT 0     'RA0=RS de LCD
    DEFINE LCD_RWREG PORTA 'Puerto A Lectura/Escritura 
    DEFINE LCD_RWBIT 1     'RA1=RW de LCD 
    DEFINE LCD_EREG PORTA  'Puerto A Habilitacionde LCD 
    DEFINE LCD_EBIT 2      'RA2=E de LCD 
    DEFINE LCD_COMMANDUS 2000 'Retardo ente comandos en us 
    DEFINE LCD_DATAUS 50      'Retardo entre datos en us 
    
    LCDOUT $FE, 1          'Borrar la pantalla
    LCDOUT $FE, $0C        'Primera fila, cursor off
    LCDOUT "lonely113"     'Enviar cadena
    LCDOUT $FE, $C0        'Cursor a segunda fila
    LCDOUT "blogspot.com"  'Enviar cadena
    END


    Archivos .ASM y .HEX
    Descargar