//---------------------------------------------------- // SPI Configuration pour DAC ou LCD //---------------------------------------------------- #define SPI_Config() \ { \ /* SPI initialization pour DSP-> DAC ou LCD (clk pol 1, no clkphase, master, no INT)*/ \ SPICCR=0xC7; /* Reset SPI by writing 1 to SWRST !!!clk pol1 */ \ SPICTL=0x04; /* Disable ints & TALK, normal clock, master mode clk phase 0 */ \ SPIPRI=0x00; /* Set SPI interrupt to high priority. */ \ SPIBRR=0x00; /* Baudrate = Fatest as possible ! SYSCLK/4 et ça marche ! */ \ SPISTS=0x00; /* Clear the SPI interrupt status bits */ \ SPICTL=0x06; /* Enable TALK, CLK ph 0, master mode + disable SPI Int */ \ SPIPC1=0x52; /* Enable the SPICLK pin function. ; SPISTE as output pin et mise à 1 ie desactive */ \ SPIPC2=0x22; /* Set SIMO & SOMI functions to serial I/O */ \ SPICCR=0x47; /* Release SWRST, clock polarity 1, 8 bits */ \ } |
//---------------------------------------------------- // initialisation de l'écran LCD //---------------------------------------------------- inline void LCD_initScreen() { DispLCDOrder( 0xC0, 0x00); // foncé Attends(1000); DispLCDOrder( 0x00, 0x80); // clear LCD, 1.53 ms Attends(1000); DispLCDOrder( 0x00, 0x60); // increment, 1.53 ms Attends(1000); DispLCDOrder( 0x00, 0x30); // display on, cursor Off Attends(30); //debug si on veut afficher 2 caracteres // DispLCDChar( 0x20, 0x80); // A // Attends(30); // DispLCDChar( 0x20, 0x40); // B // Attends(30); LCDupdate=1; // doit MAJ la table sur l'Ecran LCD LCDline=0; // REW au début de la table LCDcol=0; } |
//---------------------------------------------------- // Envoi 3 bytes au LCD : char requiert hi et low //---------------------------------------------------- inline void DispLCDChar(int hi, int low) { CS_LCDon // Active le LCD via le /CS SPIBUF=SPIBUF; // clear le SPISTS,BIT6 SPIDAT=0xFA; // Transmit start Char Order while (! (SPISTS & SETB6)) {} SPIBUF=SPIBUF; // clear le SPISTS,BIT6 : donnée_envoyé SPIDAT=low; while (! (SPISTS & SETB6)) {} SPIBUF=SPIBUF; // clear le SPISTS,BIT6 : donnée_envoyé SPIDAT=hi; while (! (SPISTS & SETB6)) {} SPIBUF=SPIBUF; // clear le SPISTS,BIT6 : donnée_envoyé CS_LCDoff } //---------------------------------------------------- // Envoi 3 bytes au LCD : ordre requiert hi et low //---------------------------------------------------- inline void DispLCDOrder(int hi, int low) { CS_LCDon // Active le LCD via le /CS SPIBUF=SPIBUF; // clear le SPISTS,BIT6 SPIDAT=0xF8; // Transmit start Ordre while (! (SPISTS & SETB6)) {} SPIBUF=SPIBUF; // clear le SPISTS,BIT6 : donnée_envoyé SPIDAT=low; while (! (SPISTS & SETB6)) {} SPIBUF=SPIBUF; // clear le SPISTS,BIT6 : donnée_envoyé SPIDAT=hi; while (! (SPISTS & SETB6)) {} SPIBUF=SPIBUF; // clear le SPISTS,BIT6 : donnée_envoyé CS_LCDoff } |
//---------------------------------------------------- // Routine trChar : transforme le char LCDChar en LCDChar_m (pour le LCD) //---------------------------------------------------- inline void trChar() { LCDChar_m=0x00; for (tmp=8; tmp>0; tmp--) { LCDChar_m=LCDChar_m<<1 | (LCDChar & 1); LCDChar=LCDChar>>1; } LCDlo=LCDChar_m & 0xF0; LCDhi=LCDChar_m<<4 & 0xF0; } |
//---------------------------------------------------- // Convertit un "Word" hexa en "4 chars Hexadécimaux" // et les sort sur la table en memoire //---------------------------------------------------- inline void ConvHexa(int Var, int LCDtablePos) { tmp=Var & 0x000F; if (tmp<=9) tmp+=0x30; else tmp+=0x37; LCDtable[LCDtablePos+3]=tmp; tmp=Var>>4 & 0x000F; if (tmp<=9) tmp+=0x30; else tmp+=0x37; LCDtable[LCDtablePos+2]=tmp; tmp=Var>>8 & 0x000F; if (tmp<=9) tmp+=0x30; else tmp+=0x37; LCDtable[LCDtablePos+1]=tmp; tmp=Var>>12 & 0x000F; if (tmp<=9) tmp+=0x30; else tmp+=0x37; LCDtable[LCDtablePos]=tmp; } |