Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

keypad 4x4 pic



  1. #1
    sdow

    keypad 4x4 pic

    salut

    est ce quelquen peut m'aider à faire un code en asm pour un clavier 16 touches (matrix)

    voila je utilise un pic 16f877, mon clavier est sur PORTB .

    je veux un fonction qui attend un clé (avec un front ) de clavier pour pouvoir continuer le clé est place dans un variable .

    -----


  2. Publicité
  3. #2
    freepicbasic

    Re : keypad 4x4 pic

    pas testé , mais la logique est là.

    Code:
    ; Lecture de clavier matriciel
    ; sur PORTB 
    TRISB = 11110000b
    ;	bit 0-3 sélection de ligne 
    ;	bit 4-7 lecture de la rangé (avec des "pull down" qui donne 0 si rien)
    
    mask	equ 20H
    Value	equ 21H
    Temp	equ 22H
    
    
    
    movlw 1	; initialise le mask
    
    Nextline
    movwf mask	; sélectionne la ligne
    movwf PORTB	; envoie le mask
    movf PORTB,w	; lit la ligne
    andlw 240	; met le mask à 0 , on conserve que la rangé
    btfsc status,z  ; touche ?
    goto ReadOk	; oui !
    		; non !
    rlf mask,f	; décale d'1 bit, pour lire la ligne suivante
    movf mask,w	; test mask=32 (32 serait une 5 ième ligne)
    sublw 32 	; test si 4 ième ligne terminée
    btfss status,z	; 
    goto Nextline	; Non !
    movlw 0		; oui !
    return		; renvoie 0 rien trouvé
    
    ; touche lu !
    ReadOk
    movwf	Value 	; sauve la valeur de la rangé lue sur la ligne mask
    swapf	Value,f ; / 16 ou >>4 ou met la valeur sur les 4 bits bas
    
    
    ; conversion de la valeur de la rangée lu,
    ;	 grâce au mask de la ligne 
    ; en valeur chiffré de 1 à 4
    ; On cherche un bit qui est a 1 entre bit 0-3
    movlw 1 	; init la valeur temporaire
    movwf temp	; trouvé 1 pour démarrer
    
    
    ; Si on rentrait avec un 0 dans value ici, on serait planté
    ; Mais comme on fait un test =0 pour sortir si aucune touche
    ; voir les lignes en gras
    ; on a forcément quelque chose !
    ConvVal
    bitfsc value,0	; bit à 1 sur bit0
    goto ConvOk	; oui alors trouvé
    rrf value,f	; non alors le suivant
    goto ConvVal	; continué
    
    ; ici temp contient le no de la rangée
    ; et mask le poids de la ligne  
    ; en additionnant les 2
    ; on obtient un chiffre de 1 à 16
    ConvOk
    bcf status,c	; efface le carry
    Movf temp,w	; lit le no de rangé
    addwf mask,w	; additionne le poid de la ligne
    movwf Value	; résultat dans Value
    return		; et dans W aussi
    A+, pat

  4. #3
    freepicbasic

    Re : keypad 4x4 pic

    correction

    Code:
    ; Lecture de clavier matriciel
    ; sur PORTB 
    TRISB = 11110000b
    ;	bit 0-3 sélection de ligne 
    ;	bit 4-7 lecture de la rangé (avec des "pull down" qui donne 0 si rien)
    
    mask	equ 20H
    Value	equ 21H
    Temp	equ 22H
    
    
    
    movlw 1	; initialise le mask
    movwf mask	; sélectionne la ligne 1
    ; correction ici
    
    Nextline
    movf mask,w	; sélectionne la ligne en cours
    ; correction ici
    
    movwf PORTB	; envoie le mask
    movf PORTB,w	; lit la ligne
    andlw 240	; met le mask à 0 , on conserve que la rangé
    btfsc status,z  ; touche ?
    goto ReadOk	; oui !
    		; non !
    rlf mask,f	; décale d'1 bit, pour lire la ligne suivante
    movf mask,w	; test mask=32 (32 serait une 5 ième ligne)
    sublw 32 	; test si 4 ième ligne terminée
    btfss status,z	; 
    goto Nextline	; Non !
    movlw 0		; oui !
    return		; renvoie 0 rien trouvé
    
    ; touche lu !
    ReadOk
    movwf	Value 	; sauve la valeur de la rangé lue sur la ligne mask
    swapf	Value,f ; / 16 ou >>4 ou met la valeur sur les 4 bits bas
    
    
    ; conversion de la valeur de la rangée lu,
    ;	 grâce au mask de la ligne 
    ; en valeur chiffré de 1 à 4
    ; On cherche un bit qui est a 1 entre bit 0-3
    movlw 1 	; init la valeur temporaire
    movwf temp	; trouvé 1 pour démarrer
    
    
    ; Si on rentrait avec un 0 dans value ici, on serait planté
    ; Mais comme on fait un test =0 pour sortir si aucune touche
    ; voir les lignes en gras
    ; on a forcément quelque chose !
    ConvVal
    bitfsc value,0	; bit à 1 sur bit0
    goto ConvOk	; oui alors trouvé
    rrf value,f	; non alors le suivant
    goto ConvVal	; continué
    
    ; ici temp contient le no de la rangée
    ; et mask le poids de la ligne  
    ; en additionnant les 2
    ; on obtient un chiffre de 1 à 16
    ConvOk
    bcf status,c	; efface le carry
    Movf temp,w	; lit le no de rangé
    addwf mask,w	; additionne le poid de la ligne
    movwf Value	; résultat dans Value
    return		; et dans W aussi
    A+, pat

  5. #4
    freepicbasic

    Re : keypad 4x4 pic

    autre correction
    manquait l'incrément de temp.

    Code:
    ; Lecture de clavier matriciel
    ; sur PORTB 
    TRISB = 11110000b
    ;	bit 0-3 sélection de ligne 
    ;	bit 4-7 lecture de la rangé (avec des "pull down" qui donne 0 si rien)
    
    mask	equ 20H
    Value	equ 21H
    Temp	equ 22H
    
    
    
    movlw 1	; initialise le mask
    movwf mask	; sélectionne la ligne 1
    
    Nextline
    movf mask,w	; sélectionne la ligne en cours
    movwf PORTB	; envoie le mask
    movf PORTB,w	; lit la ligne
    andlw 240	; met le mask à 0 , on conserve que la rangé
    btfsc status,z  ; touche ?
    goto ReadOk	; oui !
    		; non !
    rlf mask,f	; décale d'1 bit, pour lire la ligne suivante
    movf mask,w	; test mask=32 (32 serait une 5 ième ligne)
    sublw 32 	; test si 4 ième ligne terminée
    btfss status,z	; 
    goto Nextline	; Non !
    movlw 0		; oui !
    return		; renvoie 0 rien trouvé
    
    ; touche lu !
    ReadOk
    movwf	Value 	; sauve la valeur de la rangé lue sur la ligne mask
    swapf	Value,f ; / 16 ou >>4 ou met la valeur sur les 4 bits bas
    
    
    ; conversion de la valeur de la rangée lu,
    ;	 grâce au mask de la ligne 
    ; en valeur chiffré de 1 à 4
    ; On cherche un bit qui est a 1 entre bit 0-3
    movlw 1 	; init la valeur temporaire
    movwf temp	; trouvé 1 pour démarrer
    
    
    ; Si on rentrait avec un 0 dans value ici, on serait planté
    ; Mais comme on fait un test =0 pour sortir si aucune touche
    ; voir les lignes en gras
    ; on a forcément quelque chose !
    ConvVal
    bitfsc value,0	; bit à 1 sur bit0
    goto ConvOk	; oui alors trouvé
    incf	temp,f
    ; correction 
    rrf value,f	; non alors le suivant
    goto ConvVal	; continué
    
    ; ici temp contient le no de la rangée
    ; et mask le poids de la ligne  
    ; en additionnant les 2
    ; on obtient un chiffre de 1 à 16
    ConvOk
    bcf status,c	; efface le carry
    Movf temp,w	; lit le no de rangé
    addwf mask,w	; additionne le poid de la ligne
    movwf Value	; résultat dans Value
    return		; et dans W aussi
    A+, pat

  6. #5
    sdow

    Re : keypad 4x4 pic

    salut picfreebasic

    je propose se code il est plus simple . il faut joust ajouter un front pour les boutons pourais tu m' aider :
    Code:
    KEYBOARD
    KEY1
    
    	BANKSEL	TRISD
    	CLRF	TRISD		; tous les bits en sortie
    	BANKSEL	PORTD
    
    	CLRF	PORTD
    	ANDLW	0xFF
    	MOVLW	0xF0
    	MOVWF	PORTD
    	
    	BSF	STATUS,RP0
    	MOVWF	TRISD		; PortD[7..4] en Entrée, PortD[3..0] en Sortie
    	BCF	STATUS,RP0
    	CLRF	KBD_TEMP	; initialisation des variables
    	CLRF	KBD_COL
    	CLRF	KBD_INDEX
    	MOVLW	0x08
    	MOVWF	KBD_INDEX	; B3 représente la colonne de droite
    KBD_LOOP
    	MOVFW	KBD_INDEX
    	CALL 	SCAN_KBD	; scan de la rangée pointée par KBD_INDEX
    	SKPNZ			; a-t'on frappé une touche ?
    	GOTO 	NEXT_KBD	; non, alors on passe à la suivante
    
    	BTFSC	KBD_TEMP,0	; analyse des rangées
    	MOVLW	0x00
    	BTFSC	KBD_TEMP,1
    	MOVLW	0x04
    	BTFSC	KBD_TEMP,2
    	MOVLW	0x08
    	BTFSC	KBD_TEMP,3
    	MOVLW	0x0C
    	ADDWF	KBD_COL,W	; on ajoute la valeur de la colonne (KBD_COL)
    	ANDLW	0x0F
    	
    	MOVWF	KBD_TEMP	; recherche du code de la touche
    	SKPNZ
    	MOVLW	'A'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'3'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'2'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'1'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'B'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'6'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'5'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'4'	
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'C'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'9'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'8'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'7'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'D'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'#'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'0'
    	DECF	KBD_TEMP,F
    	SKPNZ
    	MOVLW	'*'
    
    	GOTO	FIN_KBD		; on sort du sous-programme
    
    NEXT_KBD
    	INCF	KBD_COL,F	; passage à la colonne suivante
    	RRF	KBD_INDEX,F	; KBD_INDEX = 0x08, 0x84, 0x42, 0x21, 0x11
    	BTFSS	KBD_INDEX,4	; a t'on fini ?
    	GOTO	KBD_LOOP	; NON, alors on reprend sur la prochaine colonne
    	BANKSEL	TRISD
    	CLRF	TRISD		; tous les bits en sortie
    	BANKSEL	PORTD
    
    	CLRF	PORTD
    	ANDLW	0xFF
    	goto    KEY1
    FIN_KBD
    
    
    	BANKSEL	TRISD
    	CLRF	TRISD		; tous les bits en sortie
    	BANKSEL	PORTD
    	CLRF	PORTD
    	ANDLW	0xFF		; pour positionner STATUS (Z)
    	RETURN

  7. A voir en vidéo sur Futura
  8. #6
    freepicbasic

    Re : keypad 4x4 pic

    SKPNZ , MOVWF des macros je suppose ?

    CALL SCAN_KBD ; scan de la rangée pointée par KBD_INDEX
    Ou est la routine ?


    KBD_LOOP
    sert à quoi ? , pas vue de loop ...



    Code:
    	BANKSEL	TRISD
    	CLRF	TRISD		; tous les bits en sortie
    	BANKSEL	PORTD
    
    	CLRF	PORTD
    	ANDLW	0xFF
    	MOVLW	0xF0
    	MOVWF	PORTD
    A quoi sert tout ça , il suffit de 0xF0 sur TrisD, c'est tout !


    ANDLW 0xFF ; pour positionner STATUS (Z)
    Seulement si W contient déjà 0 !
    Peut être le but rechercher ?
    sinon il y a bsf status,z , mais c'est pas pareil .


    Plus simple du point de vue analyse,
    mais sinon la méthode est un peu gourmande en code , pas de boucle pour les tests ou autres,
    des tests sur chaque touche.
    Mais la logique semble cohérente.
    reste à corriger la routine absente.
    et les trucs inutiles sur le trisd, à moins qu'il y ai une raison cachée pour jouer avec TrisD comme ça ...
    Dernière modification par freepicbasic ; 02/09/2007 à 18h39.
    A+, pat

  9. Publicité
  10. #7
    DavidDB

    Re : keypad 4x4 pic

    Salut,

    SKPNZ , MOVWF des macros je suppose ?
    Oui, ce genre d'horreur existe d'origine dans MPASM...

    David.

  11. #8
    sdow

    Re : keypad 4x4 pic

    tu a raison davidDB

    voila le rest :
    Code:
    SCAN_KBD
    
    	XORLW	0xFF		; inversion bit à bit
    	MOVWF	PORTD
    
    	MOVLW	H'FF'		; on temporise
    	MOVWF	KBD_TEMP	 
    K_LOOP
    	DECFSZ	KBD_TEMP, F	
    	GOTO	K_LOOP		
    
    	MOVF	PORTD,W		; lecture du port B		
    	XORLW	0xFF		; inversion des bits
    	MOVWF	KBD_TEMP
    	SWAPF	KBD_TEMP,W	; on ramène les poids forts en bas (LSB)
    	ANDLW	0x0F		; masquage des MSB
    	MOVWF	KBD_TEMP	; stockage du code
    	RETURN

  12. #9
    DavidDB

    Re : keypad 4x4 pic

    Salut Sdow,

    Cette remarque ne te vise pas, c'est juste une critique sur ce genre de pseudo-instructions...

    En annexe, le tableau des pseudo-instructions disponibles dans MPASM

    David.
    Fichiers attachés Fichiers attachés
    Dernière modification par DavidDB ; 02/09/2007 à 19h20. Motif: PDF...

  13. #10
    sdow

    Re : keypad 4x4 pic

    est ce quelquen a un fonction de clavier 4 x4 avec un front . s.v.p

    je suis blocké là je ne peut pas continuer .

  14. #11
    DavidDB

    Re : keypad 4x4 pic

    Qu'est ce que tu veux dire par "clavier avec un front" ?

    David.

  15. #12
    sdow

    Re : keypad 4x4 pic

    front = 010

    ma fonction elle n'a pas de front : quand un bouton est enfoncé il faut qu'on le relache avent que on affiche le numero sur lcd

  16. Publicité
  17. #13
    freepicbasic

    Re : keypad 4x4 pic

    je n'ai pas vu d'anti rebond ou tempo.
    ça doit se passer ailleurs.

    Il faudrait mettre l'anti rebond et la tempo après le décodage de la fonction au lieu de les mettre avant.
    A+, pat

  18. #14
    sdow

    Re : keypad 4x4 pic

    c'est ça je ne sais pas comment faire l'anti rebond .

  19. #15
    freepicbasic

    Re : keypad 4x4 pic

    Code:
    Call ReadKB ; lit le KB
    SKIPIFNZ    ; rien ?
    Goto NoKB  ; non rien !  alors aller à la fin
    Movwf SvgKb ; oui alors sauver ce qu'on a lu
    
    ; si on traite de suite
    ;call Functions
    
    
    WaitPress
      movlw 20 ; 20ms
      call DelayMs ; petit delay
      Call ReadKB ;  lire à nouveau
      SKIPIFNZ    ; plus rien ?
      goto FinAntirebond ; Il y a plus rien! Alors fin de la pression
      subwf SvgKb         ; oui quelque chose , tester si toujours pareil
      SkipIfZ                 ;  pareil ?
      goto WaitPress      ; oui alors attendre
    
    FinAntirebond          ; différent alors fini
    
    ; si on traite de après relâchement avant le delay
    ;call Functions
    
    
    movlw 200              ; 200ms   dimension humaine pas plus de 5 touche à la seconde
    call DelayMs
    
    ; si on traite de après relâchement après le delay
    ;call Functions
    
    
    NoKB
    Dernière modification par freepicbasic ; 03/09/2007 à 15h09.
    A+, pat

Sur le même thème :

Discussions similaires

  1. Rubik 4X4
    Par ph.auo dans le forum Mathématiques du supérieur
    Réponses: 9
    Dernier message: 21/05/2008, 14h21
  2. keypad 16f877
    Par sdow dans le forum Électronique
    Réponses: 1
    Dernier message: 15/09/2007, 20h15
  3. 4x4 et bonne conscience!!
    Par r17777 dans le forum Environnement, développement durable et écologie
    Réponses: 311
    Dernier message: 22/03/2006, 10h24
  4. 4x4
    Par etronics dans le forum Électronique
    Réponses: 6
    Dernier message: 13/11/2003, 17h30