Sei sulla pagina 1di 5

FACULTAD DE INGENIERÍA MECÁNICA Y

ELÉCTRICA
DE LA
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN

Microcontroladores

“Teclado KBI por interrupciones”


Código propuesto

Nombre Semestre Matricula Hora Grupo

Maestro: Semestre:
Rodolfo Rubén Treviño Martinez, M.C. Enero-Junio 2018

Fecha de entrega:

San Nicolás de los Garza, Nuevo León

Calificación
Introducción
En el presente código de programación se presenta la aplicación para el teclado matricial 4x4 por medio de
interrupciones KBI (capítulo 8 del manual del microcontrolador HSC08), hay que tener en consideración
cómo funciona el hardware y qué se necesita hacer para el manejo propio del teclado. Considerar en este
caso la utilización de resistencias externas de 10kΩ para activar el “pulldown” de los puertos de lectura del
teclado de forma manual. En caso de usar sólo la resistencia interna del microcontrolador activar
directamente por medio de los puertos a usar el pullup o pulldown dependiendo el caso; tomando en cuenta
la desactivación del pulldown en el KBI, para no causar problemas de lectura de programa por parte del
microcontrolador.

;*******************************************************************
;* This stationery serves as the framework for a user application. *
;* For a more comprehensive program that demonstrates the more *
;* advanced functionality of this processor, please see the *
;* demonstration applications, located in the examples *
;* subdirectory of the "Freescale CodeWarrior for HC08" program *
;* directory. *
;*******************************************************************

; Include derivative-specific definitions


INCLUDE 'derivative.inc'

;
; export symbols
;
XDEF _Startup
ABSENTRY _Startup

;
; variable/data section
;
ORG RAMStart ; Insert your data definition here
ExampleVar: DS.B 1

;
; code section
;
ORG ROMStart

_Startup:
LDHX #RAMEnd+1 ; initialize the stack pointer
TXS
CLI ; enable interrupts
MOV #$F0,PTBD ;habilita el puerto B como registro de datos

MOV #$F0,PTBDD ;asigna al puerto B los 4 bits más


;significativos como salidas, los otros 4
;como entradas (1111 0000)

MOV #$00,PTCD ; habilita el puerto C


MOV #$FF,PTCDD ; asigna el valor 1111 1111 al puerto C como
;salida

BCLR 1,KBISC ;limpia el bit 1 del KBISC, siendo el KBMOD


MOV #$F0,KBIES ; asigna que los bits de interrupción serían
;pulldown (1111 0000)

MOV #$F0,KBIPE ;asigna que bits son los de interrupción de


;teclado(1111 0000)

BCLR 2,KBISC ; limpia el bit 2 KBIE, que habilita /deshabilita


;la interrupción por teclado
BSET 2,KBISC ;habilita el KBIE
BSET 1,KBISC ;habilita el KBMOD
JSR RETARDO ;manda una subrutina retardo, este con el objeto
;de evitar los rebotes en la interrupción
mainLoop:

NOP
feed_watchdog
BRA mainLoop

Teclado:
COLUMNA1:
MOV #$80, PTBD ;habilita el pin 7 del PTBD limpia el bit 4,6,5
BRSET 0,PTBD,Tecla1
JSR RETARDO ;lleva a la subrutina retardo
BRSET 1,PTBD,Tecla4
JSR RETARDO
BRSET 2,PTBD,Tecla7
JSR RETARDO
BRSET 3,PTBD,TeclaAS
JSR RETARDO
BRA COLUMNA2 ;en caso de falso, salta a columna 2

Tecla1:
MOV #$01,PTCD
JMP END

Tecla4:
MOV #$04,PTCD
JMP END
Tecla7:

MOV #$07,PTCD
JMP END

TeclaAS:
MOV #$0F,PTCD
JMP END

COLUMNA2:
MOV #$40,PTBD ;habilita el pin 6 del PTBD limpia el bit 7,4,5

BRSET 0,PTBD,Tecla2
JSR RETARDO
BRSET 1,PTBD,Tecla5
JSR RETARDO
BRSET 2,PTBD,Tecla8
JSR RETARDO
BRSET 3,PTBD,Tecla0
JSR RETARDO
BRA COLUMNA3
Tecla2:

MOV #$02,PTCD
JMP END

Tecla5:
MOV #$05,PTCD
JMP END

Tecla8:
MOV #$08,PTCD
JMP END

Tecla0:
MOV #$10,PTCD
JMP END

COLUMNA3:
MOV #$20, PTBD ;habilita el pin 5 del PTBD limpia el bit 4,6,7
BRSET 0,PTBD,Tecla3
JSR RETARDO
BRSET 1,PTBD,Tecla6
JSR RETARDO
BRSET 2,PTBD,Tecla9
JSR RETARDO
BRSET 3,PTBD,TeclaGATO
JSR RETARDO
BRA COLUMNA4

Tecla3:
MOV #$03,PTCD
JMP END

Tecla6:
MOV #$06,PTCD
JMP END
Tecla9:

MOV #$09,PTCD
JMP END ;lleva a la subrutina segura de finalización
TeclaGATO:

MOV #$0E,PTCD
JMP END

COLUMNA4:
MOV #$10, PTBD ;habilita el pin 4 del PTBD limpia el bit 7,6,5
BRSET 0,PTBD,TeclaA
JSR RETARDO
BRSET 1,PTBD,TeclaB
JSR RETARDO
BRSET 2,PTBD,TeclaC
JSR RETARDO
BRSET 3,PTBD,TeclaD
JSR RETARDO
JMP COLUMNA1

TeclaA:
MOV #$0A,PTCD
JMP END

TeclaB:
MOV #$0B,PTCD
JMP END

TeclaC:
MOV #$0C,PTCD
JMP END

TeclaD:
MOV #$0D,PTCD
JMP END

END:
MOV #$00,PTCD ;Subrutina de fin seguro, asegura que los puertos
;de salida se limpien después de ser decodificados

RTI ; regresa de la interrupción, le da fin a la interrupción

RETARDO:
MOV #$05,RTCSC ; asigna un retardo en el registro RTC de 256
;milisegundos (0000 1001)

RTS ; regresa de donde fue llamada la subrutina RETARDO

;**************************************************************
;* spurious - Spurious Interrupt Service Routine. *
;* (unwanted interrupt) *
;**************************************************************

spurious: ; placed here so that security value


NOP ; does not change all the time.
RTI

;**************************************************************
;* Interrupt Vectors *
;**************************************************************
ORG $FFD6 ; valor en hexadecimal del registro de la
;interrupción

DC.W Teclado ;Al existir una interrupción presente del puerto B


;se habilita la interrupción

ORG $FFFA

DC.W spurious ;
DC.W spurious ; SWI
DC.W _Startup ; Reset

Potrebbero piacerti anche