; File TECLADO1F628.ASM ; Assembly code for PIC16F628 microcontroller ; recibe información de teclado matricial de 16 teclas (4 renglones, 4 columnas) y ; cuando se oprime una tecla, despliega en los LEDS el código renglón-columna, ; encendiendo los LEDS correspondientes. ; la velocidad de barrido del teclado es deliberadamente lenta para observar claramente ; el procedimiento. la tecla debe oprimirse durante casi un segundo. ; el programa debe de ejecutarse en el modo AUTORUN. ; Configuración del CPU ; 16F84, Oscilador cristal 4 Mhz, ; watchdog timer off, power-up timer on) ; incluye archivo p16f628.inc processor 16f628 include __config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF #DEFINE BANCO0 BCF STATUS,RP0 #DEFINE BANCO1 BSF STATUS,RP0 I EQU H'24' ;valor columna (salida en puerto B, RB0...RB3) J EQU H'20' ;contador 4 rotaciones K EQU H'21' ;valor renglón (entrada de puerto B, RB4..RB7) L EQU H'22' ;variable subrutina delay M EQU H'23' ;variable subrutina delay PUERTOS MACRO MOVLW H'07' MOVWF CMCON BSF STATUS,RP0 ;ELIJE EL BANCO DE REGISTROS ESPECIALES 1 CLRF VRCON MOVLW H'1E' ;RA0=SALIDA, RA1..RA4=ENTRADAS MOVWF TRISA ;PROGRAMA LA DIRECCIÓN DE LOS BITS MOVLW H'F0' ;RB0..RB3=SALIDAS, RB4...RB7=ENTRADAS MOVWF TRISB BCF OPTION_REG,7 ;RESISTENCIAS DE PULL UP EN PUERTO B, RB4...RB7 BCF STATUS,RP0 ;ELIGE EL BANCO 0 ENDM ; aquí inicia el programa org 0 begin: PUERTOS ;macro: inicializa los puertos A y B. vuelta1: movlw H'EF' ;listo para iniciar rotación movwf I movwf PORTB movlw D'4' movwf J ;contador de 4 corrimientos vuelta2: rrf I,f ;rotación de bits RB0..RB3 en puerto B movfw I movwf PORTB call delay ;50 ms movfw PORTB ;lee el puerto B iorlw H'0F' ;conserva solo los bits RB4...RB7 movwf K comf K,f btfss STATUS,2 ;si la lectura es 0, continúa goto teclazo ;si la lectura es diferente de 0, teclazo... decfsz J,f goto vuelta2 goto vuelta1 teclazo: BANCO1 movlw H'00' movwf TRISB ;programa todos los bits de puerto B como salidas BANCO0 comf I,f ;logica positiva movfw I ;toma valor andlw H'0F' ;solo los bits RB0...RB3 movwf I ;regresa el valor a I movfw K ;lee localidad con contenido andlw H'F0' ;solo bits D4...D7 iorwf I,w ;suma los contenidos de I y K, resultado en W movwf PORTB ;escribe en puerto B, código renglón y columna. malla: goto malla delay: movlw D'250' ;250 milisegundos. cambiar a '50' para funcionamiento normal movwf M mallaM: movwf L mallaL: decfsz L,f goto mallaL decfsz M,f goto mallaM return end