Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Bonjour à toute l'équipe du forum
satinas
Passioné
Passioné
Messages : 355
Enregistré en : novembre 2015

#91 Message par satinas » jeu. 6 déc. 2018 16:40

Code : Tout sélectionner

;---------------------------------------------------------GESTION AFFICHEUR-----------------------------------------------------------------
; TITRE: Gestion d'un afficheur LCD graphique
; DATE: 10/11/2018
; AUTEUR: nondediode
; PIC UTILISE: PIC16F877
; Gestion PP845 version 2019
; le quartz est de 4MHz
; essai JMarc Version 1,01
;----------------------------------------------------Brochage du PIC sur la carte---------------------------------------------------------
;
;  Port | Broche | E/S | Description

;  RA0  |    02  |  S  | Relais "MUTE"
;  RA1  |    03  |  S  | Relais "PHASE"
;  RA2  |    04  |  S  | LED droite
;  RA3  |    05  |  S  | LED gauche
;  RA4  |    06  |  S  | Relais de cde HT gauche et droit
;  RA5  |    07  |  S  | Relais statique gauche et droit

;  RB0  |    33  |  E  | Inter "on / off"
;  RB1  |    34  |  E  | Bouton poussoir "OK"
;  RB2  |    35  |  S  | Data Write afficheur 
;  RB3  |    36  |  S  | Data Read afficheur
;  RB4  |    37  |  S  | Chip Enable
;  RB5  |    38  |  S  | C/D
;  RB6  |    39  |  S  | Font Size Select
;  RB7  |    40  |  S  | Reset

;  RC0  |    15  |  S  | Adressage entrée audio bit A
;  RC1  |    16  |  S  | Adressage entrée audio bit B
;  RC2  |    17  |  S  | Adressage entrée audio bit C
;  RC3  |    18  |  S  | Adressage entrée audio bit D
;  RC4  |    23  |  S  | LEDs Rouge droit et gauche
;  RC5  |    24  |  E  | Bouton poussoir "INPUT"
;  RC6  |    25  |  E  | Bouton poussoir "PHASE"
;  RC7  |    26  |  E  | Bouton poussoir "MUTE"

;  RD0  |    19  |  S  | Sortie bit D7 du LCD
;  RD1  |    20  |  S  | Sortie bit D6 du LCD
;  RD2  |    21  |  S  | Sortie bit D5 du LCD
;  RD3  |    22  |  S  | Sortie bit D4 du LCD
;  RD4  |    27  |  S  | Sortie bit D3 du LCD
;  RD5  |    28  |  S  | Sortie bit D2 du LCD
;  RD6  |    29  |  S  | Sortie bit D1 du LCD
;  RD7  |    30  |  S  | Sortie bit D0 du LCD

;--------------------------------------------------DIRECTIVE D'ASSEMBLAGE POUR MPLAB-------------------------------------------------------

    list p=16f877
    #include <p16f877.inc>
    radix dec                   ; on travaille en décimal par défaut

    __CONFIG   _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

OPTIONVAL    EQU    B'00001111'
;-------------------------------------------------Definition de la RAM------------------------------------------------------

    cblock        0x20
      DATA_L
      DATA_H
      CMD
    endc

    cblock        0x70
      w_temp : 1                ; Sauvegarde registre W
      status_temp : 1           ; sauvegarde registre STATUS
      FSR_temp : 1              ; sauvegarde FSR (si indirect en interrupt)
      PCLATH_temp : 1           ; sauvegarde PCLATH (si prog>2K)
      Tempj : 1
      delai1_LED_TEMOIN : 1
      delai2_LED_TEMOIN : 1
      temptmr0 : 1
      temp1tmr1 : 1
 
      STATUS_TEMP               ; interruptcontextsave for STATUS
      PCLATH_TEMP               ; interruptcontextsave for PCLATH
      COUNT1                    ; delaycounter 1
      COUNT2                    ; delaycounter 2
      COUNT3                    ; delaycounter 3
      DATA_EE_ADDR              ; data EEPROM address buffer
      DATA_EE_DATA              ; data EEPROM data buffer
    endc

;-------------------------------------------------Definition des constantes------------------------------------------------------
#DEFINE LED_TEMOIN    PORTA,1
#DEFINE LED_TEMOIN2   PORTA,0
#DEFINE LCD_WR        PORTB,2   ;  RB2  |    35  |  S  | Data Write afficheur 
#DEFINE LCD_RD        PORTB,3   ;  RB3  |    36  |  S  | Data Read afficheur
#DEFINE LCD_CE        PORTB,4   ;  RB4  |    37  |  S  | Chip Enable
#DEFINE LCD_CD        PORTB,5   ;  RB5  |    38  |  S  | C/D
#DEFINE LCD_FS        PORTB,6   ;  RB6  |    39  |  S  | Font Size Select
#DEFINE LCD_RESET     PORTB,7   ;  RB7  |    40  |  S  | Reset
LCD_DATA    EQU       PORTD

;--------------------------------------------Definition des registres temporaires------------------------------------------------------

;--------------------------------------------Directives des programmes------------------------------------------------------

;=====================================Macro=====================================
led_cligno_lent macro
    movlw   0x28                ; longueur
    movwf   delai1_LED_TEMOIN
    movlw   0x5A                ; fréquence
    movwf   delai2_LED_TEMOIN
    clrf    temp1tmr1
    endm

led_cligno_rapide macro
    movlw   0x08                ; longueur
    movwf   delai1_LED_TEMOIN
    movlw   0x0A                ; fréquence
    movwf   delai2_LED_TEMOIN
    clrf    temp1tmr1
    endm

led_cligno_flash macro
    movlw   0x29                ; longueur
    movwf   delai1_LED_TEMOIN
    movlw   0x2A                ; fréquence
    movwf   delai2_LED_TEMOIN
    clrf    temp1tmr1
    endm

CtlAff macro ctr                ; envoyer commande
    movlw   ctr
    movwf   CMD
    call    Envoi_cmd
    endm

DataAff_8 macro x1,x2           ; envoyer commande et data 8 bits
    movlw   x1
    movwf   CMD
    movlw   x2
    movwf   DATA_L
    call    Envoi_data_8
    call    Envoi_cmd
    endm

DataAff_16 macro x1,x2          ; envoyer commande et data 16 bits
    movlw   x1
    movwf   CMD
    movlw   (x2) / 0x100
    movwf   DATA_H
    movlw   (x2) % 0x100
    movwf   DATA_L
    call    Envoi_data_16
    call    Envoi_cmd
    endm
   
;===============================================================================
    org     0x000               ; Debut du programme principale
    goto    START               ; Saut à START

;*****************************************************************************
;                     ROUTINE INTERRUPTION                                   *
;*****************************************************************************
    ; sauvegarder registres   
    ;---------------------
    org 0x004                   ; adresse d'interruption
    movwf   w_temp              ; sauver registre W
    swapf   STATUS,w            ; swap status avec résultat dans w
    movwf   status_temp         ; sauver status swappé
    movf    FSR , w             ; charger FSR
    movwf   FSR_temp            ; sauvegarder FSR

    bsf     STATUS,RP0          ; sélectionner banque1
    btfss   PIE1,TMR1IE         ; tester si interrupt autorisée
    goto    intsw1              ; non sauter
    bcf     STATUS,RP0          ; oui, sélectionner banque0
    btfss   PIR1,TMR1IF         ; oui, tester si interrupt en cours
    goto    intsw1              ; non sauter

    MOVLW   0x3C                ; int toute le 100ms   
    MOVWF   TMR1H
    MOVLW   0xB3
    movwf   TMR1L 

    incf    temp1tmr1,f

    movf    delai2_LED_TEMOIN,w ; on test si  Xfois
    subwf   temp1tmr1,W
    btfss   STATUS,Z
    goto    suite_led_temoin
    bcf     LED_TEMOIN
;   bsf     LED_TEMOIN
    clrf    temp1tmr1
    goto    sautintsw9

suite_led_temoin
    movf    delai1_LED_TEMOIN,w
    subwf   temp1tmr1,W
    btfss   STATUS,Z
    goto    sautintsw9
    bsf     LED_TEMOIN
;   bcf     LED_TEMOIN          ; inversion des sorties pour la platine essais

sautintsw9
    bcf     PIR1,TMR1IF         ; effacer flag interupt

intsw1
    bcf     STATUS,RP0          ; oui, sélectionner banque0

    ; restaurer registres
    ; -------------------
restorereg
    bcf     STATUS,RP0
    movf    FSR_temp, w         ; charger FSR sauvé
    movwf   FSR                 ; restaurer FSR
    swapf   status_temp,w       ; swap ancien status, résultat dans w
    movwf   STATUS              ; restaurer status
    swapf   w_temp,f            ; Inversion L et H de l'ancien W
                                ; sans modifier Z
    swapf   w_temp,w            ; Réinversion de L et H dans W
                                ; W restauré sans modifier status
    retfie 

;-------------------------------------------------INITIALISATION------------------------------------------------------
START
    ; Registre d'options (banque 1)
    ; -----------------------------
    BANKSEL OPTION_REG          ; sélectionner banque 1
    movlw   OPTIONVAL           ; charger masque
    movwf   OPTION_REG          ; initialiser registre option

    ; registres interruptions (banque 1)
    ; ----------------------------------
    bsf     INTCON,PEIE         ; autoriser interruptions périphériques
    bcf     STATUS,RP0          ; passer banque 0

    ; autoriser interruptions (banque 0)
    ; ----------------------------------
    bsf     T1CON,0X4
    bcf     T1CON,0X5

    MOVLW   0x3C                ; int toute le 100ms   
    MOVWF   TMR1H
    MOVLW   0xB3
    movwf   TMR1L 

    BSF     T1CON,TMR1ON        ; on TMR1    bit a 1

    CLRF    PORTA               ; Remise à 0 du port A
    CLRF    PORTB               ; Remise à 0 du port B
    CLRF    PORTC               ; Remise à 0 du port C
    CLRF    PORTD               ; Remise à 0 du port D
    CLRF    PORTE               ; Remise à 0 du port E

    bsf     STATUS,RP0          ; Banque 1

    clrf    TRISA               ; PortA en sortie
    movlw   b'00000110'
    movwf   ADCON1              ; sortie digital

                                ; PORTA, PORTB, PORTC, and PORTE outputs
    CLRF    TRISB               ; PORTD defaults to input
    CLRF    TRISC
    CLRF    TRISE
 
    BSF     PIE1,TMR1IE         ; valide le TMR1   

    bcf     STATUS,RP0          ; Banque 0

    led_cligno_lent

    bsf     INTCON,GIE          ; valider interruptions

    bsf     LCD_WR              ;  RB2  |    35  |  S  | Data Write afficheur 
    bsf     LCD_RD              ;  RB3  |    36  |  S  | Data Read afficheur
    bsf     LCD_CE              ;  RB4  |    37  |  S  | Chip Enable
    bsf     LCD_CD              ;  RB5  |    38  |  S  | C/D
    bsf     LCD_FS              ;  font 6x8
    bsf     LCD_RESET           ;  RB7  |    40  |  S  | Reset
    call    Delay50mS

    bcf     LCD_RESET           ;  RB7  |    40  |  S  | Reset
    call    Delay50mS
    bsf     LCD_RESET

    CtlAff      0x80            ; select CG ROM afficheur et mode OR    10000000
    call        Delay50mS
    DataAff_16  0x42, 0x0000    ; set grp en 0000h
    call        Delay50mS
    DataAff_16  0x43, 40        ; set grp 6x8
    call        Delay50mS
    DataAff_16  0x40, 0x1700    ; set txt en 1700h
    call        Delay50mS
    DataAff_16  0x41, 40        ; set txt 6x8 (40 caractères par ligne)
    call        Delay50mS
    CtlAff      0xa0            ; épaisseur curseur 1 ligne (1 à 8)     10100000
    call        Delay50mS
    CtlAff      0x9c            ; afficher grp/txt et cacher curseur    10011100
    call        Delay50mS

    DataAff_16  0x24, 0x1700    ; écrire en haut à gauche
    call        Delay50mS

    DataAff_8   0xc0, 'D'-32    ; afficher 'D'
    call        Delay50mS

    led_cligno_rapide
loop
    nop
    GOTO    loop                ; boucle principale

;-------------------------------------------------Programme tempo------------------------------------------------------

Delay50mS
    MOVLW   0x40                ; Charge la valeur dans W
    MOVWF   COUNT1              ; Transfert de W sur COUNT1
    MOVWF   COUNT2              ; Transfert de W sur COUNT2
    DECFSZ  COUNT1,F            ; On décrémente COUNT1,F
    GOTO    $-1                 ; Comptage de boucle
    DECFSZ  COUNT2,F            ; On décrémente COUNT2,F
    GOTO    $-3                 ; Comptage de boucle
    RETURN

Delay
    MOVWF   COUNT3              ; Transfert de W sur COUNT3
    CALL    Delay50mS           ; Appel de l'étiquette Delay50mS
    DECFSZ  COUNT3,F            ; On décrémente COUNT3,F
    GOTO    $-2                 ; Comptage de boucle
    RETURN

;===============================================================================

Envoi_cmd
    bsf     LCD_CD              ; etat haut pour commande
    bcf     LCD_CE              ; Chip Enable
    movf    CMD,w
    movwf   LCD_DATA
    bcf     LCD_WR              ; Data Write afficheur actif etat bas
    nop 
    bsf     LCD_WR
    bsf     LCD_CE              ; Chip Disable
    return

Envoi_data_8
    bcf     LCD_CD              ; etat bas pour données
    bcf     LCD_CE              ; Chip Enable
    movf    DATA_L,w
    movwf   LCD_DATA
    bcf     LCD_WR              ; Data Write afficheur actif etat bas
    nop 
    bsf     LCD_WR   
    bsf     LCD_CE              ; Chip disable
    return

Envoi_data_16
    bcf     LCD_CD              ; etat bas pour données
    bcf     LCD_CE              ; Chip Enable
    movf    DATA_L,w
    movwf   LCD_DATA
    bcf     LCD_WR              ; Data Write afficheur actif etat bas
    nop 
    bsf     LCD_WR
    movf    DATA_H,w
    movwf   LCD_DATA
    bcf     LCD_WR              ; Data Write afficheur actif etat bas
    nop
    bsf     LCD_WR
    bsf     LCD_CE              ; Chip disable
    return

    END


C'est un 16F877 ou un 16F877A ? il y avait des références au 2 types.
Le cblock en 0x70 avait une taille supérieure à 16, gênant
J'espère que ça clignote encore :)

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#92 Message par nondediode » jeu. 6 déc. 2018 17:35

satinas a écrit :???????
DataAff_8 0xc0,0x1700 ; afficher 'D'. Modif effectué

Pour éviter d'avoir des problèmes de tabulations dans les sources, il faut régler Mplab pour remplacer les tabulations par des espaces. C'est dans le menu Edit/Properties/File Type, cocher "Insert spaces"


Ma version Mplab est la 5.5, je n'ai pas Edit/properties dans ce module

C'est un 16F877 ou un 16F877A ? il y avait des références au 2 types.


16f877-20/P

J'ai testé le code, rien de mieux.
La LED clignote tjrs

Bonjour à toute l'équipe du forum
satinas
Passioné
Passioné
Messages : 355
Enregistré en : novembre 2015

#93 Message par satinas » jeu. 6 déc. 2018 18:06

En ce qui concerne le soft, je vois pas ce que l'on peut ajouter. Ca a marché ainsi sur un autre afficheur avec T6963C. Si quelqu'un a une idée ...

Tu as une version de Windows 16 bits ?

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#94 Message par nondediode » jeu. 6 déc. 2018 18:38

Non 32bits
XP professional

Bonjour à toute l'équipe du forum
JMarc
Confirmé
Confirmé
Messages : 552
Enregistré en : août 2016
Localisation : Dans le Sud...

#95 Message par JMarc » jeu. 6 déc. 2018 19:11

bonjour nondediode,satinas,JJE,temps-x,Jérémy et tout le monde

Merci Satinas pour la correction de CE et de l'espace memoire, il faut vraiment que j'ouvre cette datasheet :roll:

Nondediode, la commande CtlAff 0x80 veut dire appel de la macro CtlAff et passage du parametre 0x80
la macro est

Code : Tout sélectionner

CtlAff macro ctr                ; envoyer commande
    movlw   ctr
    movwf   CMD
    call    Envoi_cmd
    endm


donc concrètement la ligne CtlAff 0x80 sera effacé et remplacé par

Code : Tout sélectionner

          
    movlw   0x80
    movwf   CMD
    call    Envoi_cmd


pareil pour la ligne

Code : Tout sélectionner

 DataAff_16  0x24, 0x1700    ; écrire en haut à gauche


qui sera remplacé par

Code : Tout sélectionner

    movlw   0x24     ; chargement de la valeur pour la commande
    movwf   CMD        
; envoi dans la variable pour traitement lors de l'appel de la sous routine Envoi_cmd
    movlw   0x17        ; première partie de 0x1700
    movwf   DATA_H    ; envoi dans la variable 
    movlw   0x00        ; seconde partie de 0x1700
    movwf   DATA_L    ; envoi dans la variable 
    call    Envoi_data_16
    call    Envoi_cmd


change les valeurs en fonction de la datasheet de ton écran que tu nous a posté en début de post, on ne sait jamais

Satinas, je vais essayer d'envoyer du graphisme comme tu m'as appris pour le ILI9341 si j'arrive a comprendre cette doc :sifflotte:

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#96 Message par nondediode » jeu. 6 déc. 2018 20:13

Bonjour Jean Marc,

Quels sont ces valeurs dont tu me demandes de changer?

Bonjour à toute l'équipe du forum
JMarc
Confirmé
Confirmé
Messages : 552
Enregistré en : août 2016
Localisation : Dans le Sud...

#97 Message par JMarc » jeu. 6 déc. 2018 20:33

Code : Tout sélectionner

DataAff_16  0x240x1700    écrire en haut à gauche


0x24 est la commande d'apres ton data cheet de l'affichage du texte et 0x1700 la valeur d'ou il doit etre affiché. tu peux toujours essayer avec une valeur inférieure ou supérieure, c,est ce que j'essai de comprendre

Bonjour à toute l'équipe du forum
satinas
Passioné
Passioné
Messages : 355
Enregistré en : novembre 2015

#98 Message par satinas » jeu. 6 déc. 2018 21:05

JMarc le graphique c'est pareil que le mode texte. On se positionne dans la ram graphique, et on remplit des lignes de pixels, au lieu de lignes de caractères.

On renseigne une position avec la commande 0x24 suivie de l'adresse 16 bits en ram texte ou graphique.
Donc 0x1700 pour 1ère ligne et 1ère colonne texte dans notre cas, et 0x0000 pour le graphique.
la position est auto-incrémentée si l'on remplit avec la commande 0xc0.

Le mode texte a aussi un curseur clignotant, commande 0x21 suivie de la valeur 16 bits (ligne*256)+colonne. Il n'a rien à voir avec la position.

Faut pas trop s'acharner, le hard est-il bon, vaut mieux avoir toujours les pièces en double, ça peut éviter des prises de tête. Il faut vérifier à l'oscillo que les signaux arrivent en bon état au lcd.

La grosse cavalerie, faire une boucle qui envoie un caractère dans toute la ram, faut le faire bosser ce pic :)

Tester aussi le curseur clignotant
CmdAff 0x9f
DataAff_16 0x21, 0

Dans MplabX, il doit aussi y avoir moyen de remplacer les tabulations par des espaces, cela n'empêche pas d'utiliser les tabulations dans l'éditeur.

Bonjour à toute l'équipe du forum
JMarc
Confirmé
Confirmé
Messages : 552
Enregistré en : août 2016
Localisation : Dans le Sud...

#99 Message par JMarc » jeu. 6 déc. 2018 22:33

En tout cas merci bien cela m’a donné un but pour bosser mais je ne lache pas la doc de cet écran

J’ai trouvé l’endroit pour modifier les tabulations dans mplabx mais j’ai pas compris en quoi cela est gênant et si cela s’adressai a moi aussi

Merci !

Bonjour à toute l'équipe du forum
satinas
Passioné
Passioné
Messages : 355
Enregistré en : novembre 2015

#100 Message par satinas » ven. 7 déc. 2018 07:07

Bonjour,

Code : Tout sélectionner

    movlw   0x24     ; chargement de la valeur pour la commande
    movwf   CMD        ; envoi dans la variable pour traitement lors de l'appel de la sous routine Envoi_cmd
    movlw   0x17        ; première partie de 0x1700
    movwf   DATA_H    ; envoi dans la variable
    movlw   0x00        ; seconde partie de 0x1700
    movwf   DATA_L    ; envoi dans la variable
    call    Envoi_data_16
    call    Envoi_cmd


pour éviter ces décalages lors de copier-coller, ou si l'on charge le source dans un éditeur de texte ayant des réglages de tabulation différents.


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités