*********************************************************************************** *** GESTION DE L'INTERRUPTION POUR LIRE LE CLAVIER ET AFFICHER SUR lcd *** ** *** Mode étendu : sans cavalier IRQ *** *** saisie d'un code 4 chiffre au clavier : touche 0 a 9 *** *** touche # et * pas utilisée *** *** code touche remplacé par "*" a l'ecran *** *** Verification si code saisi est = code enregistré en memoire *** *** >> correct : PORTF-1 = 1 : LED verte allumée + message *** *** >> incorrect : PORTF-0 = 1 : LED rouge allumée + message *** *** Retour début pgm pour saisie suivante *** *** Démarrage automatique du pgm en cas de coupure : mode étendu !! *** *********************************************************************************** PORTF equ $05 PORTB equ $1004 PORTA equ $1000 DDRA equ $1001 PORTE equ $100A CNT rmb 1 Reste1 rmb 1 * touceh convertie en decimal a afficher Memoire rmb 1 * stock valeur du clavier Caractere rmb 1 * quel position sur la ligne ? Erreur rmb 1 * 1ere chiffre saisi org $FE00 start lds #$0150 ldx #$1000 ******************************************************* *Configuration port ******************************************************* ldaa #$FF staa DDRA *port A en sortie ******************************************************* ******************************************************* ***initialisation Variable*** ******************************************************* Init SEI *stoppe IRQ durant chargement initial ldaa #$00 *init valeur de "erreur" a 0 (=code exact) staa Erreur ldx #$1000 ******************************************************* ******************************************************* ***initialisation LCD*** ******************************************************* LCD ldaa #$00 staa PORTF,x *init PORTF a 0 !!( led verte et rouge !!) ldaa #$F2 * E=0 , RW=1 , RS=0 sur PORTA bsr delay enter ldaa #%00000110 *0000 0110 : deplacement afficheur droite bsr fonc * (#$06) Curse ldaa #%00001111 *0000 1100 : D=1 afficheur alumé bsr fonc * C=0 *sans curseur * B=0 sans clignotement (#$0C) Bus ldaa #%00111000 *0011 1000 : BUS 8 bits (#$38) bsr fonc home ldaa #%00000001 *0000 0001 : place curseur position HOME bsr fonc * (#$01) jmp Mess1 *affiche Message1 ******************************************************* ******************************************************* ***ss pgm : Controle du code + message correspondant*** ******************************************************* ***Verifie code egale a celui en memoire Verif ldaa Erreur cmpa #$00 * valeur "Erreur" toujours a 00 ? beq Correct * oui alors Message "saisie correcte" ldx #$1000 bset PORTF,X,#$02 ldx #M2 * ...sinon Message "saisie erronée" Mess2 ldaa #$00 ***affiche message ligne 1 : bsr gotoxy bcl2 ldab 0,x * lit 1ere valeur pointeur #unite beq Lbl5 * ..fin message >> retour au début du pgm !! bsr char *affiche caractere du message ! inx bra bcl2 **OUI?..Message code correct. Correct ldx #$1000 bset PORTF,X,#$01 ldx #M3 bra Mess2 ****************************************************** ****************************************************** ***ss pgm : fin du pgm >> retour au debut. ****************************************************** Lbl5 bra ded1 ded1 ldy #$2FFF deda1 dey *tempo wait instruction 115ms bne deda1 *21.5ms deca * bne ded1 rti jmp Init ****************************************************** ****************************************************** ***ss pgm : Controle du code saisi par touche : ****************************************************** ***Controle ligne 1 a 3 LignX ldaa Memoire cmpa #$01 *manque de place : les 3 1er chiffres auront le meme code !! bne Faux * 1 2 3eme chiffre : code 1 rts ***Controle ligne 4 Ligne4 ldaa Memoire cmpa #$03 *4eme chiffre : code 3 bne Faux1 Lbl3 bsr Verif rts ***Chifre n'est pas celui saisi en memoire Faux1 ldaa #$01 staa Erreur *valeur de "Erreur" passe a 1 ! bra Lbl3 Faux ldaa #$01 staa Erreur *valeur de "Erreur" passe a 1 ! rts ****************************************************** ******************************************************* ***ss pgm : envoi caractere/commande*** ******************************************************* ****Délai avant instruction suivante*** delay staa PORTA ldaa #$01 dedans ldy #$2FFF dedans2 dey *tempo wait instruction 115ms bne dedans2 *21.5ms deca * bne dedans rts ****envoi instruction port B : RS au niveau bas*** fonc staa PORTB *instruction sur PORTB ldaa #$F0 *E=0 RW=0 RS=0 * RS en mode instruction bsr delay ldaa #$F4 * E=1 RW=0 RS=0 * en front montant >> validation bsr delay ldaa #$F0 * E=0 RW=0 RS=0 bsr delay rts ****envoi caractere port B : RS au niveau haut*** char stab PORTB ldaa #$11 *E=0,R/W=0,RS=1 * RS en mode données bsr delay ldaa #$15 *E=1,RW=0,RS=1 *E en front montant >> validation bsr delay ldaa #$11 *E=0,RW=0,RS=1 * Reinit E bsr delay rts gotoxy oraa #$80 * evalue busy avant d'envoyer valeur portB bsr fonc rts ******************************************************* ******************************************************* *ss pgm : gestion caracete.*** ******************************************************* Position ldaa Caractere * Combien de chiffre ont été saisi ? adda #$01 staa Caractere cmpa #$04 beq Ligne4 * 4eme chiffre: on stock et on compare au mot en memoire bra LignX * autre chiffre du code : on stock et on continue la saisie rts ******************************************************* ******************************************************* ***Affiche messag 1ere ligne*** ******************************************************* Mess1 ldx #M1 *charge Message1 ldaa #$00 bsr gotoxy bcl1 ldab 0,x * lit 1ere valeur pointeur #unite beq PosL1 * si fin de chaine ( valeur /) : >> suite bsr char *..sinon affiche le caractere inx bra bcl1 * boucle affichage des secondes ******************************************************* ******************************************************* ***affichage Touche si Interruption *** ******************************************************* Main ldab #%00101010 *affiche "*" au lieu de la valeur de la touche saisie : code secret !! bsr char bsr Position *on traite l'info pshy ldy #$FFFFF wait1 dey bne wait1 puly rts ******************************************************** ******************************************************* ***Position du code a saisir:2eme ligne 6eme position*** ******************************************************** PosL1 ldaa #$16 *2ere ligne 1eme position bsr gotoxy ldaa #$00 * init : 1ere caractere a saisir... staa Caractere * ...sera traité cli *IRQ possible a present ******************************************************* ******************************************************* ***Boucle principale : attente interruption ******************************************************* Ici bra Ici *boucle ******************************************************* ******************************************************* ***Interruption CLAVIER *** ******************************************************* irq ldab PORTE cmpb #%00000000 beq table0 cmpb #%00100000 beq table1 cmpb #%00000010 beq table2 cmpb #%00100010 beq table3 cmpb #%00000001 beq table4 cmpb #%00100001 beq table5 cmpb #%00000011 beq table6 cmpb #%00100011 beq table7 cmpb #%00010000 beq table8 cmpb #%00110000 beq table9 Retour stab Memoire bsr Main rti ******************************************************* ***Conversion CLAVIER *** ******************************************************* table0 ldab #%00000000 bra Retour table1 ldab #%00000001 bra Retour table2 ldab #%00000010 bra Retour table3 ldab #%00000011 bra Retour table4 ldab #%00000100 bra Retour table5 ldab #%00000101 bra Retour table6 ldab #%00000110 bra Retour table7 ldab #%00000111 bra Retour table8 ldab #%00001000 bra Retour table9 ldab #%00001001 bra Retour rts ******************************************************* ******************************************************* M2 fcc " CODE ERRONE ",0 m_2 fcb %00000000 M1 fcc " SAISIR LE CODE ",0 m_1 fcb %00000000 M3 fcc " CODE CORRECT ",0 m_3 fcb %00000000 ******************************************************* ******************************************************* ***vecteur d'interruption IRQ *** org $fff2 * vecteur de IRQ irqvect fdb irq ******************************************************* ******************************************************* end