CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

T6963C problems

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
malte
Guest







T6963C problems
PostPosted: Thu Aug 11, 2005 10:01 am     Reply with quote

Hello,

since a few days I´m trying to write a libary for my T6963C 128x128 Display. Could someone please take a look at my Code. The complete display is filled with chars. I tried to compare my code with code in this form. But I found no solution.

Another problem is my LCDText function. MPLAb says :"Bad expression syntax
". What´s wrong with it

Thanks
Malte

T6963C.h:
Code:

//*********************************************************
//T6963C.h
//
//CCS Compiler
//*********************************************************
#include <18F452.h>
#use delay(clock=20000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

//Werte für 18F452
#byte    PORTD   =     0xF83
#byte    PORTC   =     0xF82
#bit    WR   =    PORTC.4
#bit    RD   =   PORTC.5
#bit   CD   =   PORTC.6


//diese Werte entsprechend ändern
#define LCD_WIDTH      128
#define LCD_HEIGHT      128   

//gewünschter Wert auskommentieren      
#define PIXPERBYTE         6
//#define PIXPERBYTE      8      

//wieviele Bytes pro Zeile
#define BYTES_PER_ROW   LCD_WIDTH/PIXPERBYTE
#define DISPLAYBYTES      (unsigned int)(BYTES_PER_ROW * LCD_HEIGHT)

//Def. LCD Display Screen 0
#define T_BASE         0x0000//begin of textarea
#define T_END         (unsigned int)(BYTES_PER_ROW * LCD_HEIGHT/8))//end of textarea
#define G_BASE         (unsigned int)0x0000//base address of first screen
#define G_END         G_BASE+DISPLAYBYTES-1
//Def. Screen 1
#define G_BASE1         G_BASE+DISPLAYBYTES
#define G_END1         G_BASE+DISPLAYBYTES-1


#define DATA_DIR_IN()   set_tris_d(0xFF)
#define DATA_DIR_OUT()   set_tris_d(0x00)
#define READ_DATA      PORTD
#define WRITE_DATA       PORTD   
//8F=100011111
#define INIT_CONTROL_PINS()   {set_tris_c(0x8F); set_tris_d(0xFF);}

#define WR_ON()      {WR=1; delay_ms(1);}
#define WR_OFF()   {WR=0; delay_ms(1);}

#define RD_ON()      {RD=1; delay_ms(1);}
#define RD_OFF()   {RD=0; delay_ms(1);}

#define CTRL()      {CD=1; delay_ms(1);}
#define DATA()      {CD=0; delay_ms(1);}
Guest








PostPosted: Thu Aug 11, 2005 10:02 am     Reply with quote

and
T6963C.c
Code:
#include <T6963C.h>


void CheckBusy(void);
void WriteCTRL(unsigned char dat);
void WriteData1(unsigned char dat, unsigned char command);
void WriteData2(unsigned int dat, unsigned char command);
void WriteData(unsigned char dat);
void WriteCommand(unsigned char command);
void SetPixel(unsigned char xpos, unsigned char ypos, unsigned char mode);
void DisplayOn(void);
unsigned char ConvertText(unsigned char ch);
void LCDText(char *txt, unsigned char xpos, unsigned char ypos);
void ClearTextScreen(void);
void ClearGScreen(unsigned int begin, unsigned int end);
void ClearScreen();
//void SetGBaseLine(unsigned char line);
//void ShowHex(unsigned char dat);
//*********************************************************
void CheckBusy(void)
   {
      unsigned char by;
      DATA_DIR_IN();
      CTRL();
      do
         {
            RD_OFF();
            by=READ_DATA;
            RD_ON();
         }while((by&3) != 3);
      DATA();
   }
//*********************************************************
void WriteCTRL(unsigned char dat)
   {
      DATA_DIR_OUT();
      CTRL();
      WRITE_DATA=dat;
      WR_OFF();
      WR_ON();
      DATA();
   }
//*********************************************************
void WriteData1(unsigned char dat, unsigned char command)
   {
      WriteData(dat);
      WriteCommand(command);
   }
//*********************************************************
void WriteData2(unsigned int dat, unsigned char command)

   {
      WriteData((unsigned char)(dat&0xFF));
      WriteData((unsigned char)(dat>>8));
      WriteCommand(command);
   }
//*********************************************************
void WriteData(unsigned char dat)
   {
      CheckBusy();
      DATA_DIR_OUT();
      DATA();
      WRITE_DATA=dat;
      WR_OFF();
      WR_ON();
   }
//*********************************************************
void WriteCommand(unsigned char command)
   {
      CheckBusy();
      WriteCTRL(command);
   }
//*********************************************************
void SetPixel(unsigned char xpos, unsigned char ypos, unsigned char mode)
   {
      unsigned int adress;
      unsigned char tmp, pixel;
      if(xpos>=LCD_WIDTH) return;
      if(ypos>=LCD_HEIGHT) return;
      adress=(unsigned int)G_BASE;
      adress+=(unsigned int)BYTES_PER_ROW * (unsigned int)ypos;
      adress+=(unsigned int)xpos/(unsigned int)PIXPERBYTE;
      WriteData((unsigned char)(adress&0xFF));
      WriteData((unsigned char)(adress>>8));
      if(mode==0) pixel = 0xF0;
      else pixel = 0xF8;
      tmp=(PIXPERBYTE-1)-(xpos%PIXPERBYTE);
      pixel|=tmp;
      WriteCommand(pixel);
   }
//*********************************************************
void DisplayOn(void)
   {
      INIT_CONTROL_PINS();//set WR,CE,RD,C/D to outputs
      WR_ON();
      RD_ON();
      DATA();
      DATA_DIR_OUT();
      WriteData2(T_BASE, 0x40);
      WriteData2(BYTES_PER_ROW, 0x41);
      WriteData2(G_Base, 0x42);
      WriteData2(BYTES_PER_ROW, 0x43);
      WriteCommand(0x80);
      WriteCommand(0x9C);
      //WriteData2(0x0000, 0x24);
      //WriteData2(0x0000, 0x24);
      ClearScreen();   
   }
//*********************************************************
unsigned char ConvertText(unsigned char ch)
   {
      unsigned char tmp;
      tmp=ch;
      switch(ch)
           {
               case 196: tmp=0x6E; break; // Ä
               case 228: tmp=0x64; break; // ä
               case 214: tmp=0x79; break; // Ö
               case 246: tmp=0x74; break; // ö
               case 220: tmp=0x7A; break; // Ü
               case 252: tmp=0x61; break; // ü
               case 223: tmp=223; break; // ß
               default: tmp-=0x20; break;
           }
      return tmp;

   }
//*********************************************************
void LCDText( char *txt, unsigned char xpos, unsigned char ypos)
   {
       char ps;
       WriteData2(xpos+(BYTES_PER_ROW)*ypos,0x24);

       while(ps = txt) //Solange Zeichen größer 0x00
          {
               txt++;
               if (ps== 0) break;
               ps=ConvertText(ps); //Übersetzungstabelle aufrufen
               WriteData1(ps,0xC0); //Write ps, Auto Inkrement
           }
   }
//*********************************************************
void ClearTextScreen(void)
   {
      int i;
      WriteData2(T_BASE, 0x24);
      for(i=0; i<(BYTES_PER_ROW * LCD_HEIGHT/8); i++)
         {
            WriteData1(0x00, 0xC0);
         }
   }
//*********************************************************
void ClearGScreen(unsigned int begin, unsigned int end)
   {
       unsigned int i;
      WriteData2(begin,0x24); //Setze Startadresse des zu löschenden Bereiches
      for(i=begin; i<=end; i++) WriteData1(0x00,0xC0);
   }

//*********************************************************
void ClearScreen()
   {
      ClearGScreen(G_BASE,G_END1);
       ClearTextScreen();
       //SetGCursor(0,0);
   }

//*********************************************************
void SetGBaseLine(unsigned char line)
   {
       unsigned int adr;
       adr=G_BASE;
       adr+=BYTES_PER_ROW * line;
       WriteData2(adr,0x42);
   }
//*********************************************************
void ShowHex(unsigned char dat)
   {
       unsigned char tmp;
        tmp=dat>>4;
       if(tmp<0x0A) WriteData1(tmp+'0'-0x20,0xC0); //Write ps, Auto Inkrement
       else  WriteData1(tmp+0x37-0x20,0xC0);
       tmp=dat&0x0F;
       if(tmp<0x0A) WriteData1(tmp+'0'-0x20,0xC0); //Write ps, Auto Inkrement
       else  WriteData1(tmp+0x37-0x20,0xC0);
   }

//Hauptprogramm
//*********************************************************
void main()
   {
      set_tris_b(0);
      DisplayOn();
      ClearScreen();
      output_high(PIN_B7);
      SetPixel(10,10,1);
      //LCDText("Hello World",10,10);
      
      
   }
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Thu Aug 11, 2005 10:53 am     Reply with quote

You should perhaps start with the driver from the code library.240x64
That we know works.
Once you can get SOMETHING to the display.(read and write bytes) Then the rest is just changing settings/parameters to get it to do 128x128.
http://www.ccsinfo.com/forum/viewtopic.php?t=19957
Also, Do you have a link to the spec. This would help us understand the requirements.
maltejahn



Joined: 03 Aug 2005
Posts: 0

View user's profile Send private message

PostPosted: Thu Aug 11, 2005 12:44 pm     Reply with quote

Hi,

thanks for you reply. I tried the code. And it works.

Code:
const int16 TextHome = 0x0780;
const int8  TextArea = 0x001E; //
const int16 GraphicsHome = 0x0000;
const int8  GraphicsArea = 0x001E; // ne

I changed 0x01E to 0x0010. But near the last line I see a few dots.
My Display is a Toshiba TLX 1391(http://www.pollin.de/service/LCD/120241.zip)

I changed this im my Code:
Code:

#byte    PORTD   =     0xF83
#byte    PORTC   =     0xF82
#bit    WR   =    PORTC.4
#bit    RD   =   PORTC.5
#bit   CD   =   PORTC.6
#define T_BASE         0x0780
#define T_END         0x0010
#define G_BASE         0x0000
#define G_END         0x0010


Code:

void DisplayOn(void)
   {
      INIT_CONTROL_PINS();//set WR,CE,RD,C/D to outputs
      WR_ON();
      RD_ON();
      DATA();
      DATA_DIR_OUT();
      WriteData2(T_BASE, 0x40);
      WriteData2(G_Base, 0x42);
      WriteData2(BYTES_PER_ROW, 0x41);
      WriteData2(BYTES_PER_ROW, 0x43);
      WriteCommand(0x80);
      WriteCommand(0x9C);
      //WriteData2(0x0000, 0x24);
      //WriteData2(0x0000, 0x24);
      ClearScreen();   
   }
//*********************************************************
void CheckBusy(void)
   {
      unsigned char by;
      DATA_DIR_IN();
      CTRL();
      do
         {
            RD_OFF();
            by=READ_DATA;
            RD_ON();
         }while((by&3) != 3);
      DATA();
   }
//*********************************************************
void WriteCTRL(int dat)
   {
      DATA_DIR_OUT();
      CTRL();
      WRITE_DATA=dat;
      WR_OFF();
      WR_ON();
      DATA();
   }
//*********************************************************
void WriteData1(int16 dat,  int command)
   {
      WriteData(dat);
      WriteCommand(command);
   }
//*********************************************************
void WriteData2(int16 dat, int command)

   {
      WriteData(dat&0xFF);
      WriteData(dat>>8);
      WriteCommand(command);
   }
//*********************************************************
void WriteData(int dat)
   {
      CheckBusy();
      DATA_DIR_OUT();
      DATA();
      WRITE_DATA=dat;
      WR_OFF();
      WR_ON();
   }
//*********************************************************
void WriteCommand(unsigned char command)
   {
      CheckBusy();
      WriteCTRL(command);
   }


and a little main()
Code:
void main()
   {
      set_tris_b(0);
      DisplayOn();
      ClearScreen();
      output_high(PIN_B7);
      SetPixel(10,10,1);
      //LCDText("Hello World",10,10);
      
      
   }


It seems to me like my pic hangs somewhere(no output_high...)
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Thu Aug 11, 2005 1:23 pm     Reply with quote

maltejahn wrote:
I tried the code. And it works.

Then you mention that the code hangs. No output_high.
So are you saying that library code works, but yours doesn't? Yours hangs?
maltejahn



Joined: 03 Aug 2005
Posts: 0

View user's profile Send private message

PostPosted: Thu Aug 11, 2005 2:39 pm     Reply with quote

Hi,

sorry Confused . The code from the Libary works( just a few problems. There are some dots where no dots should be).
My own code hangs.
This line didn´t work
->output_high(PIN_B7);


I try to find out whats wrong with my code

Malte
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Thu Aug 11, 2005 2:48 pm     Reply with quote

The pdf says the max address is 0x1FFF. Is that what is being cleared?

If it is all getting cleared. and you still see dots, try increasing the number.

Also note, in your code((((IN ALL CODE)))) you should have at infinite loop at the end. So the code doesn't fall off into no-man-land.
This is a good habit to get into.

while(1);

OR

while (TRUE){
}


OR

loop:
goto loop;
maltejahn



Joined: 03 Aug 2005
Posts: 0

View user's profile Send private message

PostPosted: Sat Aug 13, 2005 2:37 pm     Reply with quote

Hi,

I still have some problems with my T6963C. I didnt understand exactly what you mean with:
Quote:
The pdf says the max address is 0x1FFF. Is that what is being cleared?
If it is all getting cleared. and you still see dots, try increasing the number.

Do you mean this:
Code:
for (counter = 0; counter < 0x1fff; counter++)
  {
    glcd_WriteByteAuto(0);    // fill everything with zeros
     delay_us(10);
   }
  glcd_WriteByte(1, AutoModeReset);
}

I tried to change this value. Nothing happend.
FS is 8x8(PIN low)

-I changed TextHome from 0x0780 to 0x0000.
- The glcd_pixel function didnt work. The position of the pixel is maybe 15,100. Not 50,50

Here are some pictures of my current screen:
http://home.arcor.de/maltejahn/LCD/DSCF0197.JPG
http://home.arcor.de/maltejahn/LCD/DSCF0198.JPG
http://home.arcor.de/maltejahn/LCD/DSCF0199.JPG


Thanks
Malte


Code:
#include <16F877a.h>
#include <math.h>
//#device *=16
//#device adc=10
#use delay(clock=4 000 000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#define set_tris_lcd(x) set_tris_d(x)
const int16 TextHome = 0x0000;
const int8  TextArea = 0x0010; // how many bytes before a new line
const int16 GraphicsHome = 0x0000;
const int8  GraphicsArea = 0x0010; // how many bytes before a new line
const int8 AutoModeWrite = 0xB0;
const int8 AutoModeRead  = 0xB1;
const int8 AutoModeReset = 0xB2;
const int8 LCDModeSet  = 0x80;   // send this OR'd with the following
const int8 LCDMode_OR  = 0b0000;
const int8 LCDMode_XOR = 0b0001;
const int8 LCDMode_AND = 0b0010;
const int8 LCDMode_TA  = 0b0100; // TEXT ATTRIBUTE mode.
const int8 LCDMode_RAM = 0b1000; // 1=CG RAM, 0=internal CG ROM
const int8 LCDSetCursorPtr  = 0x21;  // cursor address
const int8 LCDSetCursorSize = 0xA0;  // 1 line cursor
const int8 LCDDispMode = 0x90;   // send this OR'd with the following
const int8 LCDDisp_BLK = 0b0001;
const int8 LCDDisp_CUR = 0b0010;
const int8 LCDDisp_TXT = 0b0100;
const int8 LCDDisp_GRH = 0b1000;
struct lcd_pin_def
{
   BOOLEAN unused1;    // C0
   BOOLEAN unused2;    // C1
   BOOLEAN unused3;  // C2
   BOOLEAN unused4;  // C3
   BOOLEAN w_bar;  // C4 Write bar active low
   BOOLEAN r_bar;  // C5 Read bar active low
   BOOLEAN cd;         // C6 Command/Data BAR   1=command 0=data
   BOOLEAN reset_bar;  // C7 Reset active low
   int  data    :  8;  // PortD=Data bus
};
struct lcd_pin_def  LCD;
#byte LCD = 7   

int   glcd_ReadByte(void);
void  glcd_WriteByte(int1 cd, int data);
void  glcd_WriteByteAuto(int data);
void  glcd_WriteCmd2(int16 data, int cmd);
void  glcd_WriteCmd1(int data, int cmd);
void  glcd_gotoxy(int x, int y, int1 text);
void SetPixel(int xpos, int ypos,  char mode);
glcd_pixel(int16 x,int16 y, int1 color);
unsigned char ConvertText(int ch);
//*********************************************************
void glcd_init(void) {
     int16 counter;
     set_tris_lcd(0xff);   //TRIS DATA bus,note:control bus always outputs
     LCD.w_bar = 1;      // INITIAL STATES OF CONTROL PINS
     LCD.r_bar = 1;      //
     LCD.cd = 1;         // command
     LCD.reset_bar = 0;  // perform a reset
     delay_us(10);      // delay for a reset
     LCD.reset_bar = 1;  // run
      glcd_WriteCmd2(TextHome, 0x40);
     glcd_WriteCmd2(TextArea, 0x41);
   glcd_WriteCmd2(GraphicsHome, 0x42);
   glcd_WriteCmd2(GraphicsArea, 0x43);
   glcd_WriteCmd2(0x0000, 0x24);
   glcd_WriteCmd2(0x0000, 0x24);
  // Clear all RAM of LCD (8k)
  glcd_WriteByte(1, AutoModeWrite);
  for (counter = 0; counter < 0x1fff; counter++)
  {
    glcd_WriteByteAuto(0);    // fill everything with zeros
     delay_us(10);
   }
  glcd_WriteByte(1, AutoModeReset);
}
//*********************************************************
void glcd_WriteByte(int1 cd, int data)
{
    int status = 0, temp = 0;
    set_tris_lcd(0xff);
    LCD.w_bar = 1;
    LCD.r_bar= 1;
    LCD.cd = 1;//defaults

    while (status != 0x03) {  // is LCD busy?
       LCD.r_bar= 0;
       temp = LCD.data;
       LCD.r_bar = 1;
       status = temp & 0x03;
    }
    set_tris_lcd(0x00);    // All outputs
    LCD.cd = cd;           // Command/Data bar
    LCD.data = data;
    LCD.r_bar = 1;         // not read
    LCD.w_bar = 0;         // write
    LCD.w_bar = 1;         // release
}
//*********************************************************
void glcd_WriteByteAuto(int data)
{
   int status = 0, temp = 0; // status bits ARE DIFFERENT BITS THAN NORMAL
   set_tris_lcd(0xff);
   LCD.w_bar = 1;
   LCD.r_bar = 1;
   LCD.cd = 1; // defaults
   while (status != 0x08) {  // is LCD busy?
     LCD.r_bar = 0;
     temp = LCD.data;
     LCD.r_bar = 1;
     status = temp & 0x08;
   }
   set_tris_lcd(0x00);     // All outputs
   LCD.cd = 0;             // This is always data, cd=0
   LCD.data = data;        // Put data on data bus
   LCD.w_bar = 0;          // write
   LCD.w_bar = 1;          // release
}
//*********************************************************
void glcd_WriteCmd1(int data, int cmd)
{
  glcd_WriteByte(0, data);
  glcd_WriteByte(1, cmd);
}
//*********************************************************
void glcd_WriteCmd2(int16 data, int cmd)
{
  glcd_WriteByte(0, data & 0xff);
  glcd_WriteByte(0, data>>8);
  glcd_WriteByte(1, cmd);
}
//*********************************************************
int glcd_ReadByte(void)
{
  int data = 0, status = 0, temp = 0;
  set_tris_lcd(0xff);
  LCD.w_bar = 1;
  LCD.r_bar = 1;
  LCD.cd = 1;  // defaults
  #asm nop nop #endasm
  while (status != 0x03) {  // is LCD busy?
    LCD.r_bar = 0;
    temp = LCD.data;
    LCD.r_bar = 1;
    status = temp & 0x03;
  }
  LCD.cd = 0;          // Command/Data bar
  LCD.r_bar = 0;        // read
  /////////////////////////////////////////////////////////
  #asm nop #endasm    // THIS PAUSE IS VERY NESSESARY !!!//
  /////////////////////////////////////////////////////////
  data = LCD.data;
  LCD.r_bar = 1;
  LCD.cd = 1;
  return data;        // Return the read data
}
//*********************************************************
void glcd_putc(char c) {
   glcd_WriteCmd1(c - 0x20, 0xc0);
}
//*********************************************************
void glcd_gotoxy(int x, int y, int1 text) { // sets memory location to screen location x, y
   // location 1,1 is upper left corner;  text = 1 (text area), text = 0 (graphics area)
   int16 location, home;
   int line;
   if (!text) {
      home = GraphicsHome;
      line = GraphicsArea;
   }
   else {
      home = TextHome;
      line = TextArea;
   }
   location = home + (((int16)y - 1) * line) + x - 1;
   glcd_WriteCmd2(location, 0x24);
}
//*********************************************************
//Holger Klabundes Code
void SetPixel(int xpos, int ypos,  char mode)
   {
      int adress;
      char tmp, pixel;
      if(xpos>=128) return;
      if(ypos>=128) return;
      adress=GraphicsHome;
      adress+=16 * ypos;
      adress+=xpos/8;
      glcd_WriteByte(0,adress&0xFF);
      glcd_WriteByte(0,adress>>8);
      if(mode==0) pixel = 0xF0;
      else pixel = 0xF8;
      tmp=(8-1)-(xpos%8);
      pixel|=tmp;
      glcd_WriteByte(1,pixel);
   }
//*********************************************************
//Code aus dem CCS Forum
glcd_pixel(int16 x,int16 y, int1 color)
{
int8 r=0,c=0;
c=color;
r=fmod(x,8);
glcd_WriteCmd2(GraphicsHome+(y*30+(x/8)),0x24);
glcd_WriteByte(1,0xf0|(c<<3) |(7-r));
}
//*********************************************************
void LCDText( char *txt, int xpos, int ypos)
   {
       char ps;
       glcd_WriteCMD2(xpos+(8)*ypos,0x24);

       while(ps = txt) //Solange Zeichen größer 0x00
          {
               txt++;
               if (ps== 0) break;
               ps=ConvertText(ps); //Übersetzungstabelle aufrufen
               glcd_WriteCMD1(ps,0xC0); //Write ps, Auto Inkrement
           }
   }
//*********************************************************
unsigned char ConvertText(unsigned char ch)
   {
      unsigned char tmp;
      tmp=ch;
      switch(ch)
           {
               case 196: tmp=0x6E; break; // Ä
               case 228: tmp=0x64; break; // ä
               case 214: tmp=0x79; break; // Ö
               case 246: tmp=0x74; break; // ö
               case 220: tmp=0x7A; break; // Ü
               case 252: tmp=0x61; break; // ü
               case 223: tmp=223; break; // ß
               default: tmp-=0x20; break;
           }
      return tmp;
}
   
//*********************************************************
#use fast_io(D)
   void main() {
   int n;
    set_tris_a(0);set_tris_b(0);set_tris_c(0);
   set_tris_d(0);set_tris_e(0);
      set_tris_c(0x00);  // graphic lcd control lines all output
      glcd_init();
      glcd_WriteByte(1, (LCDModeSet|LCDMode_XOR));
      glcd_WriteByte(1, (LCDDispMode|LCDDisp_TXT|LCDDisp_GRH));
   while(1)
   {
   for (n = 0; n< 8; n++) {
      glcd_gotoxy(2,43+n,0);  // 0 = graphics memory area;  note that there
   // are still 30 columns (30 x 8 pixels = 240), but now there are now 64
   // rows so pixel location 9,43 translates into column 2, row 43.  A little
   // confusing, I know, but that's the way it works.
      glcd_WriteCmd1(0xFF,0xc0);
   }     
   delay_ms(1000);
   glcd_pixel(50,50,1);
   delay_ms(1000);
   glcd_gotoxy(1,1,1); // 1 = text area of memory; note that there are only
                             // 8 rows of text possible
   glcd_putc("Hi there");
   }
}
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Sat Aug 13, 2005 3:25 pm     Reply with quote

In respose to the first part. You are correct. I wanted to check that all memory 0x1FFF was being cleared.

so...


If you do nothing but clear the display. Do you still see the dots?
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Sat Aug 13, 2005 3:32 pm     Reply with quote

compair this set pixel with the code you wrote.
I think I tested most of this.

Code:

///////////////////////////////////////////////////////////////////////
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose:       Turn a pixel on a graphic LCD on or off
// Inputs:        x - the x coordinate of the pixel
//                y - the y coordinate of the pixel
//                color - ON or OFF
// Output:        1 if coordinate out of range, 0 if in range
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
glcd_pixel(int16 x,int16 y, int1 color)
{
  int8 r=0,c=0;
  c=color;//converting booean to an int8
  if (x>=GLCD_COL)
  {
    bit_set(ERRORS,5);//ERRORS=bit 5. LCD x range exceeded
    return (FALSE);
  }
  if (y>=GLCD_ROW)
  {
    bit_set(ERRORS,6);//ERRORS=bit 6. LCD y range exceeded
    return (FALSE);
  }
  r=fmod(x,8);
  glcd_WriteCmd2(GraphicsHome+(y*30+(x/8)),LCDSetPtr);
  glcd_WriteCmd0(0xf0|(c<<3) |(7-r));
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose:       Draw a line on a graphic LCD using Bresenham's
//                line drawing algorithm
// Inputs:        (x1, y1) - the start coordinate
//                (x2, y2) - the end coordinate
//                color - ON or OFF
// Dependencies:  glcd_pixel()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_line(int x1, int y1, int x2, int y2, int1 color)
{
  signed int  x, y, addx, addy, dx, dy;
  signed long P;
  int i;
  dx = abs((signed int)(x2 - x1));
  dy = abs((signed int)(y2 - y1));
  x = x1;
  y = y1;
  if(x1 > x2)
    addx = -1;
  else
    addx = 1;
  if(y1 > y2)
    addy = -1;
  else
    addy = 1;
  if(dx >= dy)
  {
    P = 2*dy - dx;
    for(i=0; i<=dx; ++i)
    {
      glcd_pixel(x, y, color);
      if(P < 0)
      {
        P += 2*dy;
        x += addx;
      }
      else
      {
        P += 2*dy - 2*dx;
        x += addx;
        y += addy;
      }
    }
  }
  else
  {
    P = 2*dx - dy;
    for(i=0; i<=dy; ++i)
    {
      glcd_pixel(x, y, color);
      if(P < 0)
      {
        P += 2*dx;
        y += addy;
      }
      else
      {
        P += 2*dx - 2*dy;
        x += addx;
        y += addy;
      }
    }
  }
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose:       Draw a rectangle on a graphic LCD
// Inputs:        (x1, y1) - the start coordinate
//                (x2, y2) - the end coordinate
//                fill  - YES or NO
//                color - ON or OFF
// Dependencies:  glcd_pixel(), glcd_line()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_rect(int x1, int y1, int x2, int y2, int fill, int1 color)
{
  if(fill)
  {
    int y, ymax;                          // Find the y min and max
    if(y1 < y2)
    {
      y = y1;
      ymax = y2;
    }
    else
    {
      y = y2;
      ymax = y1;
    }

    for(; y<=ymax; ++y)                    // Draw lines to fill the rectangle
    glcd_line(x1, y, x2, y, color);
  }
  else
  {
    glcd_line(x1, y1, x2, y1, color);      // Draw the 4 sides
    glcd_line(x1, y2, x2, y2, color);
    glcd_line(x1, y1, x1, y2, color);
    glcd_line(x2, y1, x2, y2, color);
  }
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose:       Draw a bar (wide line) on a graphic LCD
// Inputs:        (x1, y1) - the start coordinate
//                (x2, y2) - the end coordinate
//                width  - The number of pixels wide
//                color - ON or OFF
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_bar(int x1, int y1, int x2, int y2, int width, int1 color)
{
  signed int  x, y, addx, addy, j;
  signed long P, dx, dy, c1, c2;
  int i;
  dx = abs((signed int)(x2 - x1));
  dy = abs((signed int)(y2 - y1));
  x = x1;
  y = y1;
  c1 = -dx*x1 - dy*y1;
  c2 = -dx*x2 - dy*y2;

  if(x1 > x2)
  {
    addx = -1;
    c1 = -dx*x2 - dy*y2;
    c2 = -dx*x1 - dy*y1;
  }
  else
  addx = 1;
  if(y1 > y2)
  {
    addy = -1;
    c1 = -dx*x2 - dy*y2;
    c2 = -dx*x1 - dy*y1;
  }
  else
  addy = 1;

  if(dx >= dy)
  {
    P = 2*dy - dx;

    for(i=0; i<=dx; ++i)
    {
      for(j=-(width/2); j<width/2+width%2; ++j)
      {
        if(dx*x+dy*(y+j)+c1 >= 0 && dx*x+dy*(y+j)+c2 <=0)
        glcd_pixel(x, y+j, color);
      }
      if(P < 0)
      {
        P += 2*dy;
        x += addx;
      }
      else
      {
        P += 2*dy - 2*dx;
        x += addx;
        y += addy;
      }
    }
  }
  else
  {
    P = 2*dx - dy;

    for(i=0; i<=dy; ++i)
    {
      if(P < 0)
      {
        P += 2*dx;
        y += addy;
      }
      else
      {
        P += 2*dx - 2*dy;
        x += addx;
        y += addy;
      }
      for(j=-(width/2); j<width/2+width%2; ++j)
      {
        if(dx*x+dy*(y+j)+c1 >= 0 && dx*x+dy*(y+j)+c2 <=0)
          glcd_pixel(x+j, y, color);
      }
    }
  }
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose:       Draw a circle on a graphic LCD
// Inputs:        (x,y) - the center of the circle
//                radius - the radius of the circle
//                fill - YES or NO
//                color - ON or OFF
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_circle(int x, int y, int radius, int1 fill, int1 color)
{
  signed int a, b, P;
  a = 0;
  b = radius;
  P = 1 - radius;

  do
  {
    if(fill)
    {
      glcd_line(x-a, y+b, x+a, y+b, color);
      glcd_line(x-a, y-b, x+a, y-b, color);
      glcd_line(x-b, y+a, x+b, y+a, color);
      glcd_line(x-b, y-a, x+b, y-a, color);
    }
    else
    {
      glcd_pixel(a+x, b+y, color);
      glcd_pixel(b+x, a+y, color);
      glcd_pixel(x-a, b+y, color);
      glcd_pixel(x-b, a+y, color);
      glcd_pixel(b+x, y-a, color);
      glcd_pixel(a+x, y-b, color);
      glcd_pixel(x-a, y-b, color);
      glcd_pixel(x-b, y-a, color);
    }

    if(P < 0)
      P+= 3 + 2*a++;
    else
      P+= 5 + 2*(a++ - b--);
  } while(a <= b);
}

//////////////////////////////////////////////////////////////////
const BYTE TEXT[51][5] ={ 0x00, 0x00, 0x00, 0x00, 0x00, // SPACE
                          0x00, 0x00, 0x5F, 0x00, 0x00, // !
                          0x00, 0x03, 0x00, 0x03, 0x00, // "
                          0x14, 0x3E, 0x14, 0x3E, 0x14, // #
                          0x24, 0x2A, 0x7F, 0x2A, 0x12, // $
                          0x43, 0x33, 0x08, 0x66, 0x61, // %
                          0x36, 0x49, 0x55, 0x22, 0x50, // &
                          0x00, 0x05, 0x03, 0x00, 0x00, // '
                          0x00, 0x1C, 0x22, 0x41, 0x00, // (
                          0x00, 0x41, 0x22, 0x1C, 0x00, // )
                          0x14, 0x08, 0x3E, 0x08, 0x14, // *
                          0x08, 0x08, 0x3E, 0x08, 0x08, // +
                          0x00, 0x50, 0x30, 0x00, 0x00, // ,
                          0x08, 0x08, 0x08, 0x08, 0x08, // -
                          0x00, 0x60, 0x60, 0x00, 0x00, // .
                          0x20, 0x10, 0x08, 0x04, 0x02, // /
                          0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
                          0x04, 0x02, 0x7F, 0x00, 0x00, // 1
                          0x42, 0x61, 0x51, 0x49, 0x46, // 2
                          0x22, 0x41, 0x49, 0x49, 0x36, // 3
                          0x18, 0x14, 0x12, 0x7F, 0x10, // 4
                          0x27, 0x45, 0x45, 0x45, 0x39, // 5
                          0x3E, 0x49, 0x49, 0x49, 0x32, // 6
                          0x01, 0x01, 0x71, 0x09, 0x07, // 7
                          0x36, 0x49, 0x49, 0x49, 0x36, // 8
                          0x26, 0x49, 0x49, 0x49, 0x3E, // 9
                          0x00, 0x36, 0x36, 0x00, 0x00, // :
                          0x00, 0x56, 0x36, 0x00, 0x00, // ;
                          0x08, 0x14, 0x22, 0x41, 0x00, // <
                          0x14, 0x14, 0x14, 0x14, 0x14, // =
                          0x00, 0x41, 0x22, 0x14, 0x08, // >
                          0x02, 0x01, 0x51, 0x09, 0x06, // ?
                          0x3E, 0x41, 0x59, 0x55, 0x5E, // @
                          0x7E, 0x09, 0x09, 0x09, 0x7E, // A
                          0x7F, 0x49, 0x49, 0x49, 0x36, // B
                          0x3E, 0x41, 0x41, 0x41, 0x22, // C
                          0x7F, 0x41, 0x41, 0x41, 0x3E, // D
                          0x7F, 0x49, 0x49, 0x49, 0x41, // E
                          0x7F, 0x09, 0x09, 0x09, 0x01, // F
                          0x3E, 0x41, 0x41, 0x49, 0x3A, // G
                          0x7F, 0x08, 0x08, 0x08, 0x7F, // H
                          0x00, 0x41, 0x7F, 0x41, 0x00, // I
                          0x30, 0x40, 0x40, 0x40, 0x3F, // J
                          0x7F, 0x08, 0x14, 0x22, 0x41, // K
                          0x7F, 0x40, 0x40, 0x40, 0x40, // L
                          0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
                          0x7F, 0x02, 0x04, 0x08, 0x7F, // N
                          0x3E, 0x41, 0x41, 0x41, 0x3E, // O
                          0x7F, 0x09, 0x09, 0x09, 0x06, // P
                          0x1E, 0x21, 0x21, 0x21, 0x5E, // Q
                          0x7F, 0x09, 0x09, 0x09, 0x76};// R

const BYTE TEXT2[44][5]={ 0x26, 0x49, 0x49, 0x49, 0x32, // S
                          0x01, 0x01, 0x7F, 0x01, 0x01, // T
                          0x3F, 0x40, 0x40, 0x40, 0x3F, // U
                          0x1F, 0x20, 0x40, 0x20, 0x1F, // V
                          0x7F, 0x20, 0x10, 0x20, 0x7F, // W
                          0x41, 0x22, 0x1C, 0x22, 0x41, // X
                          0x07, 0x08, 0x70, 0x08, 0x07, // Y
                          0x61, 0x51, 0x49, 0x45, 0x43, // Z
                          0x00, 0x7F, 0x41, 0x00, 0x00, // [
                          0x02, 0x04, 0x08, 0x10, 0x20, // \
                          0x00, 0x00, 0x41, 0x7F, 0x00, // ]
                          0x04, 0x02, 0x01, 0x02, 0x04, // ^
                          0x40, 0x40, 0x40, 0x40, 0x40, // _
                          0x00, 0x01, 0x02, 0x04, 0x00, // `
                          0x20, 0x54, 0x54, 0x54, 0x78, // a
                          0x7F, 0x44, 0x44, 0x44, 0x38, // b
                          0x38, 0x44, 0x44, 0x44, 0x44, // c
                          0x38, 0x44, 0x44, 0x44, 0x7F, // d
                          0x38, 0x54, 0x54, 0x54, 0x18, // e
                          0x04, 0x04, 0x7E, 0x05, 0x05, // f
                          0x08, 0x54, 0x54, 0x54, 0x3C, // g
                          0x7F, 0x08, 0x04, 0x04, 0x78, // h
                          0x00, 0x44, 0x7D, 0x40, 0x00, // i
                          0x20, 0x40, 0x44, 0x3D, 0x00, // j
                          0x7F, 0x10, 0x28, 0x44, 0x00, // k
                          0x00, 0x41, 0x7F, 0x40, 0x00, // l
                          0x7C, 0x04, 0x78, 0x04, 0x78, // m
                          0x7C, 0x08, 0x04, 0x04, 0x78, // n
                          0x38, 0x44, 0x44, 0x44, 0x38, // o
                          0x7C, 0x14, 0x14, 0x14, 0x08, // p
                          0x08, 0x14, 0x14, 0x14, 0x7C, // q
                          0x00, 0x7C, 0x08, 0x04, 0x04, // r
                          0x48, 0x54, 0x54, 0x54, 0x20, // s
                          0x04, 0x04, 0x3F, 0x44, 0x44, // t
                          0x3C, 0x40, 0x40, 0x20, 0x7C, // u
                          0x1C, 0x20, 0x40, 0x20, 0x1C, // v
                          0x3C, 0x40, 0x30, 0x40, 0x3C, // w
                          0x44, 0x28, 0x10, 0x28, 0x44, // x
                          0x0C, 0x50, 0x50, 0x50, 0x3C, // y
                          0x44, 0x64, 0x54, 0x4C, 0x44, // z
                          0x00, 0x08, 0x36, 0x41, 0x41, // {
                          0x00, 0x00, 0x7F, 0x00, 0x00, // |
                          0x41, 0x41, 0x36, 0x08, 0x00, // }
                          0x02, 0x01, 0x02, 0x04, 0x02};// ~




// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// Purpose:       Write text on a graphic LCD
// Inputs:        (x,y) - The upper left coordinate of the first letter
//                textptr - A pointer to an array of text to display
//                size - The size of the text: 1 = 5x7, 2 = 10x14, ...
//                color - ON or OFF
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
void glcd_text57(int x, int y, char* textptr, int size, int1 color)
{
  const BYTE bytes_per_char=5;
  int i, j, k, l, m;                     // Loop counters
  BYTE pixelData[bytes_per_char];                     // Stores character data
  for(i=0; textptr[i] != '\0'; ++i, ++x) // Loop through the passed string
  {
    if(textptr[i] < 'S') // Checks if the letter is in the first or second array
    memcpy(pixelData, TEXT[textptr[i]-' '], bytes_per_char);
    else if(textptr[i] <= '~') // Check if the letter is in the second array
    memcpy(pixelData, TEXT2[textptr[i]-'S'], bytes_per_char);
    else
    memcpy(pixelData, TEXT[0], bytes_per_char);   // Default to space

    if(x+5*size >= GLCD_COL)          // Performs character wrapping
    {
      x = 0;                           // Set x at far left position
      y += 7*size + 1;                 // Set y at next position down
    }
    for(j=0; j<bytes_per_char; ++j, x+=size)         // 5 bytes per character
    {
      for(k=0; k<7*size; ++k)          // Loop through the vertical pixels
      {
        if(bit_test(pixelData[j], k)) // Check if the pixel should be set
        {
          for(l=0; l<size; ++l)      // The next two loops change the
          {                          // character's size
            for(m=0; m<size; ++m)
            {
              glcd_pixel(x+m, y+k*size+l, color); // Draws the pixel
            }
          }
        }
      }
    }
  }
}

//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//// Purpose:       Fill the LCD screen with the passed in color.
////                Works much faster than drawing a rectangle to fill the screen
//// Inputs:        ON - turn all the pixels on
////                OFF - turn all the pixels off
//// Dependencies:  glcd_WriteByte()
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//void glcd_fillScreen(int1 color)
//{
//  int line_num, column;
//  // Loop through the lines
//  //fprintf(DEBUG,"Fill screen with %d\n\r",color);
//  for(line_num = 0; line_num < 8; ++line_num)
//  {
//    glcd_WriteByte(0, 0xB0+line_num);
//    glcd_WriteByte(0, 0x10);
//    glcd_WriteByte(0, 0x00);
//    // Loop through the horline_numzontal sectline_numons
//    for(column = 0; column < 128; ++column)
//    {
//      glcd_WriteByte(1, 0xFF*color);  // Turn all pixels on or off
//    }
//  }
//
//}
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//// Purpose:       Selects a font and sets up areas
//// Ouputs:        A bit that is applied to the FS(font select) pin
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
//void glcd_FontSelect(int1 fs) {
//   LCD.fs=fs;
//   switch (fs)
//   {
//     case 1:
//            glcd_WriteCmd2(TextHome,0x40);
//            glcd_WriteCmd2(AreaSet_T,0x41);
//            glcd_WriteCmd2(GraphicsHome,0x42);
//            glcd_WriteCmd2(AreaSet_G,0x43);
//            break;
//     default:
//     glcd_WriteCmd1(c-0x20,0xc0);
//     break;
//   }
//}
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Sat Aug 13, 2005 3:48 pm     Reply with quote

One other thing. The numbers don't seem right. Graphics is ON TOP OF the text area. Think of it as a linear address space.
Text space uses (16x16=256) from 0 to 256.
Then the next byte is graphics space.
graphics size is 128x128=16384 big
So graphics space is from 257 to 16641
OK?
maltejahn



Joined: 03 Aug 2005
Posts: 0

View user's profile Send private message

PostPosted: Sun Aug 14, 2005 3:16 am     Reply with quote

Hi,

now it works -many thanks.
I have changed this:
-GraphicsHome from 0x0000 to 0x0101;
- at your glcd_pixel function
glcd_WriteCmd2(GraphicsHome+(y*16+(x/8)),0x24);
now i can put a pixel from 0,0 to 127,127


Malte
LTS



Joined: 08 Dec 2005
Posts: 8

View user's profile Send private message

T6963 problem here...
PostPosted: Fri Dec 16, 2005 8:46 pm     Reply with quote

Im trying to get my T6963 (128x64 pixels) to work with a PIC16F877A
I've tried the code here, but i doesn't work. I think my pic hangs somewhere.

Maybe you could post your code that works matlejahn?

Thanks in advance

LT
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Mon Dec 19, 2005 12:55 pm     Reply with quote

LT.
That too little to go on.
Start a NEW post. Don't tack onto this old one.
And post more info about what it is and isn't doing.

Did you change the #byte so the lcd pin def in correct for the 16F877A
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group