Sie sind auf Seite 1von 10

U N E X P O

Universidad Nacional Experimental Politcnica Antonio Jos de Sucre Vice-Rectorado Puerto Ordaz Departamento Ingeniera Electrnica Microprocesadores I

Integrantes: Yaidith Ferrer Dixon Mendez Lino Marino

Profesor: Rafael Surga Luvo

Puerto Ordaz, Agosto 2013

; ; ; ; ; ; ; ;

Intensivos UNEXPO 2013 Labaoratorio #1 Microcontroladores I Puerto, Interrupciones y manejo de LCD. Yaidith Ferrer Dixon Mendez Lino Marino p=16f877a PORTD LCD_PORT, 2 LCD_PORT, 1 LCD_PORT, 0 ; Bus de datos LCD ; Lnea de control RS del LCD ; Linea de control RW del LCD ; Linea de control E del LCD

list

#define LCD_PORT #define LCD_RS #define LCD_RW #define LCD_E

#include <p16f877a.inc> __config _XT_OSC & _WDT_OFF & _WRT_OFF & _CP_OFF CBLOCK 0x20 LCD_L1 LCD_L2 LCD_L3 LCD_L4 button tmpPCLATH tabla dato conta_1 conta_2 conta_3 waux stataux LCD_X LCD_Y aux aux2 debounce ENDC ORG GOTO 0 _INICIO ; ; ; ; ; ; ; ; ; ; ; ; ; Direccion de la linea 1 Direccion de la linea 2 Direccion de la linea 3 Direccion de la linea 4 Guarda el valor del 'ultimo boton' Parte alta del PC para direccionar.. tablas de datos. 'tabla' guarda la parte baja Dato a enviar al LCD General General General Guarda contexto en las interrupciones

; Posicion X del LCD ; Posicion Y del LCD ; ; ; ; General General Para evitar reemprimir el msg "No hay DipSwitch activo!"

ORG 0x04 ;========================================================== ; Vector de interrupcion ;========================================================== _VECT_INT ; Guarda el contexto MOVWF waux ; Guarda W SWAPF STATUS,W ; Captura STATUS MOVWF stataux ; Guarda STATUS BCF INTCON, GIE ; Deshabilita las interrupciones

BTFSS INTCON, INTF GOTO _EXIT_INT ; SI. MOVLW MOVWF MOVLW CALL

; Ocurrio una interrupcion?? ; NO. Salgo..

Atiende la interrupcion HIGH(_MESG_UB) ; Parte alta de la tabla tmpPCLATH LOW(_MESG_UB) ; Parte baja de la tabla _SEND_STRING ; Envia cadena ; Ultimo boton presionado ; Envia el numero del boton presionado ; Espera a que se libere el pulsador ; Salta a la direccion anterior

MOVFW button CALL _SEND_DIG BTFSS PORTB, 0 GOTO $-1 _EXIT_INT BCF INCF INTCON, INTF debounce, F

; Limpia la bandera ; Se asigna un valor <> 0 para mostrar el mensaje ; "No hay DipSwitch activo!"

; Restauro el contexto SWAPF stataux, W MOVWF STATUS MOVFW waux RETFIE ;========================================================== ; TABLAS DE MENSAJES ;========================================================== _PRESENT ; 1234567890123456 DT "====Lab #1=====", '\n' DT "Curso intensivo", '\n' DT " UNEXPO 2013", '\n' DT " Micros I", 0 _MESG_NO_SW ; 1234567890123456 DT "No hay DipSwitch", '\n' DT "activo!", 0 _MESG_UB ; DT _MSG_DSW2 ; DT DT DT 1234567890123456 "Ultimo Switch: ", 0 1234567890123456 "* Yaidith *", '\n' "* Dixon *", '\n' "* Lino *", 0

;========================================================== ; Modulo principal ;========================================================== _INICIO ; Configuracion BANKSEL TRISD MOVLW B'01110001' MOVWF TRISB CLRF TRISD

; Selecciona banco 1 ; equivalente a usar BSF STATUS, RPx ; Entradas: RB[6,5,4,0] ; RD[7..0] = SALIDA

x=[0,1]

CLRF

OPTION_REG

BANKSEL PORTB CLRF INCF LCD_PORT debounce

; PullUp habilitadas ; Interrupcion INT0 por flanco de bajada ; selecciona banco 0

MOVLW 0 MOVWF LCD_L1 MOVLW 0xC0 MOVWF LCD_L2 MOVLW 0x90 MOVWF LCD_L3 MOVLW 0xD0 MOVWF LCD_L4 BSF BSF CALL MOVLW MOVWF MOVLW CALL CALL CALL CALL

; Direccion de la linea 1 del LCD ; Direccion de la linea 2 ; Direccion de la linea 3 ; Direccion de la linea 4 del LCD del LCD del LCD

INTCON, INTE ; Activa interrupcion externa INTCON, GIE ; Activa las interrupciones _LCD_INIT HIGH(_PRESENT) tmpPCLATH LOW(_PRESENT) _SEND_STRING _Delay_1s _Delay_1s _Delay_1s

_TEST_DPSW1 BTFSC PORTB,4 ; Dip switch1 activo? GOTO _TEST_DPSW2 ; NO. pruebo el siguiente... ;Accionado DipSwitch 1 MOVLW 1 MOVWF button ; button = 1 MOVWF debounce ; Marco MOVLW CALL MOVLW CALL MOVLW MOVWF MOVLW CALL 1 _LCD_CMD 2 _LCD_CMD HIGH(_HAPPY_FACE1) tmpPCLATH LOW(_HAPPY_FACE1) _VIEW_IMG ; Espera hasta el DipSwitch cambie de posicion

BTFSS PORTB, 4 GOTO $-1

_TEST_DPSW2 BTFSC PORTB,5 ; Dip switch2 GOTO _TEST_DPSW3 ; ; Accionado DipSwitch 2 MOVLW 2 ; MOVWF button ; button = 2 MOVWF debounce MOVLW 1

CALL _LCD_CMD MOVLW 2 CALL _LCD_CMD MOVLW MOVWF MOVLW CALL HIGH(_MSG_DSW2) tmpPCLATH LOW(_MSG_DSW2) _SEND_STRING

BTFSS PORTB, 5 GOTO $-1 _TEST_DPSW3 BTFSC PORTB,6 ; Dip switch3 GOTO _NO_SW ; ; Accionado DipSwitch 3 MOVLW 3 MOVWF button ; button = 3 MOVWF debounce MOVLW CALL MOVLW CALL _LOOPx MOVLW MOVWF MOVLW CALL HIGH(_HAPPY_FACE1) tmpPCLATH LOW(_HAPPY_FACE1) _VIEW_IMG 1 _LCD_CMD 2 _LCD_CMD

MOVLW .40 CALL _Delay_ms MOVLW MOVWF MOVLW CALL HIGH(_HAPPY_FACE2) tmpPCLATH LOW(_HAPPY_FACE2) _VIEW_IMG

MOVLW .40 CALL _Delay_ms MOVLW MOVWF MOVLW CALL HIGH(_HAPPY_FACE3) tmpPCLATH LOW(_HAPPY_FACE3) _VIEW_IMG

MOVLW .40 CALL _Delay_ms MOVLW MOVWF MOVLW CALL HIGH(_HAPPY_FACE4) tmpPCLATH LOW(_HAPPY_FACE4) _VIEW_IMG

MOVLW .40 CALL _Delay_ms BTFSS PORTB,6 GOTO _LOOPx _NO_SW ; No se activo ningun DipSwitch ; Dip switch3 activo?

MOVF debounce, F SKPNZ GOTO _TEST_DPSW1 CLRF MOVLW MOVWF MOVLW CALL GOTO

; Vuelve a escanear los DipSwitch's

debounce HIGH(_MESG_NO_SW) tmpPCLATH LOW(_MESG_NO_SW) _SEND_STRING _TEST_DPSW1 ; Vuelve a escanear los DipSwitch's

;========================================================== ; Demora de 160us CLOCK 4MHz ;========================================================== _Delay_160us MOVLW .216 ADDLW 1 BTFSS STATUS, C GOTO $-2 RETURN ;========================================================== ; Demora de x_ms. (x = W) CLOCK 4MHz ;========================================================== _Delay_ms MOVWF MOVLW MOVWF NOP DECFSZ GOTO DECFSZ GOTO RETURN conta_2 d'250' conta_1 conta_1,F $-2 conta_2,F $-6 ; ; ; ; ; ; ; ; conta_2 = W W = 250 conta_1 = W no opera conta_1 = conta_1 - 1 y salta si llego a 0 NO es 0, entonces salta al nop (2 posiciones hacia atras) SI es 0, entonces conta_2 = conta_2 - 1 y salta si llega a 0 Salta 6 posiciones hacia atras ;

;========================================================== ; Demora de 1_s. ;========================================================== _Delay_1s MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF NOP DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO RETURN d'10' conta_3 d'100' conta_2 d'250' conta_1 conta_1,F $-2 conta_2,F $-6 conta_3,F $-.10 ; ; ; ; ; ; ; ; ; ; ; ; ; ; W = m conta_3 = W W = m conta_2 = W W = n conta_1 = W no opera conta_1 = conta_1 NO es 0, entonces SI es 0, entonces No es 0, entonces Si es 0, entonces No es 0, entonces Si es 0, entonces

- 1 y salta si llego a 0 salta al nop conta_2 = conta_2 - 1 y salta si llega a 0 regresa a cargar conta_1 conta_3 = conta_3 - 1 y salta si llega a 0 regresa a cargar conta_1 fin del retardo y regresa

;========================================================== ; TABLA DE GRAFICOS ;========================================================== ;ORG 0x11A ;================================================= ;Cara feliz 1 _HAPPY_FACE1 DT DT DT DT DT DT 0x00, 0x1F, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x10, 0x12, 0x00, 0x09, 0x02, 0x00, 0x08, 0x11, 0x1F, 0x11, 0x04, 0x00, 0x04, 0x08, 0x1F, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x11, 0x11, 0x11, 0x02, 0x00, 0x08, 0x11, 0x11, 0x11, 0x01, 0x00, 0x10, 0x10 0x00 0x01 0x00 0x1F 0x00 ; ; ; ; ; ; CHR1 CHR2 CHR3 CHR4 CHR5 CHR6

;================================================= ;Cara feliz 2 _HAPPY_FACE2 DT DT DT DT DT DT 0x00, 0x1F, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x10, 0x10, 0x00, 0x01, 0x02, 0x00, 0x08, 0x11, 0x00, 0x11, 0x04, 0x00, 0x04, 0x08, 0x1F, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x11, 0x11, 0x11, 0x02, 0x00, 0x08, 0x11, 0x11, 0x11, 0x01, 0x00, 0x10, 0x10 0x00 0x01 0x00 0x1F 0x00 ; ; ; ; ; ; CHR1 CHR2 CHR3 CHR4 CHR5 CHR6

;================================================= ;Cara feliz 3 _HAPPY_FACE3 DT DT DT DT DT DT 0x00, 0x1F, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x10, 0x10, 0x00, 0x01, 0x02, 0x00, 0x08, 0x10, 0x00, 0x01, 0x04, 0x00, 0x04, 0x08, 0x1F, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x11, 0x11, 0x11, 0x02, 0x00, 0x08, 0x11, 0x11, 0x11, 0x01, 0x00, 0x10, 0x10 0x00 0x01 0x00 0x1F 0x00 ; ; ; ; ; ; CHR1 CHR2 CHR3 CHR4 CHR5 CHR6

;================================================= ;Cara feliz 4 _HAPPY_FACE4 DT 0x00, 0x01, 0x02, 0x04, 0x09, 0x12, 0x12, DT 0x1F, 0x00, 0x00, 0x00, 0x11, 0x0A, 0x0A, DT 0x00, 0x10, 0x08, 0x04, 0x12, 0x09, 0x09, DT 0x10, 0x10, 0x10, 0x08, 0x04, 0x02, 0x01, DT 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, DT 0x01, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10,

0x11 0x11 0x11 0x00 0x1F 0x00

; ; ; ; ; ;

CHR1 CHR2 CHR3 CHR4 CHR5 CHR6

;========================================================== ; Interface LCD ;========================================================== #include <lcd.inc> End

; UNEXPO Intensivos 2013 ; Rutinas de soporte para un LCD de 16x4 configurado a 4 bit's ; Rutina de inicializacion del lCD ; Se utiliza la parte alta del RD para el BUS de datos ; y parte baja para control _LCD_INIT MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL RETURN ; Envia un digito _SEND_DIG ADDLW '0' ; Envia un caracter _SEND_CHR BSF ; Envia un comando _LCD_CMD MOVWF dato ANDLW 0xF0 CALL _ENV_NIBB .60 _Delay_ms 0x30 _ENV_NIBB 0x30 _ENV_NIBB 0x30 _ENV_NIBB 0x20 _ENV_NIBB 0x28 _LCD_CMD 0x08 _LCD_CMD 0x01 _LCD_CMD 0x06 _LCD_CMD 0x0C _LCD_CMD ; Demomora de 40ms ; Comando Reset ; Comando Reset ; Comando Reset ; Bus 4 Bit ; 2 lineas, 5x7 ; Turn off the Display ; Clear the Display RAM ; Enable Cursor Move Direction ; Turn the LCD Back On

LCD_RS

;RS = 1 caracter

SWAPF dato, W ANDLW 0xF0 CALL _ENV_NIBB BCF LCD_RS RETURN _ENV_NIBB MOVWF MOVFW ANDLW IORWF MOVWF BSF aux2 LCD_PORT 0x0F aux2, W LCD_PORT LCD_E

GOTO BCF MOVLW CALL RETURN

$+1 LCD_E .5 _Delay_ms

; Rutina para enviar cadenas de caracteres _SEND_STRING MOVWF tabla CLRF LCD_Y MOVLW 1 CALL _LCD_CMD MOVLW 2 CALL _LCD_CMD _NEXT_CHR MOVFW MOVWF MOVFW INCF CALL tmpPCLATH PCLATH tabla tabla,F _EXTRAER

;'tabla' apunta al primer caracter ; Clear LCD ; HOME LCD

; Se incrementa el puntero. ; "Crea el pto de retorno"

MOVWF dato MOVF dato, F SKPNZ RETURN XORLW SKPZ GOTO INCF MOVLW MOVWF MOVFW ADDWF MOVFW CALL GOTO _CONTINUE MOVFW CALL GOTO _EXTRAER MOVWF PCL '\n' _CONTINUE LCD_Y, F 0x20 FSR LCD_Y FSR, F INDF _LCD_CMD _NEXT_CHR dato _SEND_CHR _NEXT_CHR

; Es cero? ; SI. Retorno. ; Es u caracter Nueva Linea? ; No. Envio el caracter ; SI. Incremento el numero de linea

; Se lee el siguiente caracter.

; NO. Se envia el caracter. ; Se lee el siguiente caracter.

; Rutina para posicionar el cursor _POS_XY MOVLW MOVWF MOVFW ADDWF MOVFW ADDWF CALL RETURN 0x20 FSR LCD_Y FSR, F INDF LCD_X, W _LCD_CMD

; Rutina para mostrar datos de la CGRAM _VIEW_IMG MOVWF tabla MOVLW CALL MOVLW MOVWF _LOOP1 MOVFW MOVWF MOVFW INCF CALL CALL DECFSZ GOTO tmpPCLATH PCLATH tabla tabla, F _EXTRACT _SEND_CHR aux _LOOP1 0x40 _LCD_CMD .48 aux ; 6 caracteres de 8 bytes

; Visualizo la imagen MOVLW MOVWF MOVLW MOVWF CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW MOVWF MOVLW MOVWF CALL MOVLW CALL MOVLW CALL MOVLW CALL RETURN _EXTRACT MOVWF PCL 6 LCD_X 1 LCD_Y _POS_XY 0 _SEND_CHR 1 _SEND_CHR 2 _SEND_CHR 6 LCD_X 2 LCD_Y _POS_XY 3 _SEND_CHR 4 _SEND_CHR 5 _SEND_CHR

Das könnte Ihnen auch gefallen