File "clavier.asm"
Full Path: /home/analogde/www/68hc11/68HC12/clavier.asm
File size: 11.08 KB
MIME-type: text/plain
Charset: 8 bit
*******************************************************************
* 68HC11F1 clavier 16 touches sans 74LS922 *
* *
* Connexions clavier -> HC11 *
* *
* voir schma *
* Y1-Y4 PA0-PA3 et X1-X4 PE0-PE3 *
* Le port E est en entre uniquement. *
* *
* Ce programme permet de lire une touche press sur un clavier *
* de 16 touches au momment o l'une d'elle est appuy. *
* Dans cette configuration, le 68HC11 utilise l'interruption IRQ *
* afin de connaitre le momment ou balayer le clavier. *
* *
* Le programme envoit l'ordinateur '*' lors d'un reset. Puis *
* ds qu'une touche a t appuy, il l'envoit le caractre *
* correspondant. *
* Principe de fonctionnement: *
* Une interruption. *
* balayage du clavier j'usqu' que l'on trouve une touche *
* enfonc correctement. l on regroupe les 2 variables en une *
* seule pour pouvoir la comparer et l'associer au caractre *
* voulu. *
* La routine termine par remettre le port A dans l'tat *
* d'origine pour qu'une nouvelle interruption puisse tre faite. *
* *
* On attends quelques ms afin de ne pas lire les rebonds. *
* Enfin le programme sort de fonction d'intrruption et reprend *
* l'activit d'origine . *
* *
* Le programme s'execute en mode tendu. *
* *
* par Burg Thomas EFREI promo 2005 *
* (burg@efrei.fr) le 14/4/2003 *
* le 24/4/2003 : ajout du schma de cblage avec explication *
* succinte clavier.png *
*******************************************************************
* Registres utilises :
porta equ $00 ; port A (commande)
ddra equ $01 ; data direction register for port A
portg equ $02 ; port G (data bus)
ddrg equ $03 ; data direction register for port G
portb equ $04 ; port B data register (t la commande)
ddrc equ $07 ; data direction register for port C
portc equ $06 ; port C data register (t les data)
porte equ $0a
baud equ $2b
sccr1 equ $2c
sccr2 equ $2d
scsr equ $2e
scdr equ $2f
csclt equ $5d ;configurartion registre chip select controle
option equ $39
config equ $3f
hprio equ $3c
* constante
intvect equ $ffd6
vsci equ $00c4
startbase equ $9000
regbase equ $1000
rambase equ $2000
pile equ $c3
org rambase
org startbase
begins sei
lds #pile
ldx #regbase
* initialisation de la liaison serie:
clr sccr1,x ; dbut d'initialisation de la liaison srie.
ldd #$302c ; SCI en interruption
staa baud,x ; Initialise SCI to 9600 bauds (crystal 8 MHz)
stab sccr2,x ; no parity and disable SCI tx & rx interrupt,
* initialisation
bset ddra,x,$ff ; PA0-3 configure port a in output (port a en sortie)
ldaa #'*' ; send '*' the program begin
jsr outsci ; sub routine to send by asynchrone serial port
* boucle principale
jsr init_cl
boucle bra boucle
****************************************************************************
* sous-routine d'attente *
****************************************************************************
wait pshy
ldy #$2FFF
wait1 dey
bne wait1
puly
rts
****************************************************************************
* routine d'interruption srie asynchrone *
****************************************************************************
routsci jsr insci ; Chargement de la valeur transmise sur la liaison serie
jsr outsci ; renvoie vers le PC
rti
****************************************************************************
* sous-routine de lecture du buffer serie asynchrone *
****************************************************************************
insci brclr scsr,x,$20,insci
ldaa scdr,x
rts
****************************************************************************
* sous routine d'envoie de caractre par liaison serie synchrone *
****************************************************************************
outsci brclr scsr,x,$80,outsci
staa scdr,x
rts
****************************************************************************
* routine d'initialisation du clavier *
****************************************************************************
init_cl cli ; on autorise les interruptions
bclr porta,x,$0f ; pour qu'il y est une interruption lorsque
; l'on presse une touche il faut que les ligne de sortie que l'on
; brancher au clavier soit l'tat bas.
rts
****************************************************************************
* fonction d'interruption clavier *
****************************************************************************
IRQ ldaa #%00001110 ;charge la valeur initiale de test
nextT staa porta,x ;basculement de sur le porta
ldab porte,x ;lecture sur le porte
andb #%00001111 ; on applique un masque sur uniquement ce qui nous interesse
cmpb #$0f ;si on lit 1111. ce n'est pas ligne choisie
beq conti ; on saute conti
lslb ; si on trouve une valeur on fait
lslb ; 4x logical shift pour pouvoir par la suite travailler
lslb ; sur 8 bits
lslb ;
aba ;On somme a et b pour comparer 1 nombre au lieu de 2
jsr table ;On cherche la touche presser dans une table
; ------
jsr outsci ; on traite a: on envoie a sur la liaison srie par exemple
; ------
bra readok ; on a lu on s'enva de cette fontion
conti lsla ; on dcale a pour poursuivre la recherche de la bonne ligne
inca
anda #%00001111 ; on applique un masque sur uniquement ce qui nous interesse
cmpa #%00001111 ; si on arrive a cette valeur, on n'a pas trouver de ligne lire
beq IRQ ; on relance la sous routine
bra nextT ;sinon on continu
readok bclr porta,x,$0f ;renclenche la possibilit de faire une interruption clavier
jsr wait ;
jsr wait ; attend avant de retourner au sous programme afin qu'il n'y ait
jsr wait ; pas de saisie de rebond
rti
*****************************************************************************
* sous-routine de correspondance code caractre *
*****************************************************************************
table cmpa #%01111110
beq tabledata1
cmpa #%01111101
beq tabledata2
cmpa #%01111011
beq tabledata3
cmpa #%01110111
beq tabledataF
cmpa #%10111110
beq tabledata4
cmpa #%10111101
beq tabledata5
cmpa #%10111011
beq tabledata6
cmpa #%10110111
beq tabledataE
cmpa #%11011110
beq tabledata7
cmpa #%11011101
beq tabledata8
cmpa #%11011011
beq tabledata9
cmpa #%11010111
beq tabledataD
cmpa #%11101110
beq tabledataA
cmpa #%11101101
beq tabledata0
cmpa #%11101011
beq tabledataB
cmpa #%11100111
beq tabledataC
**********************************************************************
* affectation du bon caractre *
**********************************************************************
tabledata1 ldaa #'1'
bra endtable
tabledata2 ldaa #'2'
bra endtable
tabledata3 ldaa #'3'
bra endtable
tabledata4 ldaa #'4'
bra endtable
tabledata5 ldaa #'5'
bra endtable
tabledata6 ldaa #'6'
bra endtable
tabledata7 ldaa #'7'
bra endtable
tabledata8 ldaa #'8'
bra endtable
tabledata9 ldaa #'9'
bra endtable
tabledata0 ldaa #'0'
bra endtable
tabledataA ldaa #'A'
bra endtable
tabledataB ldaa #'B'
bra endtable
tabledataC ldaa #'C'
bra endtable
tabledataD ldaa #'D'
bra endtable
tabledataE ldaa #'E'
bra endtable
tabledataF ldaa #'F'
bra endtable
endtable rts
********************************************************************************
* Vector jump table
********************************************************************************
org intvect
tablevect fdb routsci ; SCI Serial System
fdb begins ; SPI Serial Transfert Complete
fdb begins ; Pulse Accumulator Input Edge
fdb begins ; Pulse Accumulator Overflow
fdb begins ; Timer Overflow
fdb begins ; Timer Input Capture 4 / Output Compare 5
fdb begins ; Timer Output Compare 4
fdb begins ; Timer Output Compare 3
fdb begins ; Timer Output Compare 2
fdb begins ; Timer Output Compare 1
fdb begins ; Timer Input Compare 3
fdb begins ; Timer Input Compare 2
fdb begins ; Timer Input Compare 1
fdb begins ; Real-Time Interrupt
fdb IRQ ; IRQ (external pin)
fdb begins ; XIRQ (SCI RX line may be connected to XIRQ input,
; to allow exit from STOP in bootstrap mode.
fdb begins ; Software Interrupt
fdb begins ; Illegal Opcode Trap
fdb begins ; COP Failure
fdb begins ; Clock Monitor Fail
fdb begins ; RESET
end