Skip to content

Instantly share code, notes, and snippets.

@jerivas
Last active May 29, 2024 23:24
Show Gist options
  • Save jerivas/6382489 to your computer and use it in GitHub Desktop.
Save jerivas/6382489 to your computer and use it in GitHub Desktop.
Control de teclado matricial 4x4
;Control de teclado matricial 4x4
;José Eduardo Rivas Melgar RM100161
;David Antonio Escobar Contreras EC100119
;Angel Gerardo Moreno Galan MG070209
;Escanea un teclado matricial de 4x4 y muestra la ultima teclada presionada
;en base 16 en un display de 7 segmentos.
title "Control de teclado matricial"
list p=18f4550
#include <p18f4550.inc>
;Directivas para activar los bits de configuracion
config FOSC = INTOSCIO_EC ;Oscilador Interno, Puerto A RA6 activo,
config WDT = OFF ;Watchdog timer apagado
config PBADEN = OFF ;Parte baja del puerto B digitales
config MCLRE = ON ;MCLRE Disponible
config DEBUG = ON ;Modo de depuracion disponible
config LVP = OFF ;Fuente de ISCP apagada
;------------------------
;DEFINICION DE CONSTANTES
;------------------------
#define display LATD ;PORTD como salida de displays
;Tabla de códigos para display de 7 segmentos
#define cod0 b'00111111' ;0
#define cod1 b'00000110' ;1
#define cod2 b'01011011' ;2
#define cod3 b'01001111' ;3
#define cod4 b'01100110' ;4
#define cod5 b'01101101' ;5
#define cod6 b'01111101' ;6
#define cod7 b'00000111' ;7
#define cod8 b'01111111' ;8
#define cod9 b'01101111' ;9
#define cod10 b'01110111' ;A
#define cod11 b'01111100' ;B
#define cod12 b'00111001' ;C
#define cod13 b'01011110' ;D
#define cod14 b'01111001' ;E
#define cod15 b'01110001' ;F
;----------------------------------------------
;DEFINICION DE MACROS
;http://goo.gl/Ow9gWx Chapter 5: Macro Language
;----------------------------------------------
scan_macro macro
;Escanear las 16 teclas y retornar con el valor presionado en W
local col = 0
local row = 0
while col <= 3 ;Se probaran las columnas del 0 al 3
bcf LATB,#v(col) ;Poner en bajo la columna
row = 0
while row <= 3 ;Se probaran las filas del 0 al 3
btfss PORTA,#v(row) ;La fila esta en alto?
retlw cod#v(4*col+row) ;No: retornar el codigo de la tecla
row++
endw ;Seguir probando filas
bsf LATB,#v(col) ;Volver a poner en alto la columna
col++
endw ;Seguir probando columnas
endm ;Fin de la macro
;--------------
;INICIALIZACION
;--------------
org 0
init:
clrf TRISD ;Configurar todo el puerto D como salida
clrf TRISB ;PORTB como salida
setf LATB ;PORTB en alto (switches activos en bajo)
clrf PORTA ;Limpiar PORTA
movlw 0Fh
movwf ADCON1 ;Deshabilitar A/D
movlw 07h
movwf CMCON ;Deshabilitar comunicacion
setf TRISA ;Configurar PORTA como entrada
movlw b'01000000' ;Codigo de estado "en espera"
;-----------------------------------------------------------------
;Programa principal:
;Rutina que muestra en el display la ultima tecla presionada
;-----------------------------------------------------------------
main:
setf LATB ;Poner PORTB en alto (teclas activas en bajo)
call scan ;Escanear las teclas. Se recibe el codigo en W
movwf display ;Mostrar el codigo en el display
goto main ;Repetir
scan:
scan_macro ;Simplemente se llama a la macro
return ;Si no se presiono nada, no modificar W
end
@MathProcell
Copy link

MathProcell commented May 29, 2024

Dispongo de un código que hice podrías revisarlo, por favor:
.include "m328Pdef.inc"
#define F_CPU 800000UL

;ENTRADAS Y SALIDAS
ldi r21, 0b00001000 ; Configura PB3 como salida PWM
out DDRB, r20

ldi r21, 0b11111111 ; Configura todos los pines de PORTC como salidas para los motores
out DDRC, r21

ldi r21, 0b00001111 ; Configura los pines de PORTD como entradas para el teclado
out DDRD, r21
out PORTD, r21

loop:
in r23, PIND ; Lee la entrada del teclado

;COMPARACIONES 
cpi r19, 0b00010001 ;ADELANTE 
breq case_1
cpi r19, 0b00100001 ;ATRAS
breq case_2
cpi r19, 0b01000001 ;IZQUIERDA
breq case_3
cpi r19, 0b10000001 ;DERECHA
breq case_4
ldi r24, 0b00000000 ; Detiene todos los motores
out PORTC, r24

sbis PINB, PB0
rjmp case_5

sbi PINB, PB0
rjmp case_6

rjmp loop

;CASOS
case_1: ;ADELANTE
ldi r24, 0b00000011
out PORTC, r24

sbi PORTC, PC4 ;PRENDE PC4

ldi r17, 240   ;CICLO DE TRABAJO 
retardo_encendido:
rcall retardo_interno
dec r17
brne retardo_encendido

cbi PORTC, PC4 ;APAGA PC4

ldi r17, 10      ; TIEMPO APAGADO
retardo_apagado:
rcall retardo_interno
dec r17
brne retardo_apagado
rjmp loop        

;RETARDO INTERNO
retardo_interno:
ldi r18, 1
bucle:
dec r18
brne bucle
ret

case_2: ;ATRAS
ldi r24, 0b00001100
out PORTC, r24

sbi PORTC, PC4 ;PRENDE PC4

ldi r17, 240   ;CICLO DE TRABAJO 
retardo_encendido1:
rcall retardo_interno1
dec r17
brne retardo_encendido1

cbi PORTC, PC4 ;APAGA PC4

ldi r17, 10      ; TIEMPO APAGADO
retardo_apagado1:
rcall retardo_interno1
dec r17
brne retardo_apagado1
rjmp loop       

;RETARDO INTERNO
retardo_interno1:
ldi r18, 1
bucle1:
dec r18
brne bucle1
ret

case_3: ;IZQUIERDA
ldi r24, 0b00000001
out PORTC, r24

sbi PORTC, PC4 ;PRENDE PC4

ldi r17, 240   ;CICLO DE TRABAJO 
retardo_encendido2:
rcall retardo_interno2
dec r17
brne retardo_encendido2

cbi PORTC, PC4 ;APAGA PC4

ldi r17, 10      ; TIEMPO APAGADO
retardo_apagado2:
rcall retardo_interno2
dec r17
brne retardo_apagado2
rjmp loop       

;RETARDO INTERNO
retardo_interno2:
ldi r18, 1
bucle2:
dec r18
brne bucle2
ret

case_4: ;DERECHA
ldi r24, 0b00000010
out PORTC, r24

sbi PORTC, PC4 ;PRENDE PC4

ldi r17, 240   ;CICLO DE TRABAJO 
retardo_encendido3:
rcall retardo_interno3
dec r17
brne retardo_encendido3

cbi PORTC, PC4 ;APAGA PC4

ldi r17, 10      ; TIEMPO APAGADO
retardo_apagado3:
rcall retardo_interno3
dec r17
brne retardo_apagado3
rjmp loop       

;RETARDO INTERNO
retardo_interno3:
ldi r18, 1
bucle3:
dec r18
brne bucle3
ret

case_5:
sbi PORTB, PB3 ;PRENDE PB3

ldi r17, 240   ;CICLO DE TRABAJO 
retardo_encendido4:
rcall retardo_interno4
dec r17
brne retardo_encendido4

cbi PORTB, PB3 ;APAGA PB3

ldi r17, 10      ; TIEMPO APAGADO
retardo_apagado4:
rcall retardo_interno4
dec r17
brne retardo_apagado4
rjmp loop       

;RETARDO INTERNO
retardo_interno4:
ldi r18, 25
bucle4:
dec r18
brne bucle4
ret

case_6:
patea:
sbi PORTB, PB3 ;PRENDE PB3

ldi r17, 240   ;CICLO DE TRABAJO 
retardo_encendido5:
rcall retardo_interno5
dec r17
brne retardo_encendido5

cbi PORTB, PB3 ;APAGA PB3 

ldi r17, 10      ; TIEMPO APAGADO
retardo_apagado5:
rcall retardo_interno5
dec r17
brne retardo_apagado5
rjmp loop       

;RETARDO INTERNO
retardo_interno5:
ldi r18, 1
bucle5:
dec r18
brne bucle5
ret

@MathProcell
Copy link

hola

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment