#include "68HC12_registres.h"
// Definitions des constantes
#define WR 0x20 // lcd WR bit
#define RS 0x40 // lcd RS bit
#define EN 0x80 // lcd EN bit
// Prototypes
void initialise_LCD();
void envoi_chaine(char *sptr);
void envoi_caractere(unsigned char datval);
// RAM Variables
unsigned char Buffer_LCD;
unsigned char Etat_LCD;
#define LCD_DELAYTIME 0x200 // ajuster cette valeur en fonction du temps de r�ponse et des performances de l'afficheur mise en oeuvre
/*********************************************************************************/
void delai_secondaire(unsigned int ucount)
{
while(ucount > 0)
{ --ucount;
}
}
/*********************************************************************************/
void attendre(unsigned int mcount)
{
while(mcount > 0)
{ --mcount;
delai_secondaire(LCD_DELAYTIME);
}
}
/*********************************************************************************/
void transfert_LCD()
{
attendre(1);
Etat_LCD = SPI0SR; // lecture du registre d'�tat = reset
SP0DR = Buffer_LCD; // transmettre l'octet
do{ // attendre que le flag du registre d'�tat passe � 1
Etat_LCD = SPI0SR;
}while(Etat_LCD < 0x80);
Etat_LCD = SP0DR; // receive value back
}
/*********************************************************************************/
void ecrire_4bits_LCD(char LCDdata){
// merge les 4 bits de poids faible de LCDdata avec les 4 bits de poids fort contenu dans le Buffer_LCD (ce sont les bits de controles)
Buffer_LCD &= 0xF0;
Buffer_LCD |= LCDdata;
Buffer_LCD &= ~EN; // active les faibles
transfert_LCD(); // envoie les donn�es
Buffer_LCD |= EN; // active les forts
transfert_LCD(); // envoie les donn�es
Buffer_LCD &= ~EN; // active les faibles
transfert_LCD(); // envoie les donn�es
}
/*********************************************************************************/
void ecrire_octet_LCD(unsigned char lcdval)
{
ecrire_4bits_LCD(lcdval >> 4); // envoi les 4 bits de poids forts
ecrire_4bits_LCD(lcdval & 0x0F); // puis les 4 bits de poids faible
}
/*********************************************************************************/
void commande_LCD(unsigned char cmdval)
{
Buffer_LCD &= ~RS; // efface RS (mise � 0) afin de selectionner le mode LCD Command
ecrire_octet_LCD(cmdval);
attendre(10);
}
/*********************************************************************************/
void envoi_caractere(unsigned char datval)
{
Buffer_LCD |= RS; // mise � 1 de RS pour selectionner le mode LCD Data
ecrire_octet_LCD(datval); // �crire un octet de donn�e
}
/*********************************************************************************/
void envoi_chaine(char *sptr)
{
while(*sptr){
envoi_caractere(*sptr);
++sptr;
}
}
/*********************************************************************************/
void initialise_SPI()
{
SPI0CR1 = 0x52; // parametre la liaison SPI
/* 0 1 0 1 0 0 1 0
| | | | | | | |
| | | | | | | \____ MSB first
| | | | | | \______ multiple bytes with SS asserted
| | | | | \________ 0 phase
| | | | \__________ 0 polarity
| | | \____________ Master mode
| | \______________ not open drain
| \________________ Enable SPI
\__________________ No interrupts
*/
SPI0CR2 = 0x10; // permettre le mode /SS - selectionne l'esclave
SPI0BR = 0x00; // vitesse de transmission (baud clock rate) = 4 MHz
}
/*********************************************************************************/
void initialise_LCD()
{
Buffer_LCD = (WR + EN); // set WR and EN bits
transfert_LCD(); // tranmettre
// initialise l'afficheur
Buffer_LCD &= ~(RS + EN); // clear RS and EN bits (select lcd Command)
transfert_LCD(); // transmettre
attendre(50);
// set to 4 bit wide mode
ecrire_4bits_LCD(3); // send 3
attendre(50);
ecrire_4bits_LCD(3); // send 3
attendre(50);
ecrire_4bits_LCD(3); // send 3
attendre(50);
ecrire_4bits_LCD(2); // send 2
attendre(50);
commande_LCD(0x2c); // 2x40 display
commande_LCD(0x06); // display and cursor on
commande_LCD(0x0e); // shift cursor right
commande_LCD(0x01); // clear display and home cursor
commande_LCD(0x80);
Buffer_LCD = 0; // Reset Lcd states to rest
transfert_LCD(); // send status to LCD
}
/**************************************************************************************/
void main()
{
char keyval;
initialise_LCD();
initialise_SPI()
envoi_chaine("Hello 1234567890_AB"); // ligne 1
envoi_chaine("Line 3 1234567890_AB"); // ligne 3
envoi_chaine("Line 2 1234567890_AB"); // ligne 2
envoi_chaine("Line 4 1234567890_AB"); // ligne 4
}
/**************************************************************************************/