; NA06.ASM ; MOVDRV-1/LCD: LECTURA Y PRESENTACIÓN EN LCD DE LAS 12 ENTRADAS PARA SENSORES DIGITALES ; 1/2/2003 ; ; SELEKRON MICROCONTROL S.L. www.selekron.com ; ; ; Se representa mediante unos y ceros, el estado de las entradas digitales sobre el LCD. ; Se pueden usar sensores reales o simulados. ; Para simular la presencia de sensores en las entradas digitales, se deben colocar ; todos los jumpers (J14-J25) en pull-down y conectar pulsadores entre las líneas 2 y 3 de J26-J37 ; También se pueden colocar en pull-up y conectar los pulsadores entre las líneas 2 y 5. ; Véase el esquema eléctrico de las entradas en el manual de la placa MOVDRV-1. ; Téngase en consideración que el PORTB es compartido por el bus de datos del LCD y las salidas del 74HCT240. ; Por tanto, al hacer un acceso al LCD hay que deshabilitar el 74HCT240(bsf PORTE,2) LIST P=16F877A include __CONFIG _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF #define EN_LCD bsf PORTC,5 ;Línea E=1 #define DIS_LCD bcf PORTC,5 ;Línea E=0 #define LECTURA bsf PORTE,1 ;LCD Modo RD #define ESCRITURA bcf PORTE,1 ;LCD Modo WR #define INSTRUCCION bcf PORTE,0 ;RS=0 #define MODO_DATO bsf PORTE,0 ;RS=1 #define HCT240_EN bcf PORTE,2 ;Habilita las salidas del 74HCT240 hacia RB0-RB7 #define HCT240_DIS bsf PORTE,2 ;Deshabilita las salidas del 74HCT240 hacia RB0_RB7 cblock 0x20 CHAR ;Contiene el carácter para enviar al LCD. INS ;Contiene la instrucción para enviar al LCD. TEMPO_1 TEMPO_2 TEMPO_3 ;Variables para temporizadores TEMP ;Variable temporal PUERTOA PUERTOB PUERTOC PUERTOD endc ;**************************************************** BANK_0 macro ;Macros de selección de bancos bcf STATUS,RP0 endm BANK_1 macro bsf STATUS,RP0 endm MOVFF macro origen,destino ;COPIA EL CONTENIDO DE 'origen' hacia 'destino' movf origen,W movwf destino endm CLR_LCD macro movlw b'00000001' ;Borra el LCD call SEND_INS endm LCD_OFF macro movlw b'00001000' call SEND_INS ;Apaga LCD endm LCD_ON macro movlw b'00001100' call SEND_INS ;Enciende LCD, con cursor off, blind off endm L1_P0 macro movlw 0X80 ;Coloca el cursor en línea 1, posición 0 call SEND_INS endm L2_P0 macro movlw 0XC0 ;Coloca el cursor en línea 2, posición 0 call SEND_INS endm ;**************************************************** org 0x00 goto INICIO SEND_CHAR movwf CHAR ;Enviará el carácter existente en w. call BUSY_CHECK ;Chequea el flag busy. MODO_DATO movf CHAR,w movwf PORTB ;Coloca el dato en PORTB EN_LCD ;Pulso Enable 1 uS. nop nop nop nop DIS_LCD return SEND_INS movwf INS ;Enviará la instrucción existente en w call BUSY_CHECK ;Chequea el flag busy movf INS,w movwf PORTB ;Coloca el dato en PORTB EN_LCD ;Pulso Enable 1 uS. nop nop nop nop DIS_LCD return BUSY_CHECK LECTURA ;Chequea el flag busy (ocupado) del LCD. BANK_1 movlw 0xFF movwf TRISB ;Port B entradas para leer el LCD. BANK_0 INSTRUCCION BUSY_1 EN_LCD ;Pulso Enable 1 uS. nop nop nop nop DIS_LCD movf PORTB,w movwf TEMP btfsc TEMP,7 ;Chequea el bit busy goto BUSY_1 ESCRITURA BANK_1 clrf TRISB ;Port B salidas BANK_0 return TEMPO_LCD movlw .40 ;Retardo para inicialización del LCD. movwf TEMPO_1 clrf TEMPO_2 TEMPO_LCD1 decfsz TEMPO_2,f goto TEMPO_LCD1 decfsz TEMPO_1,f goto TEMPO_LCD1 return ;******************************************************************************************* INICIO clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE BANK_1 movlw b'00111111' ;RA0,RA1,RA2,RA3,RA4 y RA5 entradas. movwf TRISA clrf TRISB ;Port B salidas. movlw B'11011111' ;Port C entradas excepto RC5 (línea Enable del LCD). movwf TRISC movlw 0XFF ;Port D entradas movwf TRISD clrf TRISE ;Port E salidas. movlw b'10000010' ;A/D justificado derecha. AN0-AN4 analógicos. AN5-AN7 digitales movwf ADCON1 BANK_0 HCT240_DIS ;Deshabilita las salidas del 74HCT240 movlw b'00111000' ;Envía código inicialización al LCD, 3 veces con un intervalo. call SEND_INS call TEMPO_LCD movlw b'00111000' call SEND_INS call TEMPO_LCD movlw b'00111000' call SEND_INS call TEMPO_LCD ;FIN INICIALIZACION CLR_LCD ;Borra el display LCD_ON ;LCD ON, CURSOR OFF, BLINK OFF. L1_P0 ;Coloca el cursor en la línea 1, poición 0 movlw 'E' call SEND_CHAR movlw 'N' call SEND_CHAR movlw 'T' call SEND_CHAR movlw 'R' call SEND_CHAR movlw 'A' call SEND_CHAR movlw 'D' call SEND_CHAR movlw 'A' call SEND_CHAR movlw 'S' call SEND_CHAR movlw ' ' call SEND_CHAR movlw 'J' call SEND_CHAR movlw '2' call SEND_CHAR movlw '6' call SEND_CHAR movlw '-' call SEND_CHAR movlw 'J' call SEND_CHAR movlw '3' call SEND_CHAR movlw '7' call SEND_CHAR LOOP L2_P0 ;Coloca el cursor en línea 2, posición 0 BANK_1 movlw 0XFF movwf TRISB ;PORTB entradas BANK_0 HCT240_EN ;Habilita las salidas del 74HCT240 MOVFF PORTA,PUERTOA ;Lee y almacena el estado de PORTA, PORTB, PORTC y PORTD. MOVFF PORTB,PUERTOB MOVFF PORTC,PUERTOC MOVFF PORTD,PUERTOD HCT240_DIS ;Deshabilita las salidas del 74HCT240 para que no interfieran con el LCD. call CHEK_B0 ;Chequea cada entrada de sensor digital y envía al LCD un '1' o un '0'. call CHEK_B1 ;El valor enviado al LCD será en invertido del valor leído, porque call CHEK_B2 ;el 74HCT240 invierte el valor recibido. call CHEK_B3 call CHEK_B4 call CHEK_B5 call CHEK_B6 call CHEK_B7 movlw " " call SEND_CHAR ;Separa con un espacio los dos grupos de entradas call CHEK_D6 call CHEK_D7 call CHEK_A4 call CHEK_C0 goto LOOP CHEK_B7 btfss PUERTOB,7 ;Chequea conector J33 goto MANDA_1 goto MANDA_0 CHEK_B6 btfss PUERTOB,6 ;Chequea conector J32 goto MANDA_1 goto MANDA_0 CHEK_B5 btfss PUERTOB,5 ;Chequea conector J31 goto MANDA_1 goto MANDA_0 CHEK_B4 btfss PUERTOB,4 ;Chequea conector J30 goto MANDA_1 goto MANDA_0 CHEK_B3 btfss PUERTOB,3 ;Chequea conector J29 goto MANDA_1 goto MANDA_0 CHEK_B2 btfss PUERTOB,2 ;Chequea conector J28 goto MANDA_1 goto MANDA_0 CHEK_B1 btfss PUERTOB,1 ;Chequea conector J27 goto MANDA_1 goto MANDA_0 CHEK_B0 btfss PUERTOB,0 ;Chequea conector J26 goto MANDA_1 goto MANDA_0 CHEK_D6 btfss PUERTOD,6 ;Chequea conector J34 goto MANDA_1 goto MANDA_0 CHEK_D7 btfss PUERTOD,7 ;Chequea conector J35 goto MANDA_1 goto MANDA_0 CHEK_A4 btfss PUERTOA,4 ;Chequea conector J36 goto MANDA_1 goto MANDA_0 CHEK_C0 btfss PUERTOC,0 ;Chequea conector J37 goto MANDA_1 goto MANDA_0 MANDA_0 movlw 0X30 ;Se envía al LCD el valor detectado ivertido, puesto que call SEND_CHAR ;las entradas son invertidas por el 74HCT240 RETURN MANDA_1 movlw 0X31 call SEND_CHAR RETURN end