Content originally posted in LPCWare by Blogs on Mon Jun 04 20:47:59 MST 2012
Hi does anyone have any source codes for running Toshiba T6963c graphic display with ARM chips?
I have been trying to adjust an AVR version of the source code but so far have yet to get it working.
Here's the code I have so far. I am not sure whether the "outByte" function is correct though.
#define T6963_WR(1 << 9)
#define T6963_RD(1 << 8)
#define T6963_CE(1 << 7)
#define T6963_CD(1 << 6)
#define T6963_RESET(1 << 1)
#define T6963_D0(1 << 18)
#define T6963_D1(1 << 17)
#define T6963_D2(1 << 15)
#define T6963_D3(1 << 16)
#define T6963_D4(1 << 23)
#define T6963_D5(1 << 24)
#define T6963_D6(1 << 25)
#define T6963_D7(1 << 26)
#define GLCD_NUMBER_OF_LINES64
#define GLCD_PIXELS_PER_LINE240
#define GLCD_FONT_WIDTH6
#define GLCD_TEXT_HOME0
#define GLCD_TEXT_AREA(GLCD_PIXELS_PER_LINE / GLCD_FONT_WIDTH)
#define GLCD_OFFSET_REGISTER2
#define GLCD_TEXT_SIZE(GLCD_TEXT_AREA * (GLCD_NUMBER_OF_LINES/8))
#define T6963_SET_TEXT_HOME_ADDRESS0x40
#define T6963_SET_TEXT_AREA0x41
#define T6963_SET_OFFSET_REGISTER0x22
#define T6963_SET_ADDRESS_POINTER0x24
#define T6963_DISPLAY_MODE0x90
#define T6963_TEXT_DISPLAY_ON0x04
#define T6963_MODE_SET0x80
#define T6963_DATA_WRITE_AND_INCREMENT0xC0
void delay(void)
{
int i;
for (i = 0; i < 4; i++);
}
void outByte(unsigned char byte)
{
LPC_GPIO0->FIODIR = (0xFF << T6963_D0);
LPC_GPIO0->FIOPIN0 = ((unsigned int)(byte << T6963_D0));
}
void T6963_WriteData(int data)
{
outByte(data);
LPC_GPIO0->FIOCLR = (T6963_CE | T6963_WR | T6963_CD);
delay();
LPC_GPIO0->FIOSET = (T6963_CE | T6963_WR | T6963_CD);
}
void T6963_WriteCommand(int command)
{
outByte(command);
LPC_GPIO0->FIOCLR = (T6963_CE | T6963_WR);
delay();
LPC_GPIO0->FIOSET = (T6963_CE | T6963_WR);
}
void T6963_Init(void)
{
int i;
//Setup Port Pins
LPC_GPIO0->FIODIR = (T6963_WR | T6963_RD | T6963_CE | T6963_CD | T6963_RESET);
LPC_GPIO0->FIOSET = (T6963_WR | T6963_RD | T6963_CE | T6963_CD | T6963_RESET);
//Setup Data Pins
LPC_GPIO0->FIODIR = (T6963_D0 | T6963_D1 | T6963_D2 | T6963_D3 | T6963_D4 | T6963_D5 | T6963_D6 | T6963_D7);
LPC_GPIO0->FIOSET = (T6963_D0 | T6963_D1 | T6963_D2 | T6963_D3 | T6963_D4 | T6963_D5 | T6963_D6 | T6963_D7);
//Reset
LPC_GPIO0->FIOCLR = (T6963_RESET);
for (i = 0; i < 1000; i++);
LPC_GPIO0->FIOSET = (T6963_RESET);
T6963_WriteData(GLCD_TEXT_HOME);
T6963_WriteData(0x00);
T6963_WriteCommand(T6963_SET_TEXT_HOME_ADDRESS);
T6963_WriteData(GLCD_TEXT_AREA);
T6963_WriteData(0x00);
T6963_WriteCommand(T6963_SET_TEXT_AREA);
T6963_WriteData(GLCD_OFFSET_REGISTER);
T6963_WriteData(0x00);
T6963_WriteCommand(T6963_SET_OFFSET_REGISTER);
T6963_WriteData(0);
T6963_WriteData(0);
T6963_WriteCommand(T6963_SET_ADDRESS_POINTER);
T6963_WriteCommand(T6963_DISPLAY_MODE | T6963_TEXT_DISPLAY_ON /* T6963_CURSOR_DISPLAY_ON*/);
T6963_WriteCommand(T6963_MODE_SET | 0);
}
void T6963_ClearText(void)
{
int i;
T6963_WriteData(GLCD_TEXT_HOME);
T6963_WriteData(GLCD_TEXT_HOME >> 8);
T6963_WriteCommand(T6963_SET_ADDRESS_POINTER);
for(i = 0; i < GLCD_TEXT_SIZE; i++)
{
T6963_WriteData(0);
T6963_WriteCommand(T6963_DATA_WRITE_AND_INCREMENT);
}
}
void T6963_WriteChar(char ch)
{
T6963_WriteData(ch - 32);
T6963_WriteCommand(T6963_DATA_WRITE_AND_INCREMENT);
}
void T6963_TextGoTo(int x, int y)
{
int address;
address = GLCD_TEXT_HOME + x + (GLCD_TEXT_AREA * y);
T6963_WriteData(address);
T6963_WriteData(address >> 8);
T6963_WriteCommand(T6963_SET_ADDRESS_POINTER);
}
void T6963_WriteString(char *str)
{
while(*str)
{
T6963_WriteChar(*str++);
}
}
int main(void) {
LPC_GPIO0->FIODIR = 1 << 11;
LPC_GPIO0->FIOSET = 1 << 11;
int j;
T6963_Init();
T6963_ClearText();
T6963_TextGoTo(13, 3);
T6963_WriteString("TOSHIBA T6963C");
LPC_GPIO0->FIOCLR = 1 << 11;
while(1);
return 0;
}