Beruflich Dokumente
Kultur Dokumente
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
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
; 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
DECEMIN
;----------------------------------------------------------------------; 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
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_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 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
;******************************************************************************* ; 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
;******************* 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 ;
; 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 ;