Bonjour tout le monde !
Je programme en C sur un PIC 16F876 et 16F84A.
Depuis déjà bien longtemps, je voulais utiliser un ecran lcd que j'avais :
DataVision, 128x64, backlight, T6963C, 2 x T6A39, T6A40.
Je me suis debrouillé pour créer un -5V pour le contraste(qui marche bien).
Je me suis fait une librairie, je l'ai relu mais je n'arrive a rien afficher sur cet ecran.
Voici la librairie, que l'on peut par ailleurs retrouver sur le net en équivalence :
La librairie Tempo qui marche tres bien, verifié avec des leds et à l'oscilloscope :#include "tempo.h"
// Definition des ports A & B
#define DIR_DATA TRISC
#define DATA PORTC
#define DIR_CTRL TRISB
#define CTRL PORTB
#define WRITE RB0
#define READ RB1
#define CHIP_ENABLED RB2
#define DATA_or_CODE RB3
#define RESET RB4
#define BACKLIGHT RB5
#define ON 1
#define OFF 0
// Definition des fonctions elementaires
#define NOP asm("nop()");
// [------------------- Pointer Set -------------------]
#define Cursor_Pointer_Set PutCode(0x21);
#define Offset_Register_Set PutCode(0x22);
#define Address_Pointer_Set PutCode(0x24);
// [------------------- Control Word -------------------]
#define Text_Home_Address_Set PutCode(0x40);
#define Text_Home_Address_High 0x20
#define Text_Home_Address_Low 0x00
#define Text_Area_Set PutCode(0x41);
#define Text_Area_High 0x00
#define Text_Area_Low 0x14
#define Graphic_Home_Address_Set PutCode(0x42);
#define Graphic_Home_Address_High 0x00
#define Graphic_Home_Address_Low 0x00
#define Graphic_Area_Set PutCode(0x43);
#define Graphic_Area_High 0x00
#define Graphic_Area_Low 0x14
// [------------------- Mode Set -------------------]
#define OR_Rom PutCode(0x80);
#define OR_Ram PutCode(0x88);
#define EXOR_Rom PutCode(0x81);
#define EXOR_Ram PutCode(0x89);
#define AND_Rom PutCode(0x83);
#define AND_Ram PutCode(0x8B);
#define Text_Rom PutCode(0x84);
#define Text_Ram PutCode(0x8C);
// [------------------- Lecture Ecran -------------------]
#define Screen_Peeking PutCode(0xE0);
#define Screen_Copy PutCode(0xE8);
#define DataWriteIncrement PutCode(0xC0);
#define DataReadIncrement PutCode(0xC1);
#define DataWriteDecrement PutCode(0xC2);
#define DataReadDecrement PutCode(0xC3);
#define DataWriteUnchange PutCode(0xC4);
#define DataReadUnchange PutCode(0xC5);
// Definition des variables
int BufferRead;
int Immobile, SensDown, Read;
void Short_Delay (void)
{
char count;
count = 3;
while (--count); /* delay */
}
void LcdReset(void)
{
RESET = 0;
Tempo_ms(50);
RESET = 1;
}
void GetData(char Val)
{
RA0=1;
DIR_DATA = 0xFF;
DATA_or_CODE = 0;
WRITE = 1; READ = 0;
CHIP_ENABLED = 0;
Val = DATA;
Tempo_ms(1);
CHIP_ENABLED = 1;
WRITE = 1; READ = 1;
RA0=0;
}
int LcdBusy(void)
{
RA0=1;
DIR_DATA = 0xFF;
DATA_or_CODE = 1;
WRITE = 1; READ = 0;
CHIP_ENABLED = 0;
BufferRead = DATA;
Tempo_ms(1);
CHIP_ENABLED = 1;
WRITE = 1; READ = 1;
RA0=0;
return BufferRead;
}
void PutCode(unsigned char Val)
{
while((0x03 & LcdBusy()) != 0x03);
RA2=1;
DIR_DATA = 0x00;
DATA = Val;
DATA_or_CODE = 1;
WRITE = 0; READ = 1;
CHIP_ENABLED = 0;
Tempo_ms(1);
CHIP_ENABLED = 1;
WRITE = 1; READ = 1;
RA2=0;
}
void PutData(unsigned char Val)
{
while((0x03 & LcdBusy()) != 0x03);
RA2=1;
DIR_DATA = 0x00;
DATA = Val;
DATA_or_CODE = 0;
WRITE = 0; READ = 1;
CHIP_ENABLED = 0;
Tempo_ms(1);
CHIP_ENABLED = 1;
WRITE = 1; READ = 1;
RA2=0;
}
void MoveData(int Immo, int SDown, int ReadAct)
{
Immobile = Immo;
SensDown = SDown;
Read = ReadAct;
}
void DisplayModes(int Graphics, int Text, int Cursor, int CursorBlink)
{
PutCode(0x90 + Graphics * 8 + Text * 4 + Cursor * 2 + CursorBlink);
}
void CursorPattern(int NbrLigne)
{
PutCode(0xA0 + NbrLigne - 1);
}
void ChangeBit(int Set, int Position)
{
PutCode(0xF0 + Set * 8 + Position);
}
void SendCar(char Car)
{
char CarT6963C;
CarT6963C = Car - 0x20;
PutData(CarT6963C);
DataWriteIncrement;
}
void SetAtHomeAddressMemory(void)
{
PutData(0x00);
PutData(0x00);
Address_Pointer_Set;
}
void SetAtHomeAddressTxt(void)
{
PutData(Text_Home_Address_Low) ;
PutData(Text_Home_Address_High );
Address_Pointer_Set;
}
void SetAtHomeAddressGraph(void)
{
PutData(Graphic_Home_Address_L ow);
PutData(Graphic_Home_Address_H igh);
Address_Pointer_Set;
}
void SetAtHomeCursorMemory(void)
{
PutData(0x00);
PutData(0x00);
Cursor_Pointer_Set;
}
void SetAtHomeCursorTxt(void)
{
PutData(Text_Home_Address_Low) ;
PutData(Text_Home_Address_High );
Cursor_Pointer_Set;
}
void SetAtHomeCursorGraph(void)
{
PutData(Graphic_Home_Address_L ow);
PutData(Graphic_Home_Address_H igh);
Cursor_Pointer_Set;
}
void ClearScreen(void)
{
int i;
SetAtHomeAddressMemory();
PutCode(0xB0);
for(i = 0; i < 0x2000; i++) PutData(0xFF);
PutCode(0xB2);
SetAtHomeAddressMemory();
}
void LcdInit(void)
{
DIR_DATA = 0x00;
DATA = 0;
DIR_CTRL = 0x00;
RESET = 1;
WRITE = 1;
READ = 1;
CHIP_ENABLED = 1;
BACKLIGHT = OFF;
LcdReset();
MoveData(0,0,0);
AND_Rom;
PutData(Graphic_Home_Address_L ow); // Graphic Home address
PutData(Graphic_Home_Address_H igh);
Graphic_Home_Address_Set; // 0x42
PutData(Graphic_Area_Low); // Graphic Area set
PutData(Graphic_Area_High);
Graphic_Area_Set; // 0x43
PutData(Text_Home_Address_Low) ; // Text Home address
PutData(Text_Home_Address_High );
Text_Home_Address_Set; // 0x40
PutData(Text_Area_Low); // Text Area set
PutData(Text_Area_High);
Text_Area_Set; // 0x41
PutData(Text_Home_Address_Low) ;
PutData(Text_Home_Address_High );
Address_Pointer_Set;
PutData(Text_Home_Address_Low) ;
PutData(Text_Home_Address_High );
Cursor_Pointer_Set;
}
Le programme principale :unsigned char Nbr;
unsigned char Count;
int FinTempo;
void TempoInit(void);
void Tempo_ms(int );
void Tempo_s(int );
static void interrupt Timer(void);
void TempoInit(void)
{
GIE=1; PEIE=1;
}
void Tempo_ms(int Millisecondes) // Pas plus de 200ms
{
OPTION = 0b10000001; // Configuration tempo
// 4 * 256 * 1 = 1.024ms
FinTempo = 0;
Nbr = 0;
Count = Millisecondes;
T0IE = 1;
while(FinTempo!=1);
}
void Tempo_s(int Secondes)
{
OPTION = 0b10000101; // Configuration tempo
// 4 * 256 * 1 = 1.024ms
FinTempo = 0;
Nbr = 0;
Count = Secondes * 61;
T0IE = 1;
while(FinTempo!=1);
}
static void interrupt Timer(void)
{
if (T0IF)
{
Nbr++;
if (Nbr>=Count)
{
FinTempo = 1;
T0IE = 0;
}
T0IF=0;
}
}
Je remercie tout ceux qui voudront bien m'aider...#include "pic1687x.h"
#include "LCD12864.h"
void main(void)
{
TempoInit();
LcdInit();
ADCON1=6; // PORT A passe en mode Numérique
OPTION=0b10000101; // Configure tmr0 pour 64µs par bit
//[---------- Init Port ----------]
ClearScreen();
do
{
SendCar('A');
}
while(1);
}
Je commence vraiment à saturer...
Merci
nk36
-----