; rev 17/04 ; version speciale pour test Nokia LCD 3310 plac‚ sur support CI ; le LCD est reinitialis‚ a chaque boucle pour pouvoir trouver rapidement le positionnement exact ; du LCD sur le circuit imprim‚ et bloquer la fixation ; table car 5x7 plac‚ee en page 5 au lieu de 4 #include <../P16F877.inc> list p=PIC16F877,c=132,n=60,st=ON,mm=ON,t=ON,x=ON,r=hex __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF &_BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC ERRORLEVEL -302 ;======================================================== ; 2em test avec un LCD de 3310 certifi‚, mont‚ sur un Circuit imprim‚, ; contact a plat avec le connecteur d'origine du LCD et liaison au pas de 2,54mm ; vers connecteur de raccordement au PIC16F877 ; choix LCD 6L ou 8L avec "define LCD_8X16" ; Documentation LCD : ; lcd_controller_pcd8544.pdf, ; I2_cours.pdf Overview and Use of the PICmicro MSSP I2C Interface ; Hardware ; PIC16F877 Quartz 10MHz encadr‚ de 2x22pF ; LCD aliment‚ en 3V !!! ;----- Liaison SPI avec LCD Nokia --------------------- ; Pin 16F877 Nokia 3310 Pin ;15 RC0 SCE 4.7K 5 CS Chips Select ;16 RC1 D/C 4.7K 4 D/C data ou Commande ;17 RC2 Reset 4.7K 8 RES Reset ;18 RC3 SCL 4.7K 2 SCK clock ;23 RC4 SDA 4.7K 3 DIN Data input ; Power 1 +3V VDD ; Gnd 6 0V GND ; Vc 7 capa 1uF ;----- Liaison RS232 19200bds 8,N,1 --- ;25 RC6 Tx ----vert ---- 3 de DS275 5 -- RS232 --> Ecran ;26 RC7 Rx --blnc/vert--- 1 de DS275 7 -- RS232 <-- Clavier ;----- Liaison I2C Software ----------- ;40 RB7 ---> output-->SDA ;39 RB6 <--in/out---> SCL ;36 RB3 <-- 0V Sacrifi‚ pour programmation LVP (Bootloader) ;35 RB2 ---> out--> 2.7K-> LEDrouge --> +5V ;34 RB1 <-- inp BP Mise a l'heure par defaut ;----- ; 1 MCLR --> 4,7K --> au +5V ; 2 RA0 <-- Anlog Input --- potar 4,7K 0 a 3V ; 3 RA1 <-- Anlog Input --- potar 4,7K 0 a 3V ; 4 RA2 - ref a 0V ; 5 RA3 + ref a +3,0V ; 7 RA5 ---> out--> 2.7K-> LEDblanche --> +5V ; 11 et 32 --> VDD +5V ; 12 et 31 --> VSS 0V ;====================================================== ; cblock 0x21 Buffer_MAJ equ 0x20 cblock 0x20 SEC MIN HEURE JourSem Jour Mois Annee CtrlReg PDel0 PDel1 PDel2 BUFFER OUTER ;delay variable mS BoucleExt BoucleInt caractere offset_caractr pointeur_msg ;mensage (max. 255 caracteres) rotulo ;indique la position PCL dans le message Progression DATAL DATAH count1 count2 count3 receive Cpt1 ACCaLO ;Variables de calcul ACCaHI ACCbLO ACCbHI ACCcLO ACCcHI ACCdLO ACCdHI temp Flags Conf ADDR DEV_DS1307 ; adresse DS1307 RTC DEV_1624 ; Adresse DS1624 mesure Tø DEV_PCF8574 ; O_BYTE I_BYTE _N _N0 _N1 _Cpt1 _Cpt2 _RsByte _Temp1 _Temp2 _10it value Drapeaux ; Drapeaux de 8 bits a usage multiple ;7 signe 1= RETENUE si negatif ;6 elligible =1 ;5 si=1 => affichage simili flottant XX.XX ou en entier XXXX si =0 ;4 si=1 => affichage 5 digits (99999 ou XXX.XX), sinon si=0 4 digits ! ;3 si=1 => ;2 si=1 => selectionne Channel 1 ANA sinon Channel 0 ;1 si=1 => affichage LCD sinon sur RS232 ;0 endc LastBank0 EQU Drapeaux IF ( LastBank0 >= 0x70 ) ERROR "Attention debordement zone RAM bank0" ENDIF ;******************* ; COMMON DATA AREA ;-------------------- CBLOCK 0x71 ;Attention 0x70 used by ICD ; 0x71 ... 0x7B used by bootloader w_temp : 1 ; Sauvegarde registre W status_temp : 1 ; sauvegarde registre STATUS FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt) PCLATH_temp : 1 time:1 bufinptr : 1 ; pointeur sur caractcre courant buffer entree bufoutptr : 1 ; pointeur sur caractcre courant buffer sortie flags : 1 ; 8 flags divers ; b0 : parite calculee ; b1 : erreur de parite ; b2 : erreur de frame ; b3 : erreur overflow ENDC LastCDA equ PCLATH_temp IF ( LastCDA > 0x7F ) ERROR "Attention debordement zone RAM Bootloader en bank0" ENDIF #DEFINE PARITE flags,0 ; parit‚ calcul‚e #DEFINE ER_PAR flags,1 ; erreur de parit‚ #DEFINE ER_FR flags,2 ; erreur de frame #DEFINE ER_OV flags,3 ; erreur d'overflow ;*********************** ; VARIABLES BANQUE 1 ;*********************** ; Zone de 80 bytes cblock 0xA0 ; en bank1 Cpt10 ; Bcd Mcount btmp btmp1 dixmil mille cent dix un ; variables 16 bits SommeTamb :2 Tamb_F :2 ; Tamb STamb_F :2 valx :2 val1 :2 val2 :2 val3 :2 val4 :2 reste :2 result :2 Nb_1 :2 ; compteur endc ;*********************** ; VARIABLES BANQUE 2 ;*********************** ; Zone de 80 bytes CBLOCK 0x110 ; Debut de la zone (0x110 a 0x16F) bufin : D'80' ; zone de stockage des donnees saisies addwrite ENDC ; Fin de la zone ;*********************** ; VARIABLES BANQUE 3 ;*********************** ; Zone de 80 bytes ; ---------------- CBLOCK 0x190 ; D'but de la zone (0x190 a 0x1EF) bufout : D'80' ; message a envoyer ENDC ;==== Parametrage pour RS232 ==== #define FOSC D'10000000' ; <<< frequence du quartz[Hz], max. 20 MHz #define BAUD D'19200' ; <<< vitesse du port serie [bit/sec] #define BAUD_ERROR D'4'; <<< erreur de vitesse [%] #define TIMEOUT D'10' ;===== verification ============= IF ((FOSC/(D'16' * BAUD))-1) < D'256' #define DIVIDER (FOSC/(D'16' * BAUD))-1 #define HIGH_SPEED 1 ELSE #define DIVIDER (FOSC/(D'64' * BAUD))-1 #define HIGH_SPEED 0 ENDIF BAUD_REAL EQU FOSC/((D'64'-(HIGH_SPEED*D'48'))*(DIVIDER+1)) IF BAUD_REAL > BAUD IF (((BAUD_REAL - BAUD)*D'100')/BAUD) > BAUD_ERROR ERROR "mauvaise vitesse de la liaison serie" ENDIF ELSE IF (((BAUD - BAUD_REAL)*D'100')/BAUD) > BAUD_ERROR ERROR "mauvaise vitesse de la liaison serie" ENDIF ENDIF ;-- F(Quartz) ------------ IF FOSC > D'10240000' #define T1PS 8 #define T1SU 0x31 ELSE IF FOSC > D'5120000' #define T1PS 4 #define T1SU 0x21 ELSE IF FOSC > D'2560000' #define T1PS 2 #define T1SU 0x11 ELSE #define T1PS 1 #define T1SU 0x01 ENDIF ENDIF ENDIF TIMER EQU (D'65538'-(FOSC/(D'10'*4*T1PS))); valeur de reprise pour TIMER1 (0.1s int) ;========================= #define Quartz 10 ; pour les tempos! #define TABUL .9 #define OFFSET_ANA .512 #define RETENUE Drapeaux,7 #define ELLIGIBLE Drapeaux,6 #define SCE PORTC,0 #define DC PORTC,1 #define RST PORTC,2 #define I2C_SDA PORTB,7 ;RB7 (pin 40) ---> output-->SDA #define I2C_SCL PORTB,6 ;RB6 (pin 39) <--in/out---> SCL #define LEDrouge PORTB,2 #define LEDblanche PORTA,5 #define BP_MAL PORTB,1 ; BP de Mise a L'heure #define OUT_LCD Bsf Drapeaux,1 ; sortie sur LCD #define OUT_RS232 Bcf Drapeaux,1 ; sortie sur COM ;#define LCD_8x16 ;#define Test2 ;#define Devermine ;-------------------- ORG 0x0000 nop ; pour ICSP nop ; pour ICSP nop ; pour ICSP goto Init ;*********************** ; interruptions ;*********************** org 0x04 retfie ; return from interrupt ;****************************************** Init bank0 clrf PORTA clrf PORTB clrf PORTC bank1 movwf TRISA movlw b'00000010' ;RB1 en entree ;------------------------------------------ ; Configuration Voie ANALOGIQUE et logiques en bank1! ; MSB right justified ; max.ref sur 3,00V RA2 et min.ref sur 0,0V RA3 ; voie analogique AN0 pin RA0 et AN1 pin RA1 ; digital sur RA5 et RE0..RE2 ;------------------------------------------- movlw b'10001101' ; RA0,RA1= ANA, RA2=-Vref RA3=+Vref,RA5 =digital RE0..RE2=digital ,cadr‚ a droite movwf ADCON1 movlw b'00001111' ; RA0 RA1 en entrees car ANA et RA2 RA3 en Entrees car VREFs movwf TRISA movlw b'00000010' ;RB1 en entree movwf TRISB movlw b'00011000'; SCL SDA en entrees movwf TRISC ;init variable en bank1 clrf val1 clrf val1+1 clrf Nb_1 clrf Nb_1+1 bank0 ;------------------------------------------ ;Definition Voie ANALOGIQUE (en bank0!) ;right justified, max.ref = sur RA4 et min.ref= sur RA5 ;voie analogique AN0 pint Ra0 ;bit 7-6: ADCS1:ADCS0: A/D Conversion Clock Select bits 10 = FOSC/32 ;bit 5-3: CHS2:CHS0: Analog Channel Select bits 000 = channel 0, (RA2/AN2) RA0,1,2,3,5 ;bit 2: GO/DONE: A/D Conversion Status bit,If ADON = 1 1=in progress 0=Done ;bit 1: Unimplemented: Read as '0' ;bit 0: ADON: A/D On bit 1 = A/D converter module is operating movlw b'10000001' ;clock/32 Channel=0 ADON=1 movwf ADCON0 clrf INTCON bsf SCE ;/SCE a 1 bsf DC ;D/C a 1 bsf RST ;/RESET a 1 bcf LEDrouge call delay_100ms ;--------------------------------------------------------------------- ;config UART asynchrone PIC 16F877 DIL 40 broches ; pin 25 RC6 Tx ---vert ----- 3 de DS275 --- RS232 --> Ecran ; pin 26 RC7 Rx ---blnc/vert-- 1 de DS275 --- RS232 <-- Clavier ;---------------------------------------------------------------------- movlw 0x90 ; SPEN = 1, CREN = 1 movwf RCSTA ;configures RC7/RX/DT and RC6/TX/CK pins as serial port bank1 IF HIGH_SPEED == 1 ; USART SYNC=0; SPEN=1; CREN=1; SREN=0; bsf TXSTA,BRGH ; TX9=0; RX9=0; TXEN=1; ELSE bcf TXSTA,BRGH ENDIF bsf TXSTA,TXEN movlw DIVIDER ; generateur de baud rate movwf SPBRG bank0 bcf LEDrouge OUT_RS232 movlw EE2-EE0 call Msg_Eeprom CALL Rs_CrLf OUT_LCD ; Bsf Drapeaux,1 ; sortie sur LCD Main_Boucle call INIT_LCD call CLR_LCD call normal_video bsf LEDrouge movlw .0 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw 0 call Affiche_Msg movlw .1 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw EE1-EE0 call Affiche_Msg movlw .2 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw EE2-EE0 call Affiche_Msg bcf LEDrouge movlw .3 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw EE3-EE0 call Affiche_Msg movlw .4 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw EE4-EE0 call Affiche_Msg movlw .5 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw EE5-EE0 call Affiche_Msg ifdef LCD_8x16 movlw .6 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw EE6-EE0 call Affiche_Msg movlw .7 ;Y address in Lines iorlw b'01000000' ;bit de commande call TX_SPI_C movlw 0 ;X address in pixel= 5em car iorlw b'10000000' ;bit de commande call TX_SPI_C movlw EE7-EE0 call Affiche_Msg endif call delay_2_5s goto Main_Boucle ;*********** Subroutines ************************************* ;#define OFFSET_ANA .512 Acquis_Ana ; acquisition Analogique bank0 bcf ADCON0,CHS1 bcf ADCON0,CHS2 btfsc Drapeaux,2 ; si =1 selection RA1 ANA bsf ADCON0,CHS0 btfss Drapeaux,2 bcf ADCON0,CHS0 nop bsf ADCON0,ADON ; Test si Validation conversion ANA (ADCON0,0=1) call delay_25us bsf ADCON0,GO_DONE ; Arme la conversion (ADCON0,2=1) bcf RETENUE ; Positif not_yet btfsc ADCON0,NOT_DONE ; conversion AD ok ?(ADCON0,2=0 ???) goto not_yet bank0 movf ADRESH,w bank1 movwf val1 movwf val3 ; sauvegarde valeur ANA MSB movf ADRESL,w movwf val1+1 movwf val3+1 ; sauvegarde valeur ANA LSB bank0 btfss Drapeaux,5 ; mode XXX.XX sign‚ ? goto Posit1 bank1 movlw High(OFFSET_ANA) ; (Nb Points- offset de 512) movwf val2 movlw Low(OFFSET_ANA) movwf val2+1 call sub16 ; val1=val1-val2 btfss val1,7 ; btfss STATUS,C bit de signe ? goto Posit1 bank0 bsf RETENUE ; car valeur negative! bank1 COMF val1,f COMF val1+1,f Posit1 bank0 bcf ADCON0,ADON return ;-------------------- Affiche_Msg bank0 movwf Cpt1 Aff_Msg1 movf Cpt1,w call Read_EE movwf caractere incf Cpt1,f ANDLW 0x0FF BTFSC STATUS, Z Return movf caractere ,w call Output_Char goto Aff_Msg1 return ;------ print char 6x8 pixels ---- Affiche_Char clrf offset_caractr call Search_In_ascii_Table ; col 1 du caractere call TX_SPI_D ; incf offset_caractr,F call Search_In_ascii_Table ;col 2 du caractere call TX_SPI_D incf offset_caractr,F call Search_In_ascii_Table ;col 3 du caractere call TX_SPI_D incf offset_caractr,F call Search_In_ascii_Table ;col 4 du caractere call TX_SPI_D incf offset_caractr,F call Search_In_ascii_Table ;col 5 du caractere call TX_SPI_D incf offset_caractr,F call Search_In_ascii_Table ;col 6 du caractere call TX_SPI_D incf offset_caractr,F return ;************************************************** ;Routines de control du LCD NOKIA 3310 en mode SPI ;************************************************** INIT_LCD call CFG_SPI ;configuration mode SPI movlw d'80' call delay call RST_LCD ;reset LCD movlw d'80' call delay call SET_LCD ;initialisation LCD movlw d'80' call delay call CLR_LCD ;Raz ecran movlw d'80' call delay return ;********************************* ;Configuration du port serie SPI ;*********************************** CFG_SPI ;voir AN735 ;set I2C rate =((FOSC/Bitrate)/4)-1; ;8000000/1000000=80 80/4=20 20-1=19 movlw .19 ; setup value banksel SSPADD ; select SFR bank movwf SSPADD ; baud rate = 100KHz @ 8MHz movlw b'00000000' movwf SSPSTAT bank0 ; Registre de configuration SSPCON ; SSPEN <5> Enable=1 ; SSPM3:SSPM0 Hardware master mode=1000 ; I2C master mode, clock = FOSC / (4 * (SSPADD+1) ) movlw b'00101000' movwf SSPCON return ; Generation d'un Reset pour initialiser le LCD3310 RST_LCD bcf RST ; reset au niveau bas call delay_1ms ;retard bsf RST ; reset niveau haut nop return ;=============== ;Init du LCD SET_LCD ;Function SET: 00100_PD_V_H ; PD=0=>chip active ; V =0 =>Addressage Horizontal ; H =1 => extended instructions set movlw b'00100001' call TX_SPI_C ;Set VOP : 1_VOP6..VO0 ;VLCD = a + (VOP6 to VOP0)* b [V]. ; a = 3.06 and b = 0.06 soit 3,00 a 10,68V a TAmb ; movlw b'11001011' ;3.06+75*0.06=8.1 movlw b'10010000' ;3.06+162*0.06=4.02 call TX_SPI_C ; compensation temperature TC0 TC1 movlw b'00000101' ; TC0=1 TC1=0 call TX_SPI_C ;bias System : 000010_BS2_BS1_BS0 movlw b'00010011' ;bias System 1:48 -> n=4 call TX_SPI_C ;Function SET: 00100_PD_V_H ; PD=0=>chip active ; V =0 =>Addressage Horizontal ; H =0 => normal instructions set movlw b'00100000' ;chip activo, H=0 call TX_SPI_C ;Display mode control set : 00001_D_0_E ; D=1 ; E=0 call delay_1ms movlw b'00001100' ;mode [Normal mode] call TX_SPI_C return ;================================= ;RAZ memoire RAM LCD :6 Lignes de 14 car ou 8 lignes de 16car CLR_LCD movlw .0 ;Y address call Y_address movlw .0 ;X address call X_address movlw b'00001000' ; mode Display Blank call TX_SPI_C ; envoi Commande movlw d'8' ;8 lignes movwf BoucleExt Bint ifdef LCD_8x16 movlw d'72' ; =16 car *6x 8=576 else movlw d'63' ; =14 car *6* 8=504 endif movwf BoucleInt Bint1 movlw b'00000000' call TX_SPI_D ;envoi Data decfsz BoucleInt,f goto Bint1 decfsz BoucleExt,f goto Bint movlw .0 ;Y address call Y_address movlw .0 ;X address call X_address return ;position X contenue dans W X_address iorlw b'10000000' ;bit de commande call TX_SPI_C return ;position Y contenue dans W Y_address iorlw b'01000000' ;bit de commande call TX_SPI_C return ;video inverse Invert_video movlw b'00001101' ;mode [Inverse video mode] call TX_SPI_C return ;video normal normal_video movlw b'00001100' ;mode [normal mode] call TX_SPI_C return ;Transmision de Cde TX_SPI_C bcf DC ;Mode COMMANDE nop ;Transmision de donnees TX_SPI_D bcf SCE ;enable display! movwf SSPBUF ;Transmission sur port SPI TXSPID1 btfss PIR1,SSPIF ; goto TXSPID1 bcf PIR1,SSPIF nop bsf SCE ;display OFF nop nop bsf DC ;Mode DATA (par defaut) nop return ;=================== Rs_CrLf bank0 movlw .13 call Rs_Putchar movlw .10 call Rs_Putchar return ;--------------- Rs_Tabul bank0 movlw .9 call Rs_Putchar return ;--------------- Output_Char bank0 movwf caractere btfsc Drapeaux,1 call Affiche_Char btfss Drapeaux,1 call Rs_Putchar return ;--------------- Rs_Putchar bank0 clrwdt Rs_P1 btfss PIR1,TXIF ; while(!TXIF) goto Rs_P1 movwf TXREG ; TXREG = octet return ;--------------- Msg_Eeprom bank0 movwf Cpt1 Msg_eep1 movf Cpt1,w call Read_EE movwf caractere incf Cpt1,f ANDLW 0x0FF BTFSC STATUS, Z Return movf caractere,w call Output_Char goto Msg_eep1 return ;------- ; subroutine to read EEPROM memory ;(adresse & r‚sultat en w) Read_EE ; 16F876 bank2 MOVWF EEADR ;Data Memory Address to read bank3 BCF EECON1, EEPGD ;Point to DATA memory BSF EECON1, RD ;EEPROM Read bank2 MOVF EEDATA, W ;W = EEDATA bank0 return ;------------ Rs_Getchar clrwdt movf time,w btfsc STATUS,Z ; regarder si time==0 goto getchar3 btfss PIR1,TMR1IF ; regarder si le TIMER1 a deborde goto getchar3 ; pas de debordement bcf T1CON,TMR1ON ; timeout 0.1 sec decfsz time,f ; time-- goto getchar2 retlw 0 ; if time==0 then return getchar2 bcf PIR1,TMR1IF movlw high TIMER movwf TMR1H ; preset TIMER1 for 0.1s timeout bsf T1CON,TMR1ON getchar3 btfss PIR1,RCIF ; while(!RCIF) goto Rs_Getchar movf RCREG,w ; RCREG return ;========================================= ; conv mot 16bits --> en XX.XXøC 25.42øC bcd_temp bank1 movf val1,W movwf valx movf val1+1,W movwf valx+1 swapf valx,W iorlw 0xf0 movwf mille addwf mille,F addlw 0xE2 ; 226 movwf cent addlw 0x32 ;50 movwf un movf valx,W andlw 0x0F addwf cent,F addwf cent,F addwf un,F addlw 0xE9 ;233 movwf dix addwf dix,F addwf dix,F swapf valx+1,W ;<- modif 20mars03 was val1 andlw 0x0F addwf dix,F addwf un,F rlf dix,F rlf un,F comf un,F rlf un,F movf valx+1,W andlw 0x0F addwf un,F rlf mille,F movlw 0x07 movwf dixmil movlw 0x0A Lb1: addwf un,F decf dix,F btfss STATUS,C goto Lb1 Lb2: addwf dix,F decf cent,F btfss STATUS,C goto Lb2 Lb3: addwf cent,F decf mille,F btfss STATUS,C goto Lb3 Lb4: addwf mille,F decf dixmil,F btfss STATUS,C goto Lb4 bank0 btfss Drapeaux,5 ; 1 => affichage 00000 a 999999 goto Bcd5ascii ; 0 => affichage + ou - XXX.XX movlw '+' btfsc RETENUE movlw '-' call Output_Char bank1 movf mille,w btfss STATUS,Z ; si digit=0 remplace par Blanc goto Lb5 bank0 movlw ' ' call Output_Char goto Lb6 Lb5 bank0 addlw '0' call Output_Char Lb6 bank1 movf cent,w addlw '0' call Output_Char movlw '.' call Output_Char bank1 movf dix,w addlw '0' call Output_Char bank1 movf un,w addlw '0' call Output_Char return ;--------------- Bcd5ascii btfss Drapeaux,4 ; 0=4 digits 1=5 digits goto Bcd4ascii bank1 movf dixmil,w addlw '0' call Output_Char Bcd4ascii bank1 movf mille,w addlw '0' call Output_Char Bcd3ascii bank1 movf cent,w addlw '0' call Output_Char bank1 movf dix,w addlw '0' call Output_Char bank1 movf un,w addlw '0' call Output_Char movlw ' ' call Output_Char return ;======================= Affiche_Time bank0 SWAPF Jour,W ANDLW 0x0F btfss STATUS,Z ;@ 5/2/07 goto Aff_T1 ; remplace 0 par espace en tete de message movlw ' ' goto Aff_T2 Aff_T1 ADDLW 30H Aff_T2 CALL Output_Char MOVF Jour,W ANDLW 0FH ADDLW 30H CALL Output_Char MOVLW "/" CALL Output_Char SWAPF Mois,W ANDLW 0x0F ADDLW 30H CALL Output_Char MOVF Mois,W ANDLW 0FH ADDLW 30H CALL Output_Char MOVLW " " CALL Output_Char ; SWAPF Annee,W ; ANDLW 0x0F ; ADDLW 30H ; CALL Output_Char ; MOVF Annee,W ; ANDLW 0FH ; ADDLW 30H ; CALL Output_Char MOVLW " " CALL Output_Char Affiche_Heure SWAPF HEURE,W ANDLW 0x0F btfss STATUS,Z ;@ 5/2/07 goto Aff_T3 movlw ' ' goto Aff_T4 Aff_T3 ADDLW 30H Aff_T4 CALL Output_Char MOVF HEURE,W ANDLW 0x0F ADDLW 30H CALL Output_Char MOVLW "H" CALL Output_Char SWAPF MIN,W ANDLW 0x0F ADDLW 30H CALL Output_Char MOVF MIN,W ANDLW 0FH ADDLW 30H CALL Output_Char MOVLW "M" CALL Output_Char SWAPF SEC,W ANDLW 0x0F ADDLW 30H CALL Output_Char MOVF SEC,W ANDLW 0FH ADDLW 30H CALL Output_Char MOVLW "S" CALL Output_Char return ;-------------------------------------- ; The following routines are low level I2C routines applicable to most ; interfaces with I2C devices. ;---------------------------------------- I2C_DELAY goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 return ;--------------- START: bsf STATUS,RP0 bcf I2C_SDA bcf STATUS,RP0 bsf I2C_SDA bsf I2C_SCL ;I2C start: change of SDA call I2C_DELAY ;from 1 to 0 while SCL = 1 bcf I2C_SDA call I2C_DELAY bcf I2C_SCL return ;--------------------- STOP: bsf STATUS,RP0 bcf I2C_SDA bcf STATUS,RP0 bcf I2C_SDA bsf I2C_SCL ;I2C stop: change of SDA call I2C_DELAY ;from 0 to 1 while SCL = 1 bsf I2C_SDA return ;--------------------- M_ACK: bsf STATUS,RP0 bcf I2C_SDA bcf STATUS,RP0 bcf I2C_SDA ;I2C master acknowledge: call I2C_DELAY ;SDA = 0 bsf I2C_SCL call I2C_DELAY bcf I2C_SCL return ;---------- NACK: bsf STATUS,RP0 bcf I2C_SDA bcf STATUS,RP0 bsf I2C_SDA ;I2C master non-acknowledge: call I2C_DELAY ;SDA = 1 bsf I2C_SCL call I2C_DELAY bcf I2C_SCL return ;----------- ACK: bsf STATUS,RP0 bsf I2C_SDA bcf STATUS,RP0 call I2C_DELAY ;I2C device acknowledge: bsf I2C_SCL ;SDA set 1 by master call I2C_DELAY ;SDA = 1 if device doesn't ACK bsf STATUS,Z ;SDA = 0 if devcie acknowledges btfsc I2C_SDA bcf STATUS,Z ;STATUS,Z=1 if device acknowledges bcf I2C_SCL ;STATUS,Z=0 if device doesn't ACK return ;------------ CLOCK_PULSE: ; SCL momentarily to logic one CALL HIGH_SCL call I2C_DELAY CALL LOW_SCL call I2C_DELAY RETURN ;------------ HIGH_SDA: ; high impedance by making SDA an input BSF I2C_SDA bank1 nop BSF I2C_SDA ; make SDA pin an input bank0 call I2C_DELAY RETURN ;------------ LOW_SDA: bank1 BCF I2C_SDA ; make SDA pin an output bank0 nop BCF I2C_SDA call I2C_DELAY RETURN ;------------ HIGH_SCL: BSF I2C_SCL bank1 nop BSF I2C_SCL ; make SCL pin an input bank0 call I2C_DELAY RETURN ;------------ LOW_SCL: bank1 BCF I2C_SCL ; make SCL pin an output bank0 BCF I2C_SCL call I2C_DELAY RETURN ;--------------------- ; The following routines are low level I2C routines applicable to most ; interfaces with I2C devices. IN_BYTE ; read byte on i2c bus CLRF I_BYTE MOVLW .8 MOVWF _N0 ; set index to 8 CALL HIGH_SDA ; be sure SDA is configured as input IN_BIT CALL HIGH_SCL ; clock high BTFSS I2C_SDA ; test SDA bit GOTO IN_ZERO GOTO IN_ONE IN_ZERO BCF STATUS, C ; clear any carry RLF I_BYTE, F ; i_byte = i_byte << 1 | 0 GOTO CONT_IN IN_ONE BCF STATUS, C ; clear any carry RLF I_BYTE, F INCF I_BYTE, F ; i_byte = (i_byte << 1) | 1 GOTO CONT_IN CONT_IN CALL LOW_SCL ; bring clock low DECFSZ _N0, F ; decrement index GOTO IN_BIT RETURN ;------------- OUT_BYTE: ; send o_byte on I2C bus MOVWF O_BYTE MOVLW .8 MOVWF _N0 OUT_BIT: BCF STATUS,C ; clear carry RLF O_BYTE, F ; left shift, most sig bit is now in carry BTFSS STATUS, C ; if one, send a one GOTO OUT_ZERO GOTO OUT_ONE OUT_ZERO: CALL LOW_SDA ; SDA at zero CALL CLOCK_PULSE CALL HIGH_SDA GOTO OUT_CONT OUT_ONE: CALL HIGH_SDA ; SDA at logic one CALL CLOCK_PULSE GOTO OUT_CONT OUT_CONT: DECFSZ _N0, F ; decrement index GOTO OUT_BIT RETURN ;------------------------------- div16 ; assume all data in bank1 bcf STATUS,C clrf reste ; division 16 bits clrf reste+1 ; val1 = val1 / val2 ( reste ) movlw .16 movwf Mcount div161 rlf val1+1,f rlf val1,f rlf reste+1,f rlf reste,f movf val2,w subwf reste,W btfss STATUS,Z goto div162 movf val2+1,W subwf reste+1,W div162 btfss STATUS,C goto div163 movf val2+1,W subwf reste+1,f movf val2,W btfss STATUS,C incfsz val2,f subwf reste,f div163 rlf result+1,f rlf result,f DECFSZ Mcount,f goto div161 fin16 movf result,w movwf val1 movf result+1,w movwf val1+1 return ;-------------------- sub16 bank1 bcf STATUS,C movf val2+1,W ; source subwf val1+1,F ; dest movf val2,W btfss STATUS,C incfsz val2,W subwf val1,F ;dest = dest - source, WITH VALID CARRY return ;*******************************************************************; ; Multiplication : ACCb(16 bits) * ACCa(16 bits) -> ACCb,ACCc ( 32 bits ) ; (a) Load the 1st operand in location ACCaLO & ACCaHI ( 16 bits ) ; (b) Load the 2nd operand in location ACCbLO & ACCbHI ( 16 bits ) ; (c) CALL D_mpy ; (d) The 32 bit result is in location ( ACCbHI,ACCbLO,ACCcHI,ACCcLO ) ;*******************************************************************; ; ( ACCb*ACCa -> ACCb,ACCc ) : 32 bit output with high word ; in ACCb ( ACCbHI,ACCbLO ) and low word in ACCc ( ACCcHI,ACCcLO ). D_mpyS ;results in ACCb(16 msb's) and ACCc(16 lsb's) call setupmult bcf STATUS,C mloop rrf ACCdHI,F ;rotate d right rrf ACCdLO,F btfss STATUS,C ;need to add? goto No_add movf ACCaLO,W ; Addition ( ACCb + ACCa -> ACCb ) addwf ACCbLO,F ;add lsb btfsc STATUS,C ;add in carry incf ACCbHI,F movf ACCaHI,W addwf ACCbHI,F ;add msb No_add rrf ACCbHI,F rrf ACCbLO,F rrf ACCcHI,F rrf ACCcLO,F decfsz temp,F ;loop until all bits checked goto mloop goto end1 ; Double Precision Addition ( ACCb + ACCa -> ACCb ) ; D_add bcf Flags,C ;Clear temp Carry bit movf ACCaLO,W ; Addition ( ACCb + ACCa -> ACCb ) addwf ACCbLO,F ;add lsb btfsc STATUS,C ;add in carry incf ACCbHI,F btfsc STATUS,C bsf Flags,C movf ACCaHI,W addwf ACCbHI,F ;add msb btfsc Flags,C bsf STATUS,C return ; setupmult movlw .16 ; for 16 shifts movwf temp movf ACCbHI,W ;move ACCb to ACCd movwf ACCdHI movf ACCbLO,W movwf ACCdLO clrf ACCbHI clrf ACCbLO return end1 return ;==================================== ;delaisfQ.inc pour Fquartz=X ;definition f(Quartz) ;a declarer dans le programme principale : ; #define Quartz 32 ; valeur du Quartz employe ; count1 ;delay routines ; count2 ;delay routines ; count3 ;delay routines ;delay_RS ; f(quartz) ;delay1 ; 5(count3-1)+1282(count2-1)+32764(count1-1)+6 ;delay_25us ;delay_100us ;delay_1ms ;delay_10ms ;delay_25ms ;delay_100ms ;Delay_1sec ;Delay_2_5sec ;delay_10sec ;------------------------------------ delay_25us movlw 0x01 movwf count1 movlw 0x01 movwf count2 movlw .5*Quartz/4 movwf count3 goto delay1 delay_100us movlw 0x01 movwf count1 movlw 0x01 movwf count2 movlw .20*Quartz/4 movwf count3 goto delay1 delay_1ms movlw 0x01 ; 1,001 mS /4Mhz movwf count1 ; 1,13 ms / 32Mhz movlw 1*Quartz/4 movwf count2 movlw .200/(Quartz/4) movwf count3 goto delay1 delay_10ms movlw 0x01 ; 9,99 ms / 4Mhz movwf count1 ; 10,2mS /32Mhz movlw (.8*Quartz/4) ; 10,1mS /16Mhz movwf count2 movlw .204 movwf count3 goto delay1 delay_25ms movlw 0x01 ;24,36mS /4Mhz movwf count1 ;25,4mS /32Mhz movlw (.20*Quartz/4) movwf count2 movlw 0x01 movwf count3 goto delay1 delay_100ms movlw 1+(Quartz/.16) movwf count1 movlw (.79+(Quartz*.10/.4)) movwf count2 movlw .1 movwf count3 goto delay1 delay_250ms movlw .1+ (Quartz*.6/.32) movwf count1 movlw .196 /(Quartz/.4) movwf count2 movlw .1 movwf count3 goto delay1 delay_1s movlw .4*Quartz/.4 movwf count1 movlw .14 movwf count2 movlw .56 movwf count3 goto delay1 delay_2_5s movlw .8 * (Quartz/.4) movwf count1 movlw (.640 /Quartz) 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 ;------------------------ delay movwf OUTER out_loop call delay_1ms decfsz OUTER,F goto out_loop return ;******************************************************************************* org 0x4FF ;position de la table en memoire Flash de programe ;RECHERCHE DANS TABLE DE CARACTERES ASCII Search_In_ascii_Table movf caractere,W movwf ACCaLO ;valeur ascii comme premier operande de la multiplication movlw .0 ; A Raz Resultat HI movwf ACCaHI movwf ACCbHI ;B Raz resultat HI movlw .6 movwf ACCbLO ;second operande de la multiplication call D_mpyS ; multiplication valeur ascii par 6 ;------------------------------------ movlw .5 ;position de la table ascii en page 5 movwf PCLATH ; initailise compteur de page movlw init_table ; Charge la position relative de la table movwf Progression movf ACCcHI,W ; resultat HI multipilcation -> W addwf PCLATH,F ; charge PAGE movf ACCcLO,W ; Resulta LO de la multiplication addwf offset_caractr,W; rajoute position de la colonne dan sle caractere btfsc STATUS,C ; test si depassement incf PCLATH,F ;si oui incremente PCLATH addwf Progression,F btfsc STATUS,C ;test si depassement incf PCLATH,F ;si oui incremente PCLATH ;matrice 6x8 pour caractere 5x7 , contient donc l'inter espace caractere ; 96 pixels -> 16 car de (5+1) pixels de large init_table addwf PCL,F ; ;police_6x8.txt dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x00 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x01 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x02 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x03 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x04 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x05 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x06 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x07 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x08 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x09 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0A dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0B dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0C dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0D dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0E dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x0F dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x10 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x11 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x12 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x13 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x14 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x15 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x16 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x17 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x18 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x19 dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x1A dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x1B dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x1C dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x1D dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x1E dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x1F dt 0x00,0x00,0x00,0x00,0x00,0x00 ; 0x20 dt 0x00,0x00,0x5F,0x00,0x00,0x00 ; ! 0x21 dt 0x00,0x07,0x00,0x07,0x00,0x00 ; " 0x22 dt 0x14,0x7F,0x14,0x7F,0x14,0x00 ; # 0x23 dt 0x24,0x2A,0x7F,0x2A,0x12,0x00 ; $ 0x24 dt 0x26,0x16,0x08,0x34,0x32,0x00 ; % 0x25 dt 0x76,0x49,0x55,0x22,0x50,0x00 ; & 0x26 dt 0x00,0x00,0x05,0x03,0x00,0x00 ; ' 0x27 dt 0x00,0x1C,0x22,0x41,0x00,0x00 ; ( 0x28 dt 0x00,0x41,0x22,0x1C,0x00,0x00 ; ) 0x29 dt 0x14,0x08,0x3E,0x08,0x14,0x00 ; * 0x2A dt 0x08,0x08,0x3E,0x08,0x08,0x00 ; + 0x2B dt 0x00,0x50,0x30,0x00,0x00,0x00 ; , 0x2C dt 0x08,0x08,0x08,0x08,0x08,0x00 ; - 0x2D dt 0x00,0x60,0x60,0x00,0x00,0x00 ; . 0x2E dt 0x20,0x10,0x08,0x04,0x02,0x00 ; / 0x2F dt 0x3E,0x51,0x49,0x45,0x3E,0x00 ; 0 0x30 dt 0x00,0x42,0x7F,0x40,0x00,0x00 ; 1 0x31 dt 0x42,0x61,0x51,0x49,0x46,0x00 ; 2 0x32 dt 0x21,0x41,0x45,0x4B,0x31,0x00 ; 3 0x33 dt 0x18,0x14,0x12,0x7F,0x10,0x00 ; 4 0x34 dt 0x27,0x45,0x45,0x45,0x39,0x00 ; 5 0x35 dt 0x3C,0x4A,0x49,0x49,0x30,0x00 ; 6 0x36 dt 0x01,0x01,0x79,0x05,0x03,0x00 ; 7 0x37 dt 0x36,0x49,0x49,0x49,0x36,0x00 ; 8 0x38 dt 0x06,0x49,0x49,0x29,0x1E,0x00 ; 9 0x39 dt 0x00,0x36,0x36,0x00,0x00,0x00 ; : 0x3A dt 0x00,0x56,0x36,0x00,0x00,0x00 ; ; 0x3B dt 0x00,0x08,0x14,0x22,0x41,0x00 ; < 0x3C dt 0x14,0x14,0x14,0x14,0x14,0x00 ; = 0x3D dt 0x41,0x22,0x14,0x08,0x00,0x00 ; > 0x3E dt 0x02,0x01,0x51,0x09,0x06,0x00 ; ? 0x3F dt 0x3E,0x41,0x49,0x55,0x5E,0x00 ; @ 0x40 dt 0x7E,0x11,0x11,0x11,0x7E,0x00 ; A 0x41 dt 0x7F,0x49,0x49,0x49,0x36,0x00 ; B 0x42 dt 0x3E,0x41,0x41,0x41,0x22,0x00 ; C 0x43 dt 0x7F,0x41,0x41,0x22,0x1C,0x00 ; D 0x44 dt 0x7F,0x49,0x49,0x49,0x41,0x00 ; E 0x45 dt 0x7F,0x09,0x09,0x09,0x01,0x00 ; F 0x46 dt 0x3E,0x41,0x49,0x49,0x3A,0x00 ; G 0x47 dt 0x7F,0x08,0x08,0x08,0x7F,0x00 ; H 0x48 dt 0x00,0x41,0x7F,0x41,0x00,0x00 ; I 0x49 dt 0x20,0x41,0x41,0x3F,0x00,0x00 ; J 0x4A dt 0x7F,0x08,0x14,0x22,0x41,0x00 ; K 0x4B dt 0x7F,0x40,0x40,0x40,0x40,0x00 ; L 0x4C dt 0x7F,0x02,0x0C,0x02,0x7F,0x00 ; M 0x4D dt 0x7F,0x04,0x08,0x10,0x7F,0x00 ; N 0x4E dt 0x3E,0x41,0x41,0x41,0x3E,0x00 ; O 0x4F dt 0x7F,0x09,0x09,0x09,0x06,0x00 ; P 0x50 dt 0x3E,0x41,0x51,0x21,0x5E,0x00 ; Q 0x51 dt 0x7F,0x09,0x19,0x29,0x46,0x00 ; R 0x52 dt 0x46,0x49,0x49,0x49,0x31,0x00 ; S 0x53 dt 0x01,0x01,0x7F,0x01,0x01,0x00 ; T 0x54 dt 0x3F,0x40,0x40,0x40,0x3F,0x00 ; U 0x55 dt 0x1F,0x20,0x40,0x20,0x1F,0x00 ; V 0x56 dt 0x3F,0x40,0x3C,0x40,0x3F,0x00 ; W 0x57 dt 0x63,0x14,0x08,0x14,0x63,0x00 ; X 0x58 dt 0x07,0x08,0x70,0x08,0x07,0x00 ; Y 0x59 dt 0x61,0x51,0x49,0x45,0x43,0x00 ; Z 0x5A dt 0x00,0x7F,0x41,0x41,0x00,0x00 ; [ 0x5B dt 0x02,0x04,0x08,0x10,0x20,0x00 ; \ 0x5C dt 0x00,0x41,0x41,0x7F,0x00,0x00 ; ] 0x5D dt 0x04,0x02,0x01,0x02,0x04,0x00 ; ^ 0x5E dt 0x40,0x40,0x40,0x40,0x40,0x00 ; _ 0x5F dt 0x00,0x01,0x02,0x04,0x00,0x00 ; ` 0x60 dt 0x20,0x54,0x54,0x54,0x78,0x00 ; a 0x61 dt 0x7F,0x48,0x44,0x44,0x38,0x00 ; b 0x62 dt 0x38,0x44,0x44,0x44,0x20,0x00 ; c 0x63 dt 0x38,0x44,0x44,0x48,0x7F,0x00 ; d 0x64 dt 0x38,0x54,0x54,0x54,0x18,0x00 ; e 0x65 dt 0x08,0x7E,0x09,0x01,0x02,0x00 ; f 0x66 dt 0x08,0x54,0x54,0x54,0x3C,0x00 ; g 0x67 dt 0x7F,0x08,0x04,0x04,0x78,0x00 ; h 0x68 dt 0x00,0x44,0x7D,0x40,0x00,0x00 ; i 0x69 dt 0x20,0x40,0x44,0x3D,0x00,0x00 ; j 0x6A dt 0x7F,0x10,0x28,0x44,0x00,0x00 ; k 0x6B dt 0x00,0x41,0x7F,0x40,0x00,0x00 ; l 0x6C dt 0x7C,0x04,0x18,0x04,0x78,0x00 ; m 0x6D dt 0x7C,0x08,0x04,0x04,0x78,0x00 ; n 0x6E dt 0x38,0x44,0x44,0x44,0x38,0x00 ; o 0x6F dt 0x7C,0x14,0x14,0x14,0x08,0x00 ; p 0x70 dt 0x08,0x14,0x14,0x18,0x7C,0x00 ; q 0x71 dt 0x7C,0x08,0x04,0x04,0x08,0x00 ; r 0x72 dt 0x48,0x54,0x54,0x54,0x20,0x00 ; s 0x73 dt 0x04,0x3F,0x44,0x40,0x20,0x00 ; t 0x74 dt 0x3C,0x40,0x40,0x20,0x7C,0x00 ; u 0x75 dt 0x1C,0x20,0x40,0x20,0x1C,0x00 ; v 0x76 dt 0x3C,0x40,0x38,0x40,0x3C,0x00 ; w 0x77 dt 0x44,0x28,0x10,0x28,0x44,0x00 ; x 0x78 dt 0x0C,0x50,0x50,0x50,0x3C,0x00 ; y 0x79 dt 0x44,0x64,0x54,0x4C,0x44,0x00 ; z 0x7A dt 0x00,0x08,0x36,0x41,0x00,0x00 ; { 0x7B dt 0x00,0x00,0x7F,0x00,0x00,0x00 ; | 0x7C dt 0x00,0x41,0x36,0x08,0x00,0x00 ; } 0x7D dt 0x08,0x08,0x2A,0x1C,0x08,0x00 ; ->0x7E dt 0x08,0x1C,0x2A,0x08,0x08,0x00 ; <-0x7F ORG 0x2100 ; 256 bytes of eeprom EEPROM EQU $ ifdef LCD_8x16 ;1234567890123456" EE0 DT "16F877 bootldr ",0 EE1 DT "Q=10Mhz 19200bds",0 EE2 DT "Nokia_Test_CI.. ",0 EE3 DT " 2008/04/17 ",0 EE4 DT "Paulfjujofreefr ",0 EE5 DT "1234567890123456",0 EE6 DT "7em ligne.......",0 EE7 DT "8eme Ligne 128c ",0 else ;12345678901234" EE0 DT "16F877 bootldr",0 EE1 DT "Q=10Mhz 19200b",0 EE2 DT "Nokia 3310 LCD",0 EE3 DT "6x14c 08/04/19",0 EE4 DT "Paulfjujofree ",0 EE5 DT "12345678901234",0 EE6 DT "6em ligne.....",0 endif END