;******************************************************************************** ;* Programme de gestion d'affichage de la matrice à LED avec un PIC16F628 * ;* PAPELARD Jean-Christophe ;******************************************************************************** ;début du projet: octobre 2002 ;mis à jour le 7 mai 2004 LIST p=16F628 ; Définition de processeur #include ; Définitions des constantes ERRORLEVEL -302 ; SUPPRIME "BANK SELECTION MESSAGES" ; __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _MCLRE_ON & _LVP_OFF ; _BODEN_ON reset auto en cas de bisse se la tension d'alimentation "on" ; _BODEN_OFF reset auto en cas de bisse se la tension d'alimentation "OFF" ; _CP_ALL ; _CP_75 Fusible de protection de la mémoire programme ; _CP_50 ; _CP_OFF ; _PWRTE_OFF Timer de reset à la mise sous tension ; _PWRTE_ON ; _WDT_ON TImer chien de garde actif ; _WDT_OFF TImer chien de garde inactif ; _LVP_ON Programmation en haute et basse tension ; _LVP_OFF Programmation en haute tension ; _MCLRE_ON RA5/MCLRE E/S utilisé comme entrée de reset externe ; _MCLRE_OFF RA5/MCLRE E/S parallèle ,reset reliée en interne à Vdd ; _ER_OSC_CLKOUT Oscillateur RC externe,sortie horloge sur OSC2 ,résistance sur OSC1 ; _ER_OSC_NOCLKOUT Oscillateur RC externe,E/S parallèles sur OSC2 ,résistance sur OSC1 ; _INTRC_OSC_CLKOUT Oscillateur RC interne,E/S parallèles sur OSC1 ,sortie horloge sur OSC2 ; _INTRC_OSC_NOCLKOUT Oscillateur RC interne,E/S parallèles sur OSC1 et OSC2 ; _EXTCLK_OSC E/S parrallèle sur OSC2 , entrée horloge externe sur OSC1 ; _LP_OSC Oscillateur quartz basse vitesse ; _XT_OSC Oscillateur quartz moyenne vitesse ; _HS_OSC Oscillateur quartz grande vitesse ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* OPTIONVAL EQU H'0000' ; Valeur registre option ; Résistance pull-up ON INTERMASK EQU H'0090' ; Masque d'interruption ; Interruptions sur RB0 ;********************************************************************* ; DEFINE * ;********************************************************************* #DEFINE DIL PORTB,1 ; fil de donneé de l'afficheur #DEFINE CKIL PORTB,2 ; fil d'horloge de l'afficheur #DEFINE INTCALC PORTB,0 ; fil qui génére l'interruption ;lorsque q'on branche le cable de la TI #DEFINE B_MODE PORTB,3 ;bouton de chagement de mode actif sur niveau bas #DEFINE data PORTA,0 ;definition du fil rouge pour la TI #DEFINE clk PORTA,1 ; definition du fil blanc pour la TI #DEFINE LEDP PORTB,3 ; LED indiquant la programmation de l'EEPROM par la TI #DEFINE T0 select_tab,0 ;flag de selection de la table en rom n°0 #DEFINE T1 select_tab,1 ;flag de selection de la table en rom n°1 #DEFINE T2 select_tab,2 ;flag de selection de la table en rom n°2 #DEFINE T3 select_tab,3 ;flag de selection de la table en rom n°3 #DEFINE T4 select_tab,4 ;flag de selection de la table en rom n°4 #DEFINE T5 select_tab,5 ;flag de selection de la table en rom n°5 #DEFINE T6 select_tab,6 ;flag de selection de la table en rom n°6 #DEFINE M0 select_mode,0 ;flag de selection du mode0 d'affichage #DEFINE M1 select_mode,1 ;flag de selection du mode1 d'affichage #DEFINE M2 select_mode,2 ;flag de selection du mode2 d'affichage #DEFINE M3 select_mode,3 ;flag de selection du mode3 d'affichage #DEFINE M4 select_mode,4 ;flag de selection du mode4 d'affichage #DEFINE M5 select_mode,5 ;flag de selection du mode5 d'affichage #DEFINE M6 select_mode,6 ;flag de selection du mode6 d'affichage #DEFINE M7 select_mode,7 ;flag de selection du mode7 d'affichage #DEFINE run_changemode flag_div,0 ; à 1 lorsque qu'on change de mode ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x20 ; début de la zone variables cmpt1 : 1 ; compteur de boucles 1 cmpt2 : 1 ; compteur de boucles 2 cmpt3 : 1 ; compteur de boucles 3 ligne : 1 ; adresse de l'octet de l'EEPROM ou ROM selectionner ligne_int : 1 ; adresse de l'octet de l'EEPROM pour l'interruption numero : 1 ;compteur de bits pour l'affichage d'une ligne valeur : 1 ; variable de lecture de la donné pour l'affichage lig2 : 1 ;variable de comptage pour mode affichage plein écran w_temp :1 ; Sauvegarde de W dans interruption status_temp : 1 ; Sauvegarde de STATUS dans interrupt dcompt : 1 ;compteur de bit pour receptopn ti donner : 1 ; donner reçue de la TI temp :1 ;variable de la mini tempo select_tab:1 ;variable contenant les flags permetant la selection des tables select_mode:1 ;variable contenant les flags permetant la selection des modes flag_div:1 ;variable contenant les flags divers ligne_mode:1 ;adresse de l'octet pour affichage des image lors du changement de mode val_valeur:1 ;valeur lu en rom pour affichage image val_numero:1 ;valeur du numero du bit pour affichage image val_lig2:1 ;valeur du numero de comptage pour affichage image ENDC ; Fin de la zone ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************** ; 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é call intrb0 ;traiter interrupt RB0 ;restaurer registres ;------------------- 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 bcf INTCON , INTF ; effacer flag INT/RB0 retfie ; return from interrupt ;********************************************************************** ; INTERRUPTION RB0/INT * ;********************************************************************** intrb0 bcf STATUS,RP0 ; Sélectionner banque 0 ; car on ne sait pas sur quelle banque ; on est dans une interruption (le ; programme principal peut avoir changé ; de banque. Ce n'est pas le cas ici, ; mais c'est une sage précaution bsf LEDP ; on allume la LED pour indiquer que la programmation commence ; call tempo ; call tempo ; attendre un peu clrf ligne_int conti goto azerty ;-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ; Reception d'un octet envoyer par la TI ;-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ clrf donner clrf dcompt zzz rlf donner,f xxx btfsc clk goto xxx yyy btfss clk goto yyy ooo movlw 50 movwf temp boucle ;mini tempo nop decfsz temp , f ; décrémenter compteur et tester sa valeur goto boucle btfsc data goto egal1 bcf donner,0 goto decal egal1 bsf donner,0 decal incf dcompt,f btfss dcompt,3 goto zzz movf donner,w ;-+-+-+-+-+-+-+-+-+FIN DU PROG DE RECEPTION-+-+-+-+-+-+-+-+-+-+-+-+-+-+ azerty ;"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ; sous-prog d'écriture en EEPROM à l'@ ligne_int ;"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" movf donner,w ; charger donner bsf STATUS,RP0 ;bank 1 movwf EEDATA ; placer data dans registre bcf STATUS,RP0 ;bank 0 movf ligne_int,w ; charger adresse d'écriture bsf STATUS,RP0 ;bank 1 movwf EEADR ; placer dans registre loop bcf INTCON , GIE ; interdire interruptions btfsc INTCON , GIE ; tester si GIE bien à 0 goto loop ; non, recommencer bsf EECON1 , WREN ; autoriser accès écriture bcf EECON1 , EEIF ; effacer flag de fin d'écriture movlw 0x55 ; charger 0x55 movwf EECON2 ; envoyer commande movlw 0xAA ; charger 0xAA movwf EECON2 ; envoyer commande bsf EECON1 , WR ; lancer cycle d'écriture bcf EECON1 , WREN ; verrouiller prochaine écriture ; fin ecriture ; Tester si écriture précédente eeprom terminée ; --------------------------------------------- wait btfsc EECON1 , WR ; tester si écriture en cours goto wait ; oui, attendre bcf STATUS,RP0 ; repasser en banque 0 ;fin test incf ligne_int,f movlw 128 ;on teste si subwf ligne_int,w ;ligne_int = 129 btfss STATUS,Z ; si oui on saute quit sous prog goto conti ;si non on saute à pasfin bcf LEDP ; on eteint la LED pour indiquer que la programmation est terminer return ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init movlw 7 movwf CMCON ;DESACTIVE LES COMPARATEURS clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 bsf STATUS,RP0 ; sélectionner banque 1 clrf EEADR ; permet de diminuer la consommation movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; Effacer RAM ; ------------ movlw 0x20 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirec init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,6 ; tester si fin zone atteinte (>=40) goto init1 ; non, boucler btfss FSR,4 ; tester si fin zone atteinte (>=50) goto init1 ; non, boucler movlw b'00001001' movwf PORTB movlw 0xFF movwf PORTA bcf STATUS,RP0 ; Sélectionner banque 0 movlw INTERMASK ; masque interruption movwf INTCON ; charger interrupt control bsf M0 BsF STATUS,C goto start ;********************************************************************* ; SOUS-ROUTINE DE TEMPORISATION ;********************************************************************* ;-------------------------------------------------------------------- ; Elle ne reçoit aucun paramètre et n'en retourne aucun ;-------------------------------------------------------------------- tempo movlw 1 ; pour 2 boucles movwf cmpt3 ; initialiser compteur3 boucle3 clrf cmpt2 ; effacer compteur2 boucle2 clrf cmpt1 ; effacer compteur1 btfsc run_changemode ;si le flag=0 alors tester bouton goto boucle1 btfss B_MODE call gest_mode ;bouton de changement de mode appuyer (niv bas) boucle1 nop ; perdre 1 cycle *256 *256 *2 nop decfsz cmpt1 , f ; décrémenter compteur1 goto boucle1 ; si pas 0, boucler decfsz cmpt2 , f ; si 0, décrémenter compteur 2 goto boucle2 ; si cmpt2 pas 0, recommencer boucle1 decfsz cmpt3 , f ; si 0, décrémenter compteur 3 goto boucle3 ; si cmpt3 pas 0, recommencer boucle2 return ; retour de la sous-routine ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;sous prog de gestion du mode d'affichage ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ affi call lecture ; lecture dans eeprom @ ligne btfsc valeur,7 ;teste si bit 7 de la valeur lu=0 alors affichage écran entier goto egal01 ;non (bit=1) affichage écran entier call affil ;oui MODE AFFICHAGE 1 LIGNE goto endsp egal01 clrf lig2 ;MODE AFFICHAGE ECRAN ENTIER ttt call affil incf lig2,f btfss lig2,3 goto ttt endsp return ;/////////////////////////////////////////////////////////////////// ; sous programme de lecture en eeprom ;/////////////////////////////////////////////////////////////////// eelect movf ligne,w ;+++ lecture de l'EEPROM BSF STATUS,RP0 ;on passe en banque 1 movwf EEADR ; adresse à lire dans registre EEADR bsf EECON1 , RD ; lancer la lecture EEPROM movf EEDATA , W ; charger valeur lue dans W bcf STATUS , RP0 ; repasser en banque0 ;+++ fin lecture movwf valeur return ;******************************************************************* ; Sous prog. de décodage, affichage d'un ecran ;******************************************************************* affil call lecture movlw 7 movwf numero RETOU btfsc valeur,0 ;lecture bit1 dde valeur et envoie sur DIL goto EGUN bcf DIL goto SUIT EGUN bsf DIL SUIT bcf CKIL ; front montant bsf CKIL rrf valeur,f ; rotation a droite de valeur decfsz numero,f ;decremente numero et teste si =0 goto RETOU incf ligne,f ; si =0 incrémente ligne return ;***************************************************************** ; ;***************************************************************** lecture btfsc T0 call table0 btfsc T1 call table1 btfsc T2 call table2 btfsc T3 call table3 btfsc T4 call table4 btfsc T5 call eelect movwf valeur return ;---------------------------------------------------------------------- ; gestion du changement de mode par appuis sur bouton poussoir - ;---------------------------------------------------------------------- gest_mode bsf run_changemode ; active le flag de changement de mode(interdire le changement) BCF STATUS,C rlf select_mode,f ;a chaque appuis sur btfss M7 ; le bouton poussoir goto pas_M7 ;on change de mode (incrémentation) movlw 1 movwf select_mode pas_M7 ;choix des images suivant le mode btfsc M0 movlw 0 btfsc M1 movlw 8 btfsc M2 movlw 16 btfsc M3 movlw 24 btfsc M4 movlw 32 btfsc M5 movlw 40 btfsc M6 movlw 48 movwf ligne_mode ;------affichage du mode avec utilisation de la table image------ clrf val_lig2 ;*********affichage d'une ligne de la table image***** affil_i call image movwf val_valeur movlw 7 movwf val_numero RETOU2 btfsc val_valeur,0 ;lecture bit1 dde valeur et envoie sur DIL goto EGUN2 bcf DIL goto SUIT2 EGUN2 bsf DIL SUIT2 bcf CKIL ; front montant bsf CKIL rrf val_valeur,f ; rotation a droite de valeur decfsz val_numero,f ;decremente numero et teste si =0 goto RETOU2 incf ligne_mode,f ; si =0 incrémente ligne ;************** incf val_lig2,f btfss val_lig2,3 goto affil_i call tempo call tempo call tempo call tempo call tempo ;plusieur tempo pour eviter les rebond du bouton et le changement de mode trop rapide movlw 1 movwf cmpt2 movwf cmpt3 ;réinisalisation des compteur de la tempo, pour pas quel dure très longtemps bcf run_changemode ;autoriser à changer de mode return ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start movlw 0 movwf ligne ; initialisation de l'adresse de lecture en rom ou en eeprom btfss M0 ;teste si on est en mode 0 goto pas_M0 rlf select_tab,f ;si mode zero alors rotation des tables btfss T6 ;teste si on afficher toute les tables goto pasfin movlw 1 ; toute les tables afficher alors retour a la table1 goto fin_test_mode pas_M0 ;si pas en mode 0 btfsc M1 ; alors teste des modes les un après les autre movlw B'00000001' ; mode1=table0 btfsc M2 movlw B'00000010' ;mode2=table1 btfsc M3 movlw B'00000100' ;mode3=table2 btfsc M4 movlw B'00001000' ;mode4=table3 btfsc M5 movlw B'00010000' ;mode5=table4 btfsc M6 movlw B'00100000' ;mode6=table5 fin_test_mode movwf select_tab pasfin call affi ; va au spous-prog principal de gestion de l'afficheur call tempo ; temporisation ;----pour test sans tempo ; btfsc run_changemode ;si le flag=0 alors tester bouton ; goto dsqdsd ; btfss B_MODE ; call gest_mode ;bouton de changement de mode appuyer (niv bas) ;dsqdsd btfss T5 goto mode_rom movlw 128 ;on teste si subwf ligne,w ;ligne = 129 btfss STATUS,Z ; si oui on saute à start goto pasfin ;si non on saute à pasfin BCF STATUS,C goto start mode_rom movlw 248 ;on teste si subwf ligne,w ;ligne = 248 btfss STATUS,Z ; si oui on saute à start goto pasfin ;si non on saute à pasfin BCF STATUS,C goto start ;********************************************************************* ; Tables des écran d'affichage enregister en ROM * ;********************************************************************* ;--------------------------------------------------------------------- ; Ne pas oublier de valider le radix décimal par défaut dans le noeud ; principal du projet. N'oubliez pas que la directive "END" doit se ; trouver après la dernière ligne de votre programme. Ne laissez donc ; pas cette directive dans le programme principal. ;--------------------------------------------------------------------- org 0x200 image movlw 2 movwf PCLATH movf ligne_mode,w addwf PCL,f dt 248,192,160,192,248,134,137,134 ; affiche "M0" dt 248,192,160,192,248,128,136,159 ; affiche "M1" dt 248,192,160,192,248,128,139,141 ; affiche "M2" dt 248,192,160,192,248,128,149,159 ;affiche "M3" dt 240,192,160,206,242,135,130,128 ;affiche "M4" dt 248,192,160,192,248,128,141,139 ; affiche "M5" dt 240,192,160,192,240,143,149,151 ;affiche "M6" dt 255,200,202,176,130,128,130,128 ; affiche "P..." org 0x300 table4 ;31 ecran a afficher enregistrer en rom(carre qui rétréci) movlw 03 movwf PCLATH movf ligne , w ; charger nombre addwf PCL,f ; saute au caractere a afficher (décalage contenu dans W) dt 255,193,193,193,193,193,193,255 dt 128,190,162,162,162,162,190,128 dt 128,128,156,148,148,156,128,128 ;carre qui dt 128,128,128,136,136,128,128,128 ;qui rétréci dt 128,128,156,148,148,156,128,128 dt 128,190,162,162,162,162,190,128 dt 255,193,193,193,193,193,193,255 dt 128,190,162,162,162,162,190,128 dt 128,128,156,148,148,156,128,128 ;carre qui dt 128,128,128,136,136,128,128,128 ;qui rétréci dt 128,128,156,148,148,156,128,128 dt 128,190,162,162,162,162,190,128 dt 255,193,193,193,193,193,193,255 dt 128,190,162,162,162,162,190,128 dt 128,128,156,148,148,156,128,128 ;carre qui dt 128,128,128,136,136,128,128,128 ;qui rétréci dt 128,128,156,148,148,156,128,128 dt 128,190,162,162,162,162,190,128 dt 255,193,193,193,193,193,193,255 dt 128,190,162,162,162,162,190,128 dt 128,128,156,148,148,156,128,128 ;carre qui dt 128,128,128,136,136,128,128,128 ;qui rétréci dt 128,128,156,148,148,156,128,128 dt 128,190,162,162,162,162,190,128 dt 255,193,193,193,193,193,193,255 dt 128,190,162,162,162,162,190,128 dt 128,128,156,148,148,156,128,128 ;carre qui dt 128,128,128,136,136,128,128,128 ;qui rétréci dt 128,128,156,148,148,156,128,128 dt 128,190,162,162,162,162,190,128 dt 255,193,193,193,193,193,193,255 ;ligne248 org 0x400 table3 ;31 ecran a afficher enregistrer en rom (chenillard movlw 04 movwf PCLATH movf ligne , w ; charger nombre addwf PCL,f ; saute au caractere a afficher (décalage contenu dans W) dt 128,160,160,160,128,132,128,128 dt 128,128,160,160,160,132,128,128 dt 128,128,128,160,160,164,128,128 dt 128,128,128,128,160,180,128,128 dt 128,128,128,128,128,188,128,128 dt 128,144,128,128,128,158,128,128 dt 128,144,128,128,128,143,128,128 dt 128,144,128,128,128,199,128,128 dt 128,144,128,128,128,227,128,128 dt 128,144,128,128,128,241,128,128 dt 128,144,128,128,144,240,128,128 dt 128,144,128,144,144,176,128,128 dt 128,144,144,144,144,144,128,128 dt 144,144,144,146,144,128,128,128 dt 144,144,144,146,128,128,128,144 dt 144,144,144,130,128,128,144,144 ;ligne128 dt 144,144,128,130,128,128,152,144 dt 144,128,128,130,128,128,156,144 dt 128,128,128,130,128,128,158,144 dt 128,128,128,130,128,130,158,128 dt 128,128,128,130,130,130,142,128 dt 128,128,130,130,130,130,134,128 dt 128,130,130,130,130,130,130,128 dt 130,130,130,130,130,130,130,130 dt 128,250,128,128,128,128,250,128 dt 170,170,170,170,170,170,170,170 ;ecriture "boom !!" dt 62,42,22,0,12,18,12,0 dt 12,18,12,0,14,16,8,16 dt 14,0,0,122,0,0,122,0 dt 128,128,128,250,128,128,250,128 dt 128,128,128,250,128,128,250,128 ;ligne248 org 0x500 table2 ;31 ecran a afficher enregistrer en rom movlw 05 movwf PCLATH movf ligne , w ; charger nombre addwf PCL,f ; saute au caractere a afficher (décalage contenu dans W) dt 128,128,128,136,136,128,128,128 dt 128,128,156,148,148,156,128,128 dt 128,190,162,162,162,162,190,128 dt 255,193,193,193,193,193,193,255 dt 193,162,148,136,136,148,168,193 dt 130,194,180,136,136,150,161,160 dt 132,132,200,184,142,137,144,144 dt 136,136,136,248,143,136,136,136 dt 144,144,136,155,236,136,132,132 dt 160,144,137,154,172,200,132,130 dt 192,161,146,140,152,164,194,129 dt 193,162,148,136,136,148,162,193 dt 128,162,148,136,136,148,162,128 dt 128,128,148,136,136,148,128,128 dt 128,128,128,136,136,128,128,128 dt 128,128,128,128,128,128,128,128 ;ligne128 dt 128,128,128,136,136,128,128,128 dt 128,128,136,148,148,136,128,128 dt 128,170,128,162,162,128,170,128 dt 201,128,128,193,193,128,128,201 dt 128,128,128,136,136,128,128,128 dt 128,128,136,148,148,136,128,128 dt 128,170,128,162,162,128,170,128 dt 201,128,128,193,193,128,128,201 dt 128,128,128,128,128,128,128,128 dt 170,170,170,170,170,170,170,170 dt 213,213,213,213,213,213,213,213 dt 213,170,213,170,213,170,213,170 dt 170,213,170,213,170,213,170,213 dt 213,170,213,170,213,170,213,170 dt 170,213,170,213,170,213,170,213 ;ligne248 org 0x600 table1 ;31 ecran a afficher (mode étoile) movlw 06 movwf PCLATH movf ligne , w ; charger nombre addwf PCL,f ; saute au caractere a afficher (décalage contenu dans W) dt 128,128,128,128,128,128,128,128 dt 193,128,128,128,128,128,128,193 dt 128,162,128,128,128,128,162,128 dt 213,162,213,128,128,213,162,213 dt 128,170,148,170,170,148,170,128 dt 128,128,148,136,148,136,128,128 dt 128,128,128,136,136,128,128,128 dt 128,128,136,128,128,136,128,128 dt 128,148,136,148,148,136,148,128 dt 148,136,148,128,128,148,136,148 dt 136,148,128,128,128,128,148,136 dt 148,128,128,128,128,128,128,148 dt 148,148,128,128,128,128,148,148 dt 148,148,148,128,128,148,148,148 dt 148,148,148,148,148,148,148,148 dt 162,162,162,162,162,162,162,162 ;ligne128 dt 193,193,193,193,193,193,193,193 dt 193,128,128,128,128,128,128,193 dt 128,162,128,128,128,128,162,128 dt 128,128,148,128,128,148,128,128 dt 128,128,128,136,136,128,128,128 dt 128,128,128,136,136,128,128,128 dt 128,128,148,128,128,148,128,128 dt 128,170,128,193,193,128,170,128 dt 201,128,128,128,128,128,128,201 dt 255,193,193,193,193,193,193,255 dt 255,255,227,227,227,255,255,255 dt 255,255,255,247,247,255,255,255 dt 128,190,190,190,190,190,190,128 dt 128,128,156,156,156,156,128,128 dt 128,128,128,136,136,128,128,128 ;ligne248 org 0x700 table0 ;31 ecran a afficher enregistrer en rom (1er essai) movlw 07 movwf PCLATH movf ligne , w ; charger nombre addwf PCL,f ; saute au caractere a afficher (décalage contenu dans W) dt 128,128,128,136,136,128,128,128 dt 128,128,156,148,148,156,128,128 dt 128,190,162,162,162,162,190,128 dt 255,193,193,193,193,193,193,255 dt 193,162,148,136,136,148,168,193 dt 130,194,180,136,136,150,161,160 dt 132,132,200,184,142,137,144,144 dt 136,136,136,248,143,136,136,136 dt 144,144,136,155,236,136,132,132 dt 160,144,137,154,172,200,132,130 dt 192,161,146,140,152,164,194,129 dt 193,162,148,136,136,148,162,193 dt 128,162,148,136,136,148,162,128 dt 128,128,148,136,136,148,128,128 dt 128,128,128,136,136,128,128,128 dt 128,128,128,128,128,128,128,128 ;ligne128 dt 128,128,128,136,136,128,128,128 dt 128,128,136,148,148,136,128,128 dt 128,170,128,162,162,128,170,128 dt 201,128,128,193,193,128,128,201 dt 128,128,128,136,136,128,128,128 dt 128,128,136,148,148,136,128,128 dt 128,170,128,162,162,128,170,128 dt 201,128,128,193,193,128,128,201 dt 128,128,128,128,128,128,128,128 dt 170,170,170,170,170,170,170,170 dt 213,213,213,213,213,213,213,213 dt 213,170,213,170,213,170,213,170 dt 170,213,170,213,170,213,170,213 dt 213,170,213,170,213,170,213,170 dt 170,213,170,213,170,213,170,213 ;ligne248 END ; directive fin de programme