;11 oct 2006 passage au 16F88 ;------------ ;version HAPR06c.asm test avec 47 cars ..bugs ! ;version HAPR06b du 3/10 OK ..apres correction bug franchissement de page ;version HAPR_06 bug‚e => texte 32 car defilant sur 16 par pas de 1 car ! ; avec bug sur lettre U et Y ? ;version HAPR_04.asm testee OK affiche 1234567890123456 en fixe ;rev 1.2 30 sept 06 ;rev 1.1 25 sept .. bug‚e + fil commun led (rigide) cass‚ … ras la soudure ;rev 1.0 PF 23 sep 06 ;version de base 1062005-v1.asm ; 16 car only #include "..\common\p16f88_.inc" list p=PIC16F88 EXPAND ;Program Configuration Register 1 __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF &_MCLR_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC ;Program Configuration Register 2 __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF ERRORLEVEL -302 ;#define DEBUG ;------- Hardware ------------ ; PIC PROJECT BOARD FARNELL 527-646 avec resonateur ceramique 4Mhz ; 8 Sorties sur PORTB -> ULN2803 -> 8x 390 ohms -> 8 leds rouge diam 1,8mm ; 1 entree sur PORTA,0 <- Transistor 2N2222 <- capteur de proximite ; 1 entre sur PORTA,1 libre ; 1 sortie sur PORTA,2 libre ; 1 sortie sur PORTA,3 -> DS275 -> RS232 Tx ; 1 entre sur PORTA,4 <- DS275 <- Rs232 Rx ; "Voice Coil" Disque dur actionne/synchronise par oscilateur NE555, ; R ajustable domaine de frequence : ;---- Equivalences --------- #define Leds PORTB #define Top_Synchro PORTA,0 #define Rs_Tx PORTA,3 #define Rs_Rx PORTA,4 #define Quartz 4000000 ;-------------------------------------------------------------------------- ;demarage apres reset ;-------------------------------------------------------------------------- org 0x000 ; Adresse de depart apres reset goto start ; tout est en bas. ;-------------------------------------------------------------------------- ;interuption ;-------------------------------------------------------------------------- org 0x04 ;en cas d'interuption (inutilise) retfie ;on rentre ;-------------------------------------------------------------------------- ;DECLARATION VARIABLE ;-------------------------------------------------------------------------- CBLOCK 0x020 ; debut de la zone variables text :32 cmpt1 : 1 ; compteur de boucles 1 varun : 1 ; une variable ncar : 1 ; numero de caractere pendant l'affichage ncol : 1 ; numero de colone curseur : 1 ; curseur d'ecriture (la ou le texte sera modifier) charRS : 1 ; charactere recu _Index _NbPasses index_text count1 ;delay routines count2 ;delay routines count3 ;delay routines _RsCount _RsByte _Cpt1 _Temp1 dummy3 LastRambank0 ENDC IF ( (LastRambank0) > 0x7F ) ERROR "Attention debordement zone RAM" ENDIF ;-------------------------------------------------------------------------- ; boucle principale ;-------------------------------------------------------------------------- start ;init ports bank1 movlw 0x00 ;sorties movwf PORTB ;port B (8 leds) movlw b'00010011' ; movwf PORTA ;specifique 16F88 CLRF ANSEL ; pas d'entre ANA movlw b'00000111' ; movwf CMCON ; Disable built-in comparators so digital I/O's work clrf INTCON bank0 clrf PORTB movlw 0x44 movwf _RsByte ;init zone text clrf ncar movlw EE2-EE0 movwf _Cpt1 St1 movf _Cpt1,w call Read_EE movwf _RsByte movlw 0x20 ; on pointe en debut de texte addwf ncar,w ; + offset de rangement du caractere movwf FSR movf _RsByte,w ; recupere car lu en eeprom ANDLW 0x0FF ; si zero ,dernier car BTFSC STATUS, Z goto Presentation movwf INDF ; le range dans zone text incf ncar,f incf _Cpt1,f goto St1 Presentation CALL Rs_CrLf Pres1 clrf _Cpt1 movf _Cpt1,w call Msg_Eeprom Pres2 CALL Rs_CrLf movlw EE1-EE0 MOVWF _Cpt1 call Msg_Eeprom IFNDEF DEBUG ;Test Hardware, allumage successif des 8 leds sur 10 balayages movlw .10 movwf _RsCount Test_Hardware movlw 0x01 movwf _Cpt1 bcf STATUS,C TH_1 call WaitSynchro call delay_5mS movf _Cpt1,w movwf PORTB call delay_5mS clrf PORTB call delay_1mS movf _Cpt1,w movwf PORTB call delay_5mS clrf PORTB rlf _Cpt1,f BTFSS STATUS, C goto TH_1 decf _RsCount,f BTFSS STATUS, Z goto Test_Hardware call WaitSynchro ENDIF movlw d'0' movlw curseur ; le curseur et sur 0 movlw 0x20 movwf index_text boucle IFNDEF DEBUG movlw d'4' else movlw d'01' endif movwf _NbPasses boucle1 clrf ncar ; on passe en caractere 16 (ncar dans [1, 16] inclu IFNDEF DEBUG call WaitSynchro ; capteur de proximite entre en PortA,0 call delay_1mS call delay_1mS ENDIF nextcar clrf ncol ; colone 0 clrf PCLATH ; page 0 movf index_text,w ; on pointe en debut de texte addwf ncar,w ; w a l'adresse du caractere courant andlw 0x3F iorlw 0x20 movwf FSR ; on va chercher le caractere movf INDF, w ; w a la valeur du caractère courant addlw 0xE0 ; soustrait origine de 32 (add-32) movwf varun ; varun et W contiennent la valeur du caractere clrf cmpt1 addlw d'205' ; si w+205>255 ; w > 50 on et on est en plage 3 btfsc STATUS, C ; si il y a eu depassement bsf cmpt1, 0 ; on ajoute 1 a cmpt1 bsf cmpt1, 1 ; dans tout les cas on ajoute 2 a cmpt1 movf cmpt1, w ; w vaut ce qu'il y'a dans cmpt1 movwf PCLATH ; on va dans les 2xx ou 3xx ;------------ movf varun,w ; valeur du CAR bcf STATUS,C rlf varun, f ; *2 rlf varun, f ; *2 addwf varun, f ; +1 => on multiplie par 5 pour avoir l'adresse de la premiere colone btfsc cmpt1,0 incf varun,f movf varun,w movwf _Index nextcol movf ncol, w addwf _Index, w ; pour avoir la bonne colone btfss cmpt1, 0 ; si on est dans les 2xx, cmpt1,0=0 call Char_tbl2 ; dans la table btfsc cmpt1, 0 ; si on est dans les 3xx, cmpt1,0=1 call Char_tbl3 ; dans la table movwf PORTB ; sur le port B call delay_200uS ; appeler la tempo de temp d'affichage clrf PORTB ; RAZ leds port B incf ncol,f movf ncol,w sublw 5 btfss STATUS,Z goto nextcol call delay_200uS ; appeler la tempo de temp d'affichage call delay_200uS ; appeler la tempo de temp d'affichage call delay_200uS ; appeler la tempo de temp d'affichage incf ncar , f btfss ncar,4 ; test 16 goto nextcar decfsz _NbPasses,f goto boucle1 incf index_text,f movf index_text,w andlw 0x3F ;maxi de l'index text iorlw 0x20 ; mini de l'index text movwf index_text movlw "." call Rs_Putchar goto boucle ;=================================================== ; subroutines ;=================================================== delay_RS MOVLW .32 ; pour 9600 bauds MOVWF count1 ; DECFSZ count1,F ; 1 cycle si pas de saut GOTO $-1 ; 2cycles Return delay_Half_RS MOVLW .16 ; pour 9600 bauds MOVWF count1 ; DECFSZ count1,F GOTO $-1 Return delay_25uS goto $+1 goto $+1 movlw 0x01 movwf count1 movlw 0x01 movwf count2 movlw .4 movwf count3 goto delay1 delay_100uS movlw 0x01 movwf count1 movlw 0x01 movwf count2 movlw .19 movwf count3 goto delay1 delay_200uS movlw 0x01 movwf count1 movlw 0x01 movwf count2 movlw .38 movwf count3 goto delay1 delay_1mS movlw 0x01 movwf count1 movlw .1 movwf count2 movlw .200 movwf count3 goto delay1 delay_5mS movlw 0x01 movwf count1 movlw .4 movwf count2 movlw .230 movwf count3 goto delay1 delay_10mS movlw 0x01 movwf count1 movlw .8 movwf count2 movlw .205 movwf count3 goto delay1 delay_25mS movlw 0x01 ;24,36mS /4Mhz movwf count1 ;25,4mS /32Mhz movlw .20 movwf count2 movlw .128 movwf count3 goto delay1 delay_100mS movlw 1 movwf count1 movlw .79 movwf count2 movlw .1 movwf count3 goto delay1 delay_250mS movlw 1 movwf count1 movlw .196 movwf count2 movlw .2 movwf count3 goto delay1 delay_1S movlw .4 movwf count1 movlw .14 movwf count2 movlw .56 movwf count3 goto delay1 delay_2_5s movlw .8 movwf count1 movlw .161 movwf count2 movlw .218 movwf count3 goto delay1 delay1 decfsz count3,f goto $-1 decfsz count2,f goto $-3 decfsz count1,f goto $-5 return ;---------------------------------- WaitSynchro ; capteur de proximite + inversion -> entre en PortA,0 IFNDEF DEBUG W1: btfsc Top_Synchro ; etat 1 = hors zone synchro goto W1 W2 btfss Top_Synchro ; attente front montant ,donc mouvement de gauche vers droite goto W2 call delay_5mS ; pas trop pres du bord gauche! ENDIF return ;-------------------------------------- Read_RS Clrf _RsByte Movlw H'08' ;byte 8 bit Movwf _RsCount Rx1 call delay_RS ;bit de start Bcf STATUS,C ;Carry=0 Btfsc Rs_Rx ;lit et test l'entree Rx Bsf STATUS,C ;Rx =1, saute si Rx =0 rrf _RsByte,f Decfsz _RsCount,f Goto Rx1 call delay_RS ;bit de stop Call delay_RS return ;----------------- Rs_Putchar movwf _Temp1 Movlw H'08' ;correspond a un byte de 8 bits Movwf _RsCount ;place dans RsCount Bcf Rs_Tx ;bit start a 0 Call delay_RS ;wait valeur 1bit 4800 Bauds Rrf _Temp1,F ;shift droite dans carry Btfsc STATUS,C ;si carry 0 alors saute Goto $+3 ;carry =1 Bcf Rs_Tx ;Tx dans PORTX =0 Goto $+2 Bsf Rs_Tx ;Tx dans PORTx =1 Call delay_RS Decfsz _RsCount,F ;RsCount =RsCount -1 Goto $-8 Bsf Rs_Tx ;bit de stop Call delay_RS ;byte envoye Call delay_RS ;byte envoye return ;--------------- Rs_CrLf movlw .13 call Choix_Out movlw .10 call Choix_Out return Choix_Out IFNDEF DEBUG call Rs_Putchar ENDIF return Msg_Hapr Car_Suiv movf _Cpt1,w call WaitSynchro ; capteur de proximite entre en PortA,0 ;bank1 ; pIC16F628 ! MOVWF EEADR bank1 ; PIC16F84 BSF EECON1,RD ; bit 0 bank0 ; PIC16F84 MOVF EEDATA,W bank0 movwf _RsByte ANDLW 0x0FF BTFSS STATUS, Z goto La_Suite return La_Suite movlw d'5' movwf ncol Col_Suiv movlw .32 subwf _RsByte,w ; valeur ascii -32 = offset table movwf varun ; varun a la valeur du caractere clrf cmpt1 ; cmpt1 va nouS dire si on est en page 2xx ou 3xx addlw d'205' ; si w+205>255 ; w > 50 on est en plage 3 btfsc STATUS, C ; si il y a eu depassement bsf cmpt1, 0 ; on ajoute 1 a cmpt1 bsf cmpt1, 1 ; dans tout les cas on ajoute 2 a cmpt1 movf cmpt1, w ; w vaut ce qu'il y'a dans cmpt1 movwf PCLATH ; on va dans les 2xx ou 3xx rlf varun, f ; *2 rlf varun, f ; *2 addwf varun, f ; +1 => on multiplie par 5 pour avoir l'adresse de la premiere colone movf ncol, w sublw 5 ; on ajoute (5 - 'la colone courante') addwf varun, w ; pour avoir la bonne colone btfss cmpt1, 0 ; si on est dans les 2xx, cmpt1,0=0 call Char_tbl2 ; dans la table btfsc cmpt1, 0 ; si on est dans les 3xx, cmpt1,0=1 call Char_tbl3 ; dans la table movwf PORTB ; sur le port B call delay_200uS ; appeler la tempo de temp d'affichage clrf PCLATH decfsz ncol , f ; decrementer colone goto Col_Suiv movlw b'00000000' ; on eteind les leds movwf PORTB ; sur le port B call delay_200uS ; appeler la tempo de temp d'affichage 7em col call delay_200uS ; appeler la tempo de temp d'affichage 8em col incf _Cpt1 , f goto Car_Suiv return ;================================= Msg_Eeprom movf _Cpt1,w call Read_EE incf _Cpt1,f ANDLW 0x0FF BTFSC STATUS, Z Return call Choix_Out goto Msg_Eeprom return ;------- ; subroutine to read EEPROM memory Read_EE ;16F88 bank2 movwf EEADR ; indirect special function register bank3 bcf EECON1,EEPGD; pointer for data memory bsf EECON1,RD ; read EEPROM bank2 movf EEDATA,W ; EEPROM value in w bank0 return old_Read_EE ;bank1 ; pIC16F628 ! MOVWF EEADR bank1 ; PIC16F84 BSF EECON1,RD ; bit 0 bank0 ; PIC16F84 MOVF EEDATA,W bank0 return ; subroutine to write to EEPROM EWRITE bsf STATUS,RP1 ; select bank bcf STATUS,RP0 ; select memory bank 2 movwf EEDATA ; data register bcf INTCON,GIE ; disable interrupts bsf STATUS,RP0 ; select memory bank 3 bcf EECON1,EEPGD; pointer for data memory bsf EECON1,WREN ; enable write movlw H'55' ; place 55H in w for write sequence movwf EECON2 ; write 55H to EECON2 movlw H'AA' ; AAH to w movwf EECON2 ; write AA to EECON2 bsf EECON1,WR ; set WR bit and begin write sequence bsf INTCON,GIE ; enable interrupts bcf EECON1,WREN ; clear WREN bit WRITE btfsc EECON1,WR ; skip if write complete WR=0 when write complete goto WRITE ; not written yet bcf EECON1,EEIF ; clear write interrupt flag bcf STATUS,RP0 ; bank select bcf STATUS,RP1 ; select memory bank 0 return ; value written ;---------------------- ; init de la zone libre poue eviter les pb avec ICProg 1.5d ;------------------------ Nb2raz equ 0x200-$ org $ ; adresse courante fill (nop), Nb2raz-1 ; longueur zone vide … remplir ;res Nb2raz ; ne marche pas ??? ;----------------------------------------------------------------------------------------- ;table de caractere 5x7 car matrice 8x8 ne tiens pas dans un 16F84 ,il faut mini 16F628 ;----------------------------------------------------------------------------------------- org 0x200 Char_tbl2 addwf PCL,f ; ajoute W a PCL pour aller lire au bon endroi dt 0x00, 0x00, 0x00, 0x00, 0x00 ; 32 -esp- 20 dt 0x00, 0x00, 0x4F, 0x00, 0x00 ; 33 - ! - 21 dt 0x00, 0x07, 0x00, 0x07, 0x00 ; 34 - " - 22 dt 0x14, 0x7F, 0x14, 0x7F, 0x14 ; 35 - # - 23 dt 0x24, 0x2A, 0x7F, 0x2A, 0x12 ; 36 - $ - 24 dt 0x23, 0x13, 0x08, 0x64, 0x62 ; 37 - % - 25 dt 0x36, 0x49, 0x55, 0x22, 0x50 ; 38 - & - 26 dt 0x00, 0x05, 0x03, 0x00, 0x00 ; 39 - ' - 27 dt 0x1C, 0x22, 0x41, 0x00, 0x00 ; 40 - ( - 28 dt 0x00, 0x00, 0x41, 0x22, 0x1C ; 41 - ) - 29...50 dt 0x14, 0x08, 0x3E, 0x08, 0x14 ; 42 - * - 2A dt 0x08, 0x08, 0x3E, 0x08, 0x08 ; 43 - + - 2B dt 0x00, 0x50, 0x30, 0x00, 0x00 ; 44 - , - 2C dt 0x08, 0x08, 0x08, 0x08, 0x08 ; 45 - - - 2D dt 0x00, 0x60, 0x60, 0x00, 0x00 ; 46 - . - 2E dt 0x20, 0x10, 0x08, 0x04, 0x02 ; 47 - / - 2F dt 0x3E, 0x51, 0x49, 0x45, 0x3E ; 48 - 0 - 30 dt 0x00, 0x42, 0x7F, 0x40, 0x00 ; 49 - 1 - 31 dt 0x42, 0x61, 0x51, 0x49, 0x46 ; 50 - 2 - 32 dt 0x21, 0x41, 0x45, 0x4B, 0x31 ; 51 - 3 - 33..100 dt 0x18, 0x14, 0x12, 0x7F, 0x10 ; 52 - 4 - 34 dt 0x27, 0x45, 0x45, 0x45, 0x39 ; 53 - 5 - 35 dt 0x3C, 0x4A, 0x49, 0x49, 0x30 ; 54 - 6 - 36 dt 0x01, 0x71, 0x09, 0x05, 0x03 ; 55 - 7 - 37 dt 0x36, 0x49, 0x49, 0x49, 0x36 ; 56 - 8 - 38 dt 0x06, 0x49, 0x49, 0x29, 0x1E ; 57 - 9 - 39 dt 0x00, 0x36, 0x36, 0x00, 0x00 ; 58 - : - 3A dt 0x00, 0x56, 0x36, 0x00, 0x00 ; 59 - ; - 3B dt 0x08, 0x14, 0x22, 0x41, 0x00 ; 60 - < - 3C dt 0x14, 0x14, 0x14, 0x14, 0x14 ; 61 - = - 3D...150 dt 0x00, 0x41, 0x22, 0x14, 0x08 ; 62 - > - 3E dt 0x02, 0x01, 0x51, 0x09, 0x06 ; 63 - ? - 3F dt 0x32, 0x49, 0x79, 0x41, 0x3E ; 64 - @ - 40 dt 0x7E, 0x11, 0x11, 0x11, 0x7E ; 65 - A - 41 dt 0x7F, 0x49, 0x49, 0x49, 0x36 ; 66 - B - 42 dt 0x3E, 0x41, 0x41, 0x41, 0x22 ; 67 - C - 43 dt 0x7F, 0x41, 0x41, 0x22, 0x1C ; 68 - D - 44 dt 0x7F, 0x49, 0x49, 0x49, 0x41 ; 69 - E - 45 dt 0x7F, 0x09, 0x09, 0x09, 0x01 ; 70 - F - 46 dt 0x3E, 0x41, 0x49, 0x49, 0x7A ; 71 - G - 47...200 dt 0x7F, 0x08, 0x08, 0x08, 0x7F ; 72 - H - 48 dt 0x00, 0x41, 0x7F, 0x41, 0x00 ; 73 - I - 49 dt 0x20, 0x40, 0x41, 0x3F, 0x01 ; 74 - J - 4A dt 0x7F, 0x08, 0x14, 0x22, 0x41 ; 75 - K - 4B dt 0x7F, 0x40, 0x40, 0x40, 0x40 ; 76 - L - 4C dt 0x7F, 0x02, 0x0C, 0x02, 0x7F ; 77 - M - 4D dt 0x7F, 0x04, 0x08, 0x10, 0x7F ; 78 - N - 4E dt 0x3E, 0x41, 0x41, 0x41, 0x3E ; 79 - O - 4F dt 0x7F, 0x09, 0x09, 0x09, 0x06 ; 80 - P - 50 dt 0x3E, 0x41, 0x51, 0x21, 0x5E ; 81 - Q - 51 dt 0x7F, 0x09, 0x19, 0x29, 0x46 ; 82 - R - 52..255 Char_tbl1end org 0x300 Char_tbl3 addwf PCL,f ; ajoute W a PCL pour aller lire au bon endroi dt 0x46, 0x49, 0x49, 0x49, 0x31 ; 83 - S - 53 dt 0x01, 0x01, 0x7F, 0x01, 0x01 ; 84 - T - 54 dt 0x3F, 0x40, 0x40, 0x40, 0x3F ; 85 - U - 55 dt 0x1F, 0x20, 0x40, 0x20, 0x1F ; 86 - V - 56 dt 0x3F, 0x40, 0x38, 0x40, 0x3F ; 87 - W - 57 dt 0x63, 0x14, 0x08, 0x14, 0x63 ; 88 - X - 58 dt 0x07, 0x08, 0x70, 0x08, 0x07 ; 89 - Y - 59 dt 0x61, 0x51, 0x49, 0x45, 0x43 ; 90 - Z - 5A dt 0x7F, 0x41, 0x41, 0x00, 0x00 ; 91 - [ - 5B...300 dt 0x02, 0x04, 0x08, 0x10, 0x20 ; 92 - \ - 5C dt 0x00, 0x00, 0x41, 0x41, 0x7F ; 93 - ] - 5D dt 0x04, 0x02, 0x01, 0x02, 0x04 ; 94 - ^ - 5E dt 0x40, 0x40, 0x40, 0x40, 0x40 ; 95 - _ - 5F dt 0x00, 0x01, 0x02, 0x04, 0x00 ; 96 - ` - 60 dt 0x20, 0x54, 0x54, 0x54, 0x78 ; 97 - a - 61 dt 0x7F, 0x48, 0x44, 0x44, 0x38 ; 98 - b - 62 dt 0x38, 0x44, 0x44, 0x44, 0x20 ; 99 - c - 63 dt 0x38, 0x44, 0x44, 0x48, 0x7F ; 100 d - 64 dt 0x38, 0x54, 0x54, 0x54, 0x18 ; 101 e - 65 dt 0x08, 0x7E, 0x09, 0x01, 0x02 ; 102 f - 66 dt 0x0C, 0x52, 0x52, 0x52, 0x3E ; 103 g - 67 dt 0x7F, 0x08, 0x04, 0x04, 0x78 ; 104 h - 68 dt 0x00, 0x44, 0x7D, 0x40, 0x00 ; 105 i - 69 dt 0x00, 0x20, 0x40, 0x44, 0x3D ; 106 j - 6A dt 0x7F, 0x10, 0x28, 0x44, 0x00 ; 107 k - 6B dt 0x00, 0x41, 0x7F, 0x40, 0x00 ; 108 l - 6C dt 0x7C, 0x04, 0x18, 0x04, 0x78 ; 109 m - 6D dt 0x7C, 0x08, 0x04, 0x04, 0x78 ; 110 n - 6E dt 0x38, 0x44, 0x44, 0x44, 0x38 ; 111 o - 6F dt 0x7C, 0x14, 0x14, 0x14, 0x08 ; 112 p - 70 dt 0x08, 0x14, 0x14, 0x18, 0x7C ; 113 q - 71 dt 0x7C, 0x08, 0x04, 0x04, 0x08 ; 114 r - 72 dt 0x48, 0x54, 0x54, 0x54, 0x20 ; 115 s - 73 dt 0x04, 0x3F, 0x44, 0x40, 0x20 ; 116 t - 74 dt 0x3C, 0x40, 0x40, 0x20, 0x7C ; 117 u - 75 dt 0x1C, 0x20, 0x40, 0x20, 0x1C ; 118 v - 76 dt 0x3C, 0x40, 0x30, 0x40, 0x3C ; 119 w - 77 dt 0x44, 0x28, 0x10, 0x28, 0x44 ; 120 x - 78 dt 0x0C, 0x50, 0x50, 0x50, 0x3C ; 121 y - 79 dt 0x44, 0x64, 0x54, 0x4C, 0x44 ; 122 z - 7A dt 0x08, 0x36, 0x41, 0x00, 0x00 ; 123 { - 7B dt 0x00, 0x00, 0x7F, 0x00, 0x00 ; 124 | - 7C dt 0x00, 0x00, 0x41, 0x36, 0x08 ; 125 } - 7D dt 0x00, 0x08, 0x04, 0x08, 0x04 ; 126 ~ - 7E char_tbl3_end ORG 0x2100 EEPROM_16F88 equ $ ; "1234567890123456" ; message taille 16 car maxi (LCD) EE0 DT "HAPR88a.asm " EE1 DT "16F88_xx_061011",.0 EE2 DT " PaulFjujo ARSTZ " EE3 DT "1234567890123456",.0 EE4 DT " ABCDEFGHIJKLMNO" EE5 DT " PQRSTUVWXYZ abc" EE6 DT " defghijklmnopqr" EE7 DT " stuvwxyz END",0 finEEprom EQU $ EEpromLibre EQu 256-(finEEprom - EEPROM_16F88) END ; directive fin de programme