Sie sind auf Seite 1von 13

ERABILITAKO RUTINAK

LEETECLA: CLRF MOVLW simultneamente MOVWF MOVLW XORWF alguna tecla esta pulsada resultado ser distinto de 0 BTFSC GOTO CLRF INCF MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL LEETEC_RET MOVLW MOVWF MOVF RETURN LEETEC1: MOVWF MOVF BTFSS RETURN BTFSS GOTO INCF BTFSS PKYBD,4 LEETEC2 TMP1,F PKYBD,5 ; Se verifica fila 2 PKYBD TMP2,F STATUS,Z ; Tecla recibida previamente ; Se verifica fila 1 ; Se pone seleccionador de fila en el puerto ; Se verifica que no ha sido recibida tecla selca PKYBD TMP2,W ; Se retorna cdigo en W ; Se dejan seleccionadas todas las columnas TMP2 selca ; Se inicializa registro de cdigo COD=0 ; Se seleccionan todas las columnas

PKYBD 0F0h PKYBD,W ; Se leen las columnas y si ; presionada el

STATUS,Z LEETEC_RET TMP1 TMP1,F selc1 LEETEC1 selc2 LEETEC1 selc3 LEETEC1 selc4 LEETEC1 ; Se selecciona columna 4 ; Se selecciona columna 3 ; Se selecciona columna 2 ; Se selecciona columna 1 ; Retorna, no hay teclas presionadas ; Se inicializa registro de barrido BAR=1

GOTO INCF BTFSS GOTO INCF BTFSS GOTO INCF RETURN LEETEC2: MOVF MOVWF RETURN

LEETEC2 TMP1,F PKYBD,6 LEETEC2 TMP1,F PKYBD,7 LEETEC2 TMP1,F ; No se encuentra ninguna fila presionada ; Se verifica fila 4 ; Se verifica fila 3

TMP1,W TMP2

; Se ha descubierto una fila presionada y ; se guarda su cdigo ; Se retorna con el cdigo de fila en TMP2

;----------------------------------------------------------------------; ELIMREB ; Elimina rebote de teclado ; Recibe: W: cdigo leido de tecla, 0 no hay tecla ; Retorna: W: cdigo de tecla ya estable, 0 no hay tecla ELIMREB: MOVWF recibida XORWF BTFSC GOTO MOVF MOVWF CLRF RETLW ELIM_IG: MOVLW SUBWF BTFSC GOTO INCF RETLW nminv TEC_numv,W STATUS,Z ELIM_EST TEC_numv,F 0 TEC_ant,W STATUS,Z ELIM_IG TMP1,W TEC_ant TEC_numv 0 ; Se verifica si es igual a la tecla anterior ; ; Caso de tecla distinta ; Se actualiza tecla anterior ; ; Se inicializa contador de nmero de veces ; Se indica 'no tecla' ; Caso de tecla igual ; Se verifica si es estable durante un ; nmero mnimo de veces ; ; Caso an no estable TMP1 ; Se almacena temporalmente la tecla

ELIM_EST: MOVF RETURN ;----------------------------------------------------------------------; REPORTT ; Reporta una vez una tecla cuando se presiona ; Recibe: W: cdigo leido y filtrado de tecla, 0 no hay tecla ; Retorna: W: cdigo de tecla, 0 no hay tecla ; STATUS: flag Zero debidamente ajustado TMP1,W

; Caso estable

REPORTT: IORLW BTFSC GOTO RE_TEC: BSF tecla" BTFSC reportada RETLW BSF BCF tecla" RETURN RE_NTEC: BCF ANDLW Z) RETURN ;----------------------------------------------------------------------; INITTEC ; Inicializa puerto de teclado INITTEC: BSF MOVLW MOVWF BCF STATUS,RP0 B'11110000' PKYBD OPTION_REG&7F,NOT_RBPU ; Banco 1 ; Configuracin de puerto B: ; RB7-RB4 entrada, RB3-RB0 salida ; Pull ups activados TEC_flg,F_rep 0 ; No hay tecla, se marca no reportado ; Se retorna 0: tecla ya reportada (ajusta flag ; Se retorna cdigo de tecla 0 TEC_flg,F_rep STATUS,Z ; (RETLW 0 no ajusta el flag de Zero) ; Se reporta tecla, marcando tecla reportada ; Se limpia el flag de Zero indicando "hay TEC_flg,F_rep ; Tecla presionada, se verifica si fue STATUS,Z ; Se activa flag Zero, para indicar "no hay 0 STATUS,Z RE_NTEC ; Se verifica si hay tecla

BCF MOVLW MOVWF CLRF CLRF CLRF RETURN

STATUS,RP0 selca PKYBD TEC_ant TEC_flg TEC_numv

; Banco 0 ; Selecciona todas columnas

; Se inicializan variables

;----------------------------------------------------------------------; CRONO ; Contador de minutos y segundos en BCD CRONO: INCF MOVLW ADDWF BTFSS RETURN CLRF INCF MOVLW ADDWF BTFSS RETURN CLRF INCF MOVLW ADDWF BTFSS RETURN CLRF INCF MOVLW ADDWF BTFSS RETURN UNIDMIN DECEMIN,F -d'6' DECEMIN,W STATUS,C ; ; Se incrementan las decenas de minutos DECESEG UNIDMIN,F -d'10' UNIDMIN,W STATUS,C ; Se incrementan las unidades de minutos UNIDSEG DECESEG,F -d'10' DECESEG,W STATUS,C ; Se incrementan las decenas de segundos UNIDSEG,F -d'10' UNIDSEG,W STATUS,C ; Se incrementan las unidades de segundos

CLRF 00:00 RETURN

DECEMIN

; Al llegar a 59:59 se retorna a

;----------------------------------------------------------------------; INITPORTS (PIC16F88X) ; Inicializa puertos en procesadores de la serie 88X INITPORTS: BSF BSF CLRF CLRF BCF BCF RETURN ;----------------------------------------------------------------------; TEXTO ; Visualiza un texto en pantalla LCD TEXTO: MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL RETURN ;----------------------------------------------------------------------; INITLCD ; Inicializa pantalla y puerto de pantalla INITLCD: BSF MOVLW STATUS, RP0 0F0h ; Se reconfigura puerto de datos LCD ; 4 bits de datos = Salida cur_hm LCDIWR 'H' LCDDWR 'O' LCDDWR 'L' LCDDWR 'A' LCDDWR ; Se toma cada letra en ASCII y ; se envia a la pantalla ; Se ubica el cursor en el inicio STATUS,RP0 STATUS,RP1 ANSEL&7F ANSELH&7F STATUS,RP0 STATUS,RP1 ; Puerto A digital para PIC16F88x ; Puerto B digital para PIC16F88x ; Cambio de banco ; Cambio de banco

ANDWF BCF BCF BCF BCF BCF BCF BCF MOVLW ANDWF MOVLW IORWF MOVLW CALL BSF BCF MOVLW CALL BSF BCF MOVLW CALL BSF BCF MOVLW CALL

P_LCDDA,F P_LCDdi,b_LCDdi P_LCDrw,b_LCDrw P_LCDen,b_LCDen STATUS, RP0 P_LCDdi,b_LCDdi P_LCDrw,b_LCDrw P_LCDen,b_LCDen 0F0h P_LCDDA,F B'0011' P_LCDDA,F D'20' LCDWAIT P_LCDen,b_LCDen P_LCDen,b_LCDen D'5' LCDWAIT P_LCDen,b_LCDen P_LCDen,b_LCDen D'1' LCDWAIT P_LCDen,b_LCDen P_LCDen,b_LCDen D'5' LCDWAIT ; Se prepara segundo dato de inicializacin ; ; Tercer envio ; activar strobe / desactivar strobe ; Se esperan 5ms ; Segundo envio ; activar strobe / desactivar strobe ; Se espera 1ms ; Primer envio ; activar strobe / desactivar strobe ; Se esperan 5ms ; Se esperan 20ms ; Dato/instruccin = Instruccin ; Read/Write = Write ; desactiva el strobe ; Se prepara primer dato de inicializacin ; (que hay que enviar 3 veces) ; Dato/instruccin = Salida ; Read/Write = Salida ; Strobe = Salida

MOVLW 0F0h ANDWF P_LCDDA,F MOVLW IORWF BSF BCF MOVLW CALL B'0010'

P_LCDDA,F P_LCDen,b_LCDen P_LCDen,b_LCDen D'5' LCDWAIT ; Envio ; activar strobe / desactivar strobe ; Se esperan 5ms

MOVLW pantalla CALL MOVLW CALL MOVLW CALL MOVLW pantalla CALL MOVLW operacin CALL MOVLW CALL MOVLW CALL RETURN

lcd_set

; Se envia instruccin para fijar tipo de

LCDIWR D'5' LCDWAIT lcd_off LCDIWR lcd_on ; Se envia instruccin para encender ; Se envia instruccin para apagar pantalla ; Se esperan 5ms

LCDIWR lcd_mod ; Se envia instruccin para modo de

LCDIWR lcd_clr LCDIWR D'100' LCDWAIT ; Se esperan 100 ms ; Se envia instruccin para limpiar pantalla

;----------------------------------------------------------------------; LCDDWR ; LCD Data write ; Recibe: W=Dato a escribir LCDDWR: BSF GOTO P_LCDdi,b_LCDdi LCDWRAUX ; Dato/instruccin = Dato

;----------------------------------------------------------------------; LCDIWR ; LCD Instruction write ; Recibe: W=Dato a escribir LCDIWR: BCF GOTO LCDWRAUX: BCF MOVWF MOVLW P_LCDrw,b_LCDrw TMP1 0F0h ; Read/Write = Write ; Se guarda dato para posterior uso ; Se borran bits lsb del puerto P_LCDdi,b_LCDdi LCDWRAUX ; Dato/instruccin = instruccin

ANDWF SWAPF ANDLW IORWF BSF BCF MOVLW ANDWF MOVF ANDLW IORWF BSF BCF CALL RETURN

P_LCDDA,F TMP1,W 00Fh P_LCDDA,F P_LCDen,b_LCDen P_LCDen,b_LCDen 0F0h P_LCDDA,F TMP1,W 00Fh P_LCDDA,F P_LCDen,b_LCDen P_LCDen,b_LCDen LCDBSY ; activa el strobe ; desactiva el strobe ; Se escribe nible inferior ; activa el strobe ; desactiva el strobe ; Se borran bits lsb del puerto ; Se escribe el nible superior

;----------------------------------------------------------------------; CURADD ; Lee direccin del cursor ; Retorna: W=direccin del cursor (0-79d) CURADD: CALL BCF BSF BSF BCF MOVF ANDLW MOVWF SWAPF BSF BCF MOVF ANDLW IORWF LCDDIN P_LCDdi,b_LCDdi P_LCDrw,b_LCDrw P_LCDen,b_LCDen P_LCDen,b_LCDen P_LCDDA,W 07h TMP1 TMP1,F P_LCDen,b_LCDen P_LCDen,b_LCDen P_LCDDA,W 0Fh TMP1,W ; Se lee nibble LSN ; activar strobe / desactivar strobe ; Se lee nibble MSN ; Se reconfigura puerto de datos LCD como entrada ; Dato/instruccin = Instruccion ; Read/Write = Write ; activar strobe / desactivar strobe

CALL RETURN

LCDDOUT

;----------------------------------------------------------------------; LCDWAIT ; Recibe: W=Nmero de milisegundos a esperar LCDWAIT: MOVWF LCDW1: MOVLW MOVWF LCDW2: NOP NOP DECFSZ GOTO DECFSZ GOTO RETURN ;----------------------------------------------------------------------; LCDBSY ; LCD Busy: espera desocupacin de LCD (con time-out) ; Retorna: W=0 desocupado / W=1 error time-out superado LCDBSY: MOVLW MOVWF CALL BCF BSF LCDBS1: BSF BCF MOVF BSF BCF P_LCDen,b_LCDen P_LCDen,b_LCDen P_LCDDA,W P_LCDen,b_LCDen P_LCDen,b_LCDen ; Se lee nibble MSN con busy flag BF ; activar strobe / desactivar strobe ; activar strobe / desactivar strobe lcd_to TMP1 LCDDIN P_LCDdi,b_LCDdi P_LCDrw,b_LCDrw ; Se pone el bus como entrada ; Dato/instruccin = Instruccion ; Read/Write = Read ; Se prepara contador de time-out TMP2,F LCDW2 TMP1,F LCDW1 ; Se decrementa contador bsico ; hasta llegar a cero ; Se repite el contador bsico tantas ; veces como nmero de milisegundos ; Ajustando al milisegundo klcdw TMP2 ; Se almacena contador bsico TMP1 ; Se almacena el nmero de milisegundos en CONT1

ANDLW BTFSC GOTO DECFSZ GOTO CLRF CALL RETLW LCDBS2: CALL RETLW

08h STATUS,Z LCDBS2 TMP1,F LCDBS1 TMP1 LCDDOUT 01 ; Retorna error por time-out ; Desocupado LCDDOUT 00 ; Retorna desocupado sin errores ; Hay time-out ; Se verifica si hay time out ; Si BF=0 el LCD esta desocupado

;----------------------------------------------------------------------; LCDIN ; Rutina de uso particular. Pone el bus de datos LCD como entrada LCDDIN: BSF MOVLW IORWF MOVWF BCF RETURN ; LCDOUT ; Rutina de uso particular. Pone el bus de datos LCD como salida LCDDOUT: BSF MOVLW ANDWF MOVWF BCF MOVF RETURN ; VISCRONO ; Visualizador de nmeros BCD en pantalla LCD VISCRONO: STATUS, RP0 0F0h P_LCDDA,W P_LCDDA STATUS, RP0 TMP1,W ; Se reconfigura puerto de datos LCD ; como salida STATUS, RP0 00Fh P_LCDDA,W P_LCDDA STATUS, RP0 ; Se reconfigura puerto de datos LCD ; como entrada

MOVLW CALL MOVF ADDLW CALL MOVF ADDLW CALL MOVLW CALL MOVF ADDLW CALL MOVF ADDLW CALL RETURN

cur_hm LCDIWR DECEMIN '0' LCDDWR UNIDMIN,W '0' LCDDWR ':' LCDDWR DECESEG,W '0' LCDDWR UNIDSEG,W '0' LCDDWR ,W

; Se manda el cursor a inicio

; Se toman las decenasmin ; se convierte a ASCII ; se envia a la pantalla ; Se toman las decenas ; se convierte a ASCII ; se envia a la pantalla

; se envia a la pantalla ; Se toman las decenaseg ; se convierte a ASCII ; se envia a la pantalla ; Se toman las unidadeseg ; se convierte a ASCII ; se envia a la pantalla

INTERRUPCION POR TIMER 2

;******************************************************************************* ; Registros particulares del programa ; Variables para salvado durante interrupcin SAVEPCL EQU 7C ; Salvado de PCLATH SAVEFSR EQU 7D ; Salvado de FSR SAVEST EQU 7E ; Salvado de Status SAVEW EQU 7F ; Salvado de W (7F, FF, 17F, 1FF) ;********************************************************************************** ; Configuracin de tiempo de timer 2 prescal2 rperiod postscal EQU EQU EQU d'16' d'250' d'10' ; Valor del prescaler (1,4,16) ; Valor en el registro de perodo (0-256) ; Valor calculado para el postscaler (1-16)

;******************************************************************************* ; INTERR ; Atencin a interrupciones. INTERR: ORG MOVWF MOVF CLRF MOVWF MOVF MOVWF MOVF MOVWF CLRF 004 SAVEW STATUS,W STATUS SAVEST FSR,W SAVEFSR PCLATH,W SAVEPCL PCLATH ; Salvado general de registros ; Direccin de Interrupcion ; ; ; ; ; ; ; ; el registro W el Status

el registro indirecto FSR el registro PCLATH

; Se trabajarn interrupciones en primera pagina

;******************* Interrupcin por timer2 INTTMR2: BTFSS GOTO BCF PIR1,TMR2IF SIGINT PIR1,TMR2IF ; Comprueba si es interrupcin por TMR2 ; si no lo es, busca otra posible interrupcin ; Caso que hay interrupcin por TMR2 ; Se resetea interrupcion para prox. vez

;********************************************************** ;*** Insertar aqu la rutina de atencin a Timer 2 *** ;********************************************************** GOTO SIGINT: ;******************* Fin interrupcin por timer2 RETINT: MOVF MOVWF MOVF MOVWF MOVF MOVWF SWAPF SWAPF RETFIE ; Recuperacin general de registros y retorno SAVEPCL,W ; el registro PCLATH PCLATH ; SAVEFSR,W ; el registro indirecto FSR FSR ; SAVEST,W ; el Status STATUS ; SAVEW,F ; el registro W SAVEW,W ; ; RETINT ;

;******************************************************************************* ; INITTMR2 ; Inicializacin del timer 2 INITTMR2:

; Inicializacin timer 2 MOVLW MOVWF BSF MOVLW MOVWF BSF BSF BCF BCF RETURN ; Se escribe constante de configuracin ((prescal2/4)&3) | (prescal2/8) | (postscal-1)*8 | 4 T2CON ; STATUS,RP0 ; Banco 1 rperiod-1 ; Se escribe valor de comparacin de timer 2 PR2&7F ; PIE1&7F,TMR2IE INTCON,PEIE STATUS,RP0 PIR1,TMR2IF ; Se habilita interrupcin por timer 2 ; ; Banco 0 ; Se borra posible flag de interrupcin ;

Das könnte Ihnen auch gefallen