; ARCHIVO LCD 16 X 1V3F628.ASM ; CODIGO FUENTE PARA EL MICROCONTROLADOR EDUPIC-16F628 ; ESCRIBE EN EL LCD DE UN SOLO RENGLON EL MENSAJE "EDUPIC 16F628" ; DOS SECCIONES QUE SE MANEJAN COMO SI FUESEN DOS RENGLONES ; LOS PRIMEROS 8 CARACTERES FORMAN EL PRIMER RENGLON Y LOS ; SIGUIENTES 8 FORMAN EL SEGUNDO RENGLON. REALIZA EL SCROLLING ; CIRCULAR DEL MENSAJE EN 16 POSICIONES. ; SE UTILIZAN 16 LOCALIDADES EN RAM ; DE LA DIRECCION 30H A LA 3FH COMO BUFFER DE ESCRITURA AL LCD. ; VERSION PARA OSCILADOR CRISTAL 4 MHZ ; CPU configuration ; (It's a 16F628, XT OSCILADOR ; watchdog timer off, power-up timer on) ;PA1 se usa como señal de control RS comando=0, datos=1 ;PA2 se usa como señal de control EN pulso de 50 ms. ;PB0..PB7 se usan como señales de datos. processor 16f628 include __config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF eight equ H'38' ;comando interfaz 8 bits, dos renglones clear equ H'01' ;limpia display home equ H'03' ;posiciona el cursor en inicio cursor equ H'0F' ;parpadea cursor renglon1 equ H'80' ;elige primer rengón renglon2 equ H'C0' ;elige segundo renglón J equ H'21' ;localidad para subrutina de retardo K equ H'22' ;localidad para subrutina de retardo valor equ H'23' ;localidad guardar valor offset en tabla buffer equ H'30' ;localidad de inicio del buffer de escritura counter equ H'24' ;localidad para cuenta descendente de 16 localidades inibuff equ H'30' endbuff equ H'40' org 0 movlw H'07' movwf CMCON lcd movlw H'00' bsf STATUS,RP0 ;BANCO 1 clrf VRCON movwf TRISB ;bits de puerto B, salidas movwf TRISA ;bits de puerto A, salidas bcf STATUS,RP0 ;BANCO 0 call comand ;incializa LCD. envía 4 comandos call filbuf ;llena el buffer en memoria loop call primer ;escribe primer renglón call segund ;escribe segundo renglón call scroll ;realiza scroll de memoria call delay3 goto loop scroll movlw buffer+D'15' movwf FSR movlw D'16' movwf counter malla8 movfw INDF incf FSR movwf INDF decf FSR decf FSR decfsz counter goto malla8 movfw endbuff ;mueve el último al primero movwf inibuff return filbuf movlw buffer ;inicializa W con inicio de buffer movwf FSR ;prepara direccionamiento indirecto movlw D'16' ;prepara cuenta de contador movwf counter weer movfw counter call tabla ;trae cada uno de los caracteres movwf INDF ;colócalo en buffer incf FSR decfsz counter goto weer return primer movlw renglon1 call puco ;envía comando de renglón 1 movlw D'8' movwf valor movlw buffer+D'15' movwf FSR malla1 movfw INDF call puda ;escribe caracter en LCD decf FSR decfsz valor,f goto malla1 return segund movlw renglon2 call puco ;envía comando de renglón 2 movlw D'8' movwf valor movlw buffer+D'7' movwf FSR malla2 movfw INDF call puda ;escribe caracter en LCD decf FSR decfsz valor,f goto malla2 return comand movlw eight ;envía 4 comandos call puco movlw clear call puco movlw home call puco movlw cursor call puco return puco movwf PORTB ;escribe comando en puertoB call delay ;50 milisegundos movlw H'04' ;RS=0, EN=1 movwf PORTA call delay movlw H'00' ;RS=0, EN=0 movwf PORTA call delay movlw H'04' movwf PORTA call delay return puda movwf PORTB ;escribe dato en puertoB call delay ;50 milisegundos movlw H'06' ;RS=1, EN=1 movwf PORTA call delay movlw H'02' ;RS=1, EN=0 movwf PORTA call delay movlw H'06' movwf PORTA call delay return delay movlw D'10' ;50 milisegundos movwf K mallaK movwf J mallaJ decfsz J,f goto mallaJ decfsz K,f goto mallaK return delay2 movlw D'250' ;50 milisegundos movwf K mallaM movwf J mallaL decfsz J,f goto mallaL decfsz K,f goto mallaM return delay3 call delay2 call delay2 call delay2 return tabla addwf PCL,f retlw ' ' retlw 'E' retlw 'D retlw 'U' retlw 'P' retlw 'I' retlw 'C' retlw ' ' retlw '1' retlw '6' retlw 'F' retlw '6' retlw '2' retlw '8' retlw '.' retlw '.' retlw '.' end