TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dbermejo123 en 26 de Febrero de 2007, 21:04:52
-
Soy nuevo en microcontroladores pic yestoy haciendo para el PIC16F8aA la lectura del teclado en el LCD, resulta q tengo un teclado diferente q es este:
RB0 RB1 RB2 RB3
; ^ ^ ^ ^
; | | | |
; |---|---|---|---|
; RB4 --> | 1 | 2 | 3 | A |
; |---|---|---|---|
; RB5 --> | 4 | 5 | 6 | B |
; |---|---|---|---|
; RB6 --> | 7 | 8 | 9 | C |
; |---|---|---|---|
; RB7 --> | * | 0 | . | D |
; |---|---|---|---|
En el programita teclado.inc esta configurado para otro teclado q se vera a continuacion.En la columna RB3 y la fila
RB7 son diferentes las teclas. Queria saber como se podria modificar el teclado que yo quiero del primero
;****************************************************************************************
; TECLADO.INC
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan: realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
; variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
; de no haber ninguna.
;
;Key_BCD: Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
; rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
; rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg: Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
; W debe contener el código BCD y al finalizar la misma W retorna con el có-
; digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
; RB0 RB1 RB2 RB3
; ^ ^ ^ ^ TECLA CODIGO
; | | | | ----- --------------
; |---|---|---|---| 0 01111101 = 0x7D
; RB4 --> | 1 | 2 | 3 | F | 1 11101110 = 0xEE
; |---|---|---|---| 2 11101101 = 0xED
; RB5 --> | 4 | 5 | 6 | E | 3 11101011 = 0xEB
; |---|---|---|---| 4 11011110 = 0xDE
; RB6 --> | 7 | 8 | 9 | D | 5 11011101 = 0xDD
; |---|---|---|---| 6 11011011 = 0xDB
; RB7 --> | A | 0 | B | C | 7 10111110 = 0xBE
; |---|---|---|---| 8 10111101 = 0xBD
; 9 10111011 = 0xBB
; A 01111110 = 0x7E
; B 01111011 = 0x7B
; C 01110111 = 0x77
; D 10110111 = 0xB7
; E 11010111 = 0xD7
; F 11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.
cblock Key_var ;Inicio de las variables
Tecla ;Retorno del código de tecla
Key_1 ;Nº de columnas a explorar
Key_2 ;Temporal de código
Key_Delay_1 ;Variable de temporización
Key_Delay_2 ;Variable de temporización
TRISB_Temp ;Estado temporal de TRISB
endc
;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.
Key_Scan: bsf STATUS,RP0 ;Seleciona página 1
movf TRISB,W
movwf TRISB_Temp ;Salva estado actual de TRISB
movlw b'00001111'
movwf TRISB ;RB0-RB3 entradas, RB4-RB7 salidas
bcf STATUS,RP0 ;Selecciona página 0
movlw 4
movwf Key_1 ;Nº de columnas a explorar
movlw b'01111111'
movwf Tecla ;Columna a activar
Key_Scan_1: movf Tecla,W
movwf PORTB ;Activa columna
nop
movf PORTB,W
movwf Key_2
subwf Tecla,W ;Lee las filas
btfss STATUS,Z ;Hay alguna pulsada ?
goto Key_Scan_2 ;Si, hay alguna pulsada
bsf STATUS,C ;No hay ninguna en esa columna
rrf Tecla,F ;Seleciona siguiente columna
decfsz Key_1,F
goto Key_Scan_1
movlw 0x80
movwf Tecla ;Retorna código 0x80 (no hay pulsación)
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
Key_Scan_2: movlw .10 ;Bucle de temporización de unos 20 mS
movwf Key_Delay_1 ;para evitar el rebote de los pulsado-
Key_Scan_3: clrf Key_Delay_2 ;res.
clrwdt
Key_Scan_4: decfsz Key_Delay_2,F
goto Key_Scan_4
decfsz Key_Delay_1,F
goto Key_Scan_3
movf Tecla,W ;Trás la temporización se lee nuevamente
movwf PORTB ;si la tecla es la misma. Así se evitan
nop ;los rebotes.
movf PORTB,W
subwf Key_2,W
btfss STATUS,Z ;Es la misma ??
goto Key_Scan_1 ;No, seguir con la exploración
movf Key_2,W ;Si guardar en variable de salida "Tecla"
movwf Tecla
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
;*************************************************************************************
;Key_BCD: Convierte un código el código de tecla que haya en la variable "Tecla" y lo
;convierte a Hex. (0-F). El resultado se devuelve en la variable "Tecla"
Key_Tabla movf Key_1,W
addwf PCL,F ;Calcula desplazamiento
retlw 0x7d ;0
retlw 0xee ;1
retlw 0xed ;2
retlw 0xeb ;3
retlw 0xde ;4
retlw 0xdd ;5
retlw 0xdb ;6
retlw 0xbe ;7
retlw 0xbd ;8
retlw 0xbb ;9
retlw 0x7e ;A
retlw 0x7b ;B
retlw 0x77 ;C
retlw 0xb7 ;D
retlw 0xd7 ;E
retlw 0xe7 ;F
Key_BCD: movf Tecla,W
movwf Key_2 ;Almacena el código temporalmente
clrf Key_1 ;Contador BCD a 0
Key_BCD_2 call Key_Tabla ;Busca código en la tabla
subwf Key_2,W ;Compara con el de la tecla
btfsc STATUS,Z ;Coincide ??
goto Key_BCD_1 ;Si
incf Key_1,F ;No, incrementa contador BCD
goto Key_BCD_2
Key_BCD_1 movf Key_1,W
movwf Tecla ;Carga contador BCD en la variable de salida
return
;***************************************************************************************
;BCD_7seg: Rutina de conversión de BCD (0-F) a 7 segmentos. El acumulador W contiene,
;durante la llamada, el código BCD y, al retornar, el correspondiente a 7 segmentos
;
BCD_7seg: andlw b'00001111'
addwf PCL,F ;Desplazamiento sobre la tabla
retlw b'00111111' ;0
retlw b'00000110' ;1
retlw b'01011011' ;2
retlw b'01001111' ;3
retlw b'01100110' ;4
retlw b'01101101' ;5
retlw b'01111101' ;6
retlw b'00000111' ;7
retlw b'01111111' ;8
retlw b'01100111' ;9
retlw b'01110111' ;A
retlw b'01111100' ;B
retlw b'00111001' ;C
retlw b'01011110' ;D
retlw b'01111001' ;E
retlw b'01110001' ;F
-
Hola dbermejo123: No has planteado tu duda o problema, si lo que quieres hacer es reemplazar los símbolos por los que trae tu teclado, solo tienes que hacer lo mismo en el programita, esto es en las dos partes donde están los retlw.
En síntesis desde el 0 al 9 queda tal como está ya que son las mismas teclas y ocupan el mismo lugar, luego en las demás vas reemplazando el binario por el símbolo correspondiente, lo que no sé es como vas a dibujar el asterisco...
Saludos.
-
Esa es la duda q tengo pero como lo hago para pasar a binaro los restantes Simbolos correspondientes
me lo podrias ponerlo
-
m,........... el codigo q tienes funcionara?, si estas comenzando sugiero q vayas paso por paso, por ejemplo, primero resume ese codigo de teclado y haz tu propia version, de poco a poco se llega lejos!!! :-/
-
Hola dbermejo: 1º ese programita que tienes lo probaste?, sino hacelo funcionar con tu teclado, verás que algunas teclas no corresponden, por lo tanto esas son las que tendrás que ir modificando en tu programa.
2º entiendes el programa tal como está? creo que es lo primero que debes ir haciendo, si hay algo que no entiendes, pregunta y te vamos a ayudar.
Como ayuda te puedo decir que para el resultado final lo que vas a tener que modificar es la última parte del código... ;-)
saludos...
-
se mas o menos de que va el programa , lo q necesito es crear una rutina que me diga que tal fila y columna es tal tecla y asi... en todas las teclas y no se como me podrias ayudarme. Yo pienso que hay que quitar la rutina de KEYBCD y sustituir una creada para nuestro teclado
-
Para que lo estás haciendo? es un trabajo de la escuela? o un encargue?
-
es que estoy haciendo un entrenador para el PIC16F88 que es un proyecto que nos ha mandado en el ciclo de Electrónica
-
Mi idea era que lo dedujeras tu mismo, pero veo que no tienes mucha idea ni tampoco ganas de aprender, por lo tanto te lo he resuelto para que no reniegues más.
Te vá a servir para zafar de la materia, lamentablemente te estás perdiendo de ganar una herramienta mucho más importante que es aprender.
saludos.
;****************************************************************************************
; TECLADO.INC
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan: realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
; variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
; de no haber ninguna.
;
;Key_BCD: Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
; rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
; rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg: Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
; W debe contener el código BCD y al finalizar la misma W retorna con el có-
; digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
; RB0 RB1 RB2 RB3 TECLA CODIGO
; ^ ^ ^ ^ ----- ---------------
; |---|---|---|---| 0 01111101 = 0x7D
; RB4 --> | 1 | 2 | 3 | A | 1 11101110 = 0xEE
; |---|---|---|---| 2 11101101 = 0xED
; RB5 --> | 4 | 5 | 6 | B | 3 11101011 = 0xEB
; |---|---|---|---| 4 11011110 = 0xDE
; RB6 --> | 7 | 8 | 9 | C | 5 11011101 = 0xDD
; |---|---|---|---| 6 11011011 = 0xDB
; RB7 --> | * | 0 | . | D | 7 10111110 = 0xBE
; |---|---|---|---| 8 10111101 = 0xBD
; 9 10111011 = 0xBB
; * 01111110 = 0x7E
; . 01111011 = 0x7B
; D 01110111 = 0x77
; C 10110111 = 0xB7
; B 11010111 = 0xD7
; A 11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.
cblock Key_var ;Inicio de las variables
Tecla ;Retorno del código de tecla
Key_1 ;Nº de columnas a explorar
Key_2 ;Temporal de código
Key_Delay_1 ;Variable de temporización
Key_Delay_2 ;Variable de temporización
TRISB_Temp ;Estado temporal de TRISB
endc
;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.
Key_Scan bsf STATUS,RP0 ;Seleciona página 1
movf TRISB,W
movwf TRISB_Temp ;Salva estado actual de TRISB
movlw b'00001111'
movwf TRISB ;RB0-RB3 entradas, RB4-RB7 salidas
bcf STATUS,RP0 ;Selecciona página 0
movlw .4
movwf Key_1 ;Nº de columnas a explorar
movlw b'01111111'
movwf Tecla ;Columna a activar
Key_Scan_1 movf Tecla,W
movwf PORTB ;Activa columna
nop
movf PORTB,W
movwf Key_2
subwf Tecla,W ;Lee las filas
btfss STATUS,Z ;Hay alguna pulsada ?
goto Key_Scan_2 ;Si, hay alguna pulsada
bsf STATUS,C ;No hay ninguna en esa columna
rrf Tecla,F ;Seleciona siguiente columna
decfsz Key_1,F
goto Key_Scan_1
movlw 0x80
movwf Tecla ;Retorna código 0x80 (no hay pulsación)
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
Key_Scan_2 movlw .10 ;Bucle de temporización de unos 20 mS
movwf Key_Delay_1 ;para evitar el rebote de los pulsadores.
Key_Scan_3 clrf Key_Delay_2
clrwdt
Key_Scan_4 decfsz Key_Delay_2,F
goto Key_Scan_4
decfsz Key_Delay_1,F
goto Key_Scan_3
movf Tecla,W ;Trás la temporización se lee nuevamente
movwf PORTB ;si la tecla es la misma. Así se evitan
nop ;los rebotes.
movf PORTB,W
subwf Key_2,W
btfss STATUS,Z ;Es la misma ??
goto Key_Scan_1 ;No, seguir con la exploración
movf Key_2,W ;Si guardar en variable de salida "Tecla"
movwf Tecla
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
;*************************************************************************************
;Key_BCD: Convierte un código el código de tecla que haya en la variable "Tecla" y lo
;convierte a Hex. (0-F). El resultado se devuelve en la variable "Tecla"
Key_Tabla movf Key_1,W
addwf PCL,F ;Calcula desplazamiento
retlw 0x7d ;0
retlw 0xee ;1
retlw 0xed ;2
retlw 0xeb ;3
retlw 0xde ;4
retlw 0xdd ;5
retlw 0xdb ;6
retlw 0xbe ;7
retlw 0xbd ;8
retlw 0xbb ;9
retlw 0x7e ;*
retlw 0x7b ;.
retlw 0x77 ;D
retlw 0xb7 ;C
retlw 0xd7 ;B
retlw 0xe7 ;A
Key_BCD movf Tecla,W
movwf Key_2 ;Almacena el código temporalmente
clrf Key_1 ;Contador BCD a 0
Key_BCD_2 call Key_Tabla ;Busca código en la tabla
subwf Key_2,W ;Compara con el de la tecla
btfsc STATUS,Z ;Coincide ??
goto Key_BCD_1 ;Si
incf Key_1,F ;No, incrementa contador BCD
goto Key_BCD_2
Key_BCD_1 movf Key_1,W
movwf Tecla ;Carga contador BCD en la variable de salida
return
;***************************************************************************************
;BCD_7seg: Rutina de conversión de BCD (0-F) a 7 segmentos. El acumulador W contiene,
;durante la llamada, el código BCD y, al retornar, el correspondiente a 7 segmentos
;
BCD_7seg andlw b'00001111'
addwf PCL,F ;Desplazamiento sobre la tabla
retlw b'00111111' ;0
retlw b'00000110' ;1
retlw b'01011011' ;2
retlw b'01001111' ;3
retlw b'01100110' ;4
retlw b'01101101' ;5
retlw b'01111101' ;6
retlw b'00000111' ;7
retlw b'01111111' ;8
retlw b'01100111' ;9
retlw b'01110000' ;*
retlw b'10000000' ;.
retlw b'01011110' ;d
retlw b'00111001' ;c
retlw b'01111100' ;b
retlw b'01110111' ;a
-
Perdona por todo, no sabia que era la rutina de BCD_7seg donde habia que decir las teclas por el que querias y pasarlo a binario pensaba que era para los displays, es que no se me da bien lo de los PIC. He estado haciendo uno, una rutina esta semana pero todavia no me funciona que es esta para KEY_BCD:
Key_BCD: CLRF Tecla
MOVLW b'11101111'
MOVWF PORTB
BTFSS PORTB,0
GOTO n2
RETLW '1'
n2:BTFSS PORTB,1
GOTO n3
RETLW '2'
n3:BTFSS PORTB,2
GOTO letraA
RETLW '3'
letraA:BTFSS PORTB,3
GOTO n4
RETLW 'A'
n4:MOVLW b'11011111'
MOVWF PORTB
BTFSS PORTB,0
GOTO n5
RETLW '4'
n5:BTFSS PORTB,1
GOTO n6
RETLW '5'
n6:BTFSS PORTB,2
GOTO letraB
RETLW '6'
letraB:BTFSS PORTB,3
GOTO n7
RETLW 'B'
n7:MOVLW b'10111111'
MOVWF PORTB
BTFSS PORTB,0
GOTO n8
RETLW '7'
n8:BTFSS PORTB,1
GOTO n9
RETLW '8'
n9:BTFSS PORTB,2
GOTO letraC
RETLW '9'
letraC:BTFSS PORTB,3
GOTO estrella
RETLW 'C'
estrella:MOVLW b'01111111'
MOVWF PORTB
BTFSS PORTB,0
GOTO n0
RETLW '*'
n0:BTFSS PORTB,1
GOTO n#
RETLW '0'
n#:BTFSS PORTB,2
GOTO letraD
RETLW '#'
letraD:BTFSS PORTB,3
GOTO fin
RETLW 'D'
fin:return
-
la herramienta teclado.inc que no me funcina los del teclado de las que habian que modificar por otras, me siguen saliendo como desde el principio. No se cual es el problema . Yo he estado haciendo un programa para que me lea lo que pulso en el teclado que es este:
ejem3.4.asm
List p=F16F88 ;Tipo de procesador
include "P16F88.INC" ;Definiciones de registros internos
__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
Lcd_var equ 0x20 ;Inicio de las variables para el LCD
Key_var equ 0x21 ;Inicio de las variables del teclado
Contador_C equ 0x22 ;Contador de caracteres
Contador_L equ 0x23 ;Contador de líneas
org 0x00 ;Vector de reset
goto Inicio
org 0x05 ;Salva vector de interrupción
include "LCD_CXX.INC" ;Incluir rutinas de manejo del LCD
include "TECLADO.INC" ;Incluir rutinas de manejo del teclado
Inicio: bsf STATUS,RP0 ;Selecciona página 1 de datos
clrf ANSEL ;puertos como E/S digital.
movlw b'00001111'
movwf OPTION_REG ;Preescalr de 128 asignado al WDT
bcf INTCON,GIE ;Desconectar interrupciones
bcf STATUS,RP0 ;Selecciona página 0 de datos
clrwdt ;Refrescar WDT
call UP_LCD ;Configura Puerta A y B como salidas
call LCD_INI ;Rutina de inicialización del LCD
movlw b'00001110'
call LCD_REG ;LCD en ON, cursor ON
Borra_LCD movlw b'00000001'
call LCD_REG ;Borra LCD y HOME
Inicia_L movlw .2
movwf Contador_L ;Inicia contador de líneas
Inicia_C movlw .16
movwf Contador_C ;Inicia contador de caracteres
Loop: clrwdt ;Refrescar el WDT
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ?
goto Loop ;No, seguir explorando
call Key_BCD ;Convierte código de tecla a código BCD
movf Tecla,W
sublw .9
btfss STATUS,C ;Es mayor que 9 (A, B,C,D,E,F)?
goto Mayor_que_9 ;Si
movf Tecla,W ;No
addlw 0x30 ;Ajuste ASCII de los caracteres del 0 al 9
goto Visualiza
Mayor_que_9 movf Tecla,W
addlw 0x37 ;Ajuste ASCII de los caracteres de la A a la F
Visualiza call LCD_DATO ;Visualiza sobre el LCD
;Es necesario esperar que se libere la tecla pulsada, de lo contrario la visualización
;de esta se repetiría varias veces. Se puede comprobar su efecto si se anulan las 5
;instrucciones que vienen a continuación.
Tecla_pulsada call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,F
btfss STATUS,Z ;Se ha liberado ??
goto Tecla_pulsada ;Todavía no
decfsz Contador_C,F ;Se han imprimido 16 caracteres ??
goto Loop ;No
movlw 0xc0
call LCD_REG ;Si posiciona cursor en la siguiente línea
decfsz Contador_L,F ;Se han imprimido 2 líneas ??
goto Inicia_C ;No, se imprimen otros 16 caracteres
goto Borra_LCD ;Si, se inicia el LCD
end ;Fin del programa fuente
Luego hice unas modificaciones en el teclado.inc q hice una rutina en el KeyBCD y resulta que se me visualiza a 0 todas las teclas que pulso, queria que me ayudarais a solucionar el problema, por favor
;****************************************************************************************
; TECLADO.INC
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan: realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
; variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
; de no haber ninguna.
;
;Key_BCD: Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
; rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
; rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg: Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
; W debe contener el código BCD y al finalizar la misma W retorna con el có-
; digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
; RB0 RB1 RB2 RB3 TECLA CODIGO
; ^ ^ ^ ^ ----- ---------------
; |---|---|---|---| 0 01111101 = 0x7D
; RB4 --> | 1 | 2 | 3 | A | 1 11101110 = 0xEE
; |---|---|---|---| 2 11101101 = 0xED
; RB5 --> | 4 | 5 | 6 | B | 3 11101011 = 0xEB
; |---|---|---|---| 4 11011110 = 0xDE
; RB6 --> | 7 | 8 | 9 | C | 5 11011101 = 0xDD
; |---|---|---|---| 6 11011011 = 0xDB
; RB7 --> | * | 0 | . | D | 7 10111110 = 0xBE
; |---|---|---|---| 8 10111101 = 0xBD
; 9 10111011 = 0xBB
; * 01111110 = 0x7E
; . 01111011 = 0x7B
; D 01110111 = 0x77
; C 10110111 = 0xB7
; B 11010111 = 0xD7
; A 11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.
cblock Key_var ;Inicio de las variables
Tecla ;Retorno del código de tecla
Key_1 ;Nº de columnas a explorar
Key_2 ;Temporal de código
Key_Delay_1 ;Variable de temporización
Key_Delay_2 ;Variable de temporización
TRISB_Temp ;Estado temporal de TRISB
endc
;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.
Key_Scan bsf STATUS,RP0 ;Seleciona página 1
movf TRISB,W
movwf TRISB_Temp ;Salva estado actual de TRISB
movlw b'00001111'
movwf TRISB ;RB0-RB3 entradas, RB4-RB7 salidas
bcf STATUS,RP0 ;Selecciona página 0
movlw .4
movwf Key_1 ;Nº de columnas a explorar
movlw b'01111111'
movwf Tecla ;Columna a activar
Key_Scan_1 movf Tecla,W
movwf PORTB ;Activa columna
nop
movf PORTB,W
movwf Key_2
subwf Tecla,W ;Lee las filas
btfss STATUS,Z ;Hay alguna pulsada ?
goto Key_Scan_2 ;Si, hay alguna pulsada
bsf STATUS,C ;No hay ninguna en esa columna
rrf Tecla,F ;Seleciona siguiente columna
decfsz Key_1,F
goto Key_Scan_1
movlw 0x80
movwf Tecla ;Retorna código 0x80 (no hay pulsación)
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
Key_Scan_2 movlw .10 ;Bucle de temporización de unos 20 mS
movwf Key_Delay_1 ;para evitar el rebote de los pulsadores.
Key_Scan_3 clrf Key_Delay_2
clrwdt
Key_Scan_4 decfsz Key_Delay_2,F
goto Key_Scan_4
decfsz Key_Delay_1,F
goto Key_Scan_3
movf Tecla,W ;Trás la temporización se lee nuevamente
movwf PORTB ;si la tecla es la misma. Así se evitan
nop ;los rebotes.
movf PORTB,W
subwf Key_2,W
btfss STATUS,Z ;Es la misma ??
goto Key_Scan_1 ;No, seguir con la exploración
movf Key_2,W ;Si guardar en variable de salida "Tecla"
movwf Tecla
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
;*************************************************************************************
;Key_BCD:
CLRF Tecla
MOVLW b'11101111'
MOVWF PORTB
call retardo
BTFSS PORTB,0
GOTO n2
RETLW '1'
n2:BTFSS PORTB,1
GOTO n3
RETLW '2'
n3:BTFSS PORTB,2
GOTO letraA
RETLW '3'
letraA:BTFSS PORTB,3
GOTO n4
RETLW 'A'
n4:MOVLW b'11011111'
MOVWF PORTB
call retardo
BTFSS PORTB,0
GOTO n5
RETLW '4'
n5:BTFSS PORTB,1
GOTO n6
RETLW '5'
n6:BTFSS PORTB,2
GOTO letraB
RETLW '6'
letraB:BTFSS PORTB,3
GOTO n7
RETLW 'B'
n7:MOVLW b'10111111'
MOVWF PORTB
call retardo
BTFSS PORTB,0
GOTO n8
RETLW '7'
n8:BTFSS PORTB,1
GOTO n9
RETLW '8'
n9:BTFSS PORTB,2
GOTO letraC
RETLW '9'
letraC:BTFSS PORTB,3
GOTO estrella
RETLW 'C'
estrella:MOVLW b'01111111'
MOVWF PORTB
call retardo
BTFSS PORTB,0
GOTO n0
RETLW '*'
n0:BTFSS PORTB,1
GOTO n#
RETLW '0'
n#:BTFSS PORTB,2
GOTO letraD
RETLW '#'
letraD:BTFSS PORTB,3
GOTO fin
RETLW 'D'
retardo:
;retardo de los pulsadores
bsf STATUS, RP0
movlw b'00000110'
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, TMR0IF
clrf TMR0
espera1:btfss INTCON, TMR0IF
goto espera1
return
fin:return
-
Al final ya me funcionó,aqui esta por si lo quiere alguien :-/ :-/
;****************************************************************************************
; TECLADO.INC
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan: realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
; variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
; de no haber ninguna.
;
;Key_BCD: Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
; rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
; rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg: Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
; W debe contener el código BCD y al finalizar la misma W retorna con el có-
; digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
; RB0 RB1 RB2 RB3
; ^ ^ ^ ^ TECLA CODIGO
; | | | | ----- --------------
; |---|---|---|---| 0 01111101 = 0x7D
; RB4 --> | 1 | 2 | 3 | A | 1 11101110 = 0xEE
; |---|---|---|---| 2 11101101 = 0xED
; RB5 --> | 4 | 5 | 6 | B | 3 11101011 = 0xEB
; |---|---|---|---| 4 11011110 = 0xDE
; RB6 --> | 7 | 8 | 9 | C | 5 11011101 = 0xDD
; |---|---|---|---| 6 11011011 = 0xDB
; RB7 --> | * | 0 | . | D | 7 10111110 = 0xBE
; |---|---|---|---| 8 10111101 = 0xBD
; 9 10111011 = 0xBB
; * 01111110 = 0x7E
; . 01111011 = 0x7B
; D 01110111 = 0x77
; C 10110111 = 0xB7
; B 11010111 = 0xD7
; A 11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.
cblock Key_var ;Inicio de las variables
Tecla ;Retorno del código de tecla
Key_1 ;Nº de columnas a explorar
Key_2 ;Temporal de código
Key_Delay_1 ;Variable de temporización
Key_Delay_2 ;Variable de temporización
TRISB_Temp ;Estado temporal de TRISB
endc
;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.
Key_Scan: bsf STATUS,RP0 ;Seleciona página 1
movf TRISB,W
movwf TRISB_Temp ;Salva estado actual de TRISB
movlw b'00001111'
movwf TRISB ;RB0-RB3 entradas, RB4-RB7 salidas
bcf STATUS,RP0 ;Selecciona página 0
movlw 4
movwf Key_1 ;Nº de columnas a explorar
movlw b'01111111'
movwf Tecla ;Columna a activar
Key_Scan_1: movf Tecla,W
movwf PORTB ;Activa columna
nop
movf PORTB,W
movwf Key_2
subwf Tecla,W ;Lee las filas
btfss STATUS,Z ;Hay alguna pulsada ?
goto Key_Scan_2 ;Si, hay alguna pulsada
bsf STATUS,C ;No hay ninguna en esa columna
rrf Tecla,F ;Seleciona siguiente columna
decfsz Key_1,F
goto Key_Scan_1
movlw 0x80
movwf Tecla ;Retorna código 0x80 (no hay pulsación)
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
Key_Scan_2: movlw .10 ;Bucle de temporización de unos 20 mS
movwf Key_Delay_1 ;para evitar el rebote de los pulsado-
Key_Scan_3: clrf Key_Delay_2 ;res.
clrwdt
Key_Scan_4: decfsz Key_Delay_2,F
goto Key_Scan_4
decfsz Key_Delay_1,F
goto Key_Scan_3
movf Tecla,W ;Trás la temporización se lee nuevamente
movwf PORTB ;si la tecla es la misma. Así se evitan
nop ;los rebotes.
movf PORTB,W
subwf Key_2,W
btfss STATUS,Z ;Es la misma ??
goto Key_Scan_1 ;No, seguir con la exploración
movf Key_2,W ;Si guardar en variable de salida "Tecla"
movwf Tecla
movf TRISB_Temp,W
bsf STATUS,RP0 ;Selecciona página 1
movwf TRISB ;Repone TRISB al valor original
bcf STATUS,RP0 ;Selecciona página 0
return ;Fin de exploración
;***************************************************************************************
Key_BCD:
bsf STATUS,RP0 ;Seleciona página 1
movlw b'00001111'
movwf TRISB ;RB0-RB3 entradas, RB4-RB7 salidas
bcf STATUS,RP0 ;Selecciona página 0
CLRF Tecla
MOVLW b'11101111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n2
RETLW '1'
n2:BTFSC PORTB,1
GOTO n3
RETLW '2'
n3:BTFSC PORTB,2
GOTO letraA
RETLW '3'
letraA:BTFSC PORTB,3
GOTO n4
RETLW 'A'
n4:MOVLW b'11011111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n5
RETLW '4'
n5:BTFSC PORTB,1
GOTO n6
RETLW '5'
n6:BTFSC PORTB,2
GOTO letraB
RETLW '6'
letraB:BTFSC PORTB,3
GOTO n7
RETLW 'B'
n7:MOVLW b'10111111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n8
RETLW '7'
n8:BTFSC PORTB,1
GOTO n9
RETLW '8'
n9:BTFSC PORTB,2
GOTO letraC
RETLW '9'
letraC:BTFSC PORTB,3
GOTO estrella
RETLW 'C'
estrella:MOVLW b'01111111'
MOVWF PORTB
call retardo
BTFSC PORTB,0
GOTO n0
RETLW '*'
n0:BTFSC PORTB,1
GOTO n#
RETLW '0'
n#:BTFSC PORTB,2
GOTO letraD
RETLW '#'
letraD:BTFSC PORTB,3
GOTO fin
RETLW 'D'
fin:return
retardo:bsf STATUS,RP0
movlw b'00000110'
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, TMR0IF
clrf TMR0
espera1:btfss INTCON,TMR0IF
goto espera1
return
-
de pelos amigo!!!!!!!!!!!!! :-/, voy a probarlo pa ver si tienen bugs :twisted:
-
saludos, talvez os sirva, aca hay varios, o habia nose, yo ya no puedo descargar ninguno, bueno si descarga pero 0 bytes, y no hay nada, muy raro, haber si prueban y me dicen si ustedes ven algo porque recuerdo que el tema 15 del teclado esta en ASM (no lo encuentro por mi disco, y pues ojala alguien pueda descargarlo) y pues talvez sirva, y los otros temas tb son muy interesantes para iniciarse y ver algunas aplicaciones, esas si que no las vi, si alguien puede que porfavor nos lo comente.
link (http://www.educa.madrid.org/web/ies.machado.alcala/web%20insti/depart/electr/apuntes/index.php?&direction=0&order=&directory=dpe/curso2/proyectos/pic%20f_84)