; File TECLADO3.ASM ; Assembly code for PIC16F84 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 ASCII de dicha tecla. ; 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 p16f84.inc processor 16f84 include __config _XT_OSC & _WDT_OFF & _PWRTE_ON #DEFINE BANCO0 BCF STATUS,RP0 #DEFINE BANCO1 BSF STATUS,RP0 I EQU H'1F' ;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 BSF STATUS,RP0 ;ELIJE EL BANCO DE REGISTROS ESPECIALES 1 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 ;RB4...RB7, CON PULL UPS 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 ;lógica positiva movfw I andlw H'0F' ;solo los bits RB0...RB3 movwf I ;regresa el valor a I movfw K ;lee localidad con contenido de rotación andlw H'F0' ;solo bits D4...D7 iorwf I,f ;suma I y K resultado en I movfw I ;suma los contenidos de I y K, resultado en W movwf PORTB ;escribe en puerto B, CODIGO RENGLON COLUMNA ide: movlw D'17' ;pasa a la parte de identificación movwf K ;K = contador de caracteres en la tabla loop: decf K,f ;decrementa K movfw K ;transfiere a W call tabla subwf I,w ;regresa de la tabla con contenido de caracter btfss STATUS,2 ;si I=caracter, se va a etiqueta "found" goto loop found: movfw K movwf PORTB ;muestra en leds contenido de offset. movlw D'16' addwf K,w ;añade 16 localidades a offset call tabla ;trae valor ASCII en tabla movwf PORTB ;despliega en puerto B again: goto again 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 tabla addwf PCL,f ;CÓDIGOS RENGLÓN-COLUMNA retlw H'11' ;'0' retlw H'12' ;'1' retlw H'14' ;'2' retlw H'18' ;'3' retlw H'21' ;'4' retlw H'22' ;'5' retlw H'24' ;'6' retlw H'28' ;'7' retlw H'41' ;'8' retlw H'42' ;'9' retlw H'44' ;'A' retlw H'48' ;'B' retlw H'81' ;'C' retlw H'82' ;'D' retlw H'84' ;'E' retlw H'88' ;'F' ;CODIGOS ASCII retlw H'30' ;'0' retlw H'31' ;'1' retlw H'32' ;'2' retlw H'33' ;'3' retlw H'34' ;'4' retlw H'35' ;'5' retlw H'36' ;'6' retlw H'37' ;'7' retlw H'38' ;'8' retlw H'39' ;'9' retlw H'41' ;'A' retlw H'42' ;'B' retlw H'43' ;'C' retlw H'44' ;'D' retlw H'45' ;'E' retlw H'46' ;'F' end