huub8
Junior Member level 3
I’m trying to get a lcd display to initialise using a 18f45k22 microcontroller, its controlled by a ST7735 chip. Some useful data:
**broken link removed**
The datasheet of the ST7735 chip
**broken link removed**
A library for a very similar display from adafruit
The problem is that I can’t get the display to initialize. The arduino library from adafruit talks about 2 different types, its also big and for arduino, but I also got some code from the ebay page (linked to above) where I brought my display. Its not written for 18f microcontrollers though, so I converted it to code in mikroC for an 18f45k22. The problem is that I cant get the display to display anything, it just shows a blank screen. I think the problem lies in the initialization routine, but I cant find the problem myself.
The code from ebay:
My own code:
I'm completely stuck, so it would be very grateful if someone could help me out.
**broken link removed**
The datasheet of the ST7735 chip
**broken link removed**
A library for a very similar display from adafruit
The problem is that I can’t get the display to initialize. The arduino library from adafruit talks about 2 different types, its also big and for arduino, but I also got some code from the ebay page (linked to above) where I brought my display. Its not written for 18f microcontrollers though, so I converted it to code in mikroC for an 18f45k22. The problem is that I cant get the display to display anything, it just shows a blank screen. I think the problem lies in the initialization routine, but I cant find the problem myself.
The code from ebay:
Code:
//
/***************************************************/
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
sbit cs =P3^5;
sbit rs =P2^3;
sbit sda =P2^2;
sbit scl =P2^1;
sbit reset =P3^4;
uchar bdata bitdata;
sbit bit7=bitdata^7;
sbit bit6=bitdata^6;
sbit bit5=bitdata^5;
sbit bit4=bitdata^4;
sbit bit3=bitdata^3;
sbit bit2=bitdata^2;
sbit bit1=bitdata^1;
sbit bit0=bitdata^0;
void delay(uint t);
void delay(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<250;j++);
}
void LCD_CtrlWrite_IC(uchar c)
{
bitdata=c;
cs=0;
rs=0;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}
void LCD_DataWrite_IC(uchar d)
{
bitdata=d;
cs=0;
rs=1;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}
void LCD_DataWrite(uchar LCD_DataH,uchar LCD_DataL)
{
LCD_DataWrite_IC(LCD_DataH);
LCD_DataWrite_IC(LCD_DataL);
}
void write_command(uchar c)
{
bitdata=c;
cs=0;
rs=0;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}
void write_data(uchar d)
{
bitdata=d;
cs=0;
rs=1;
sda=bit7;scl=0;scl=1;
sda=bit6;scl=0;scl=1;
sda=bit5;scl=0;scl=1;
sda=bit4;scl=0;scl=1;
sda=bit3;scl=0;scl=1;
sda=bit2;scl=0;scl=1;
sda=bit1;scl=0;scl=1;
sda=bit0;scl=0;scl=1;
cs=1;
}
void Reset()
{
reset=0;
delay(100);
reset=1;
delay(100);
}
//////////////////////////////////////////////////////////////////////////////////////////////
void lcd_initial()
{
reset=0;
delay(100);
reset=1;
delay(100);
//------------------------------------------------------------------//
//-------------------Software Reset-------------------------------//
//------------------------------------------------------------------//
write_command(0x11);//Sleep exit
delay (120);
//ST7735R Frame Rate
write_command(0xB1);
write_data(0x01); write_data(0x2C); write_data(0x2D);
write_command(0xB2);
write_data(0x01); write_data(0x2C); write_data(0x2D);
write_command(0xB3);
write_data(0x01); write_data(0x2C); write_data(0x2D);
write_data(0x01); write_data(0x2C); write_data(0x2D);
write_command(0xB4); //Column inversion
write_data(0x07);
//ST7735R Power Sequence
write_command(0xC0);
write_data(0xA2); write_data(0x02); write_data(0x84);
write_command(0xC1); write_data(0xC5);
write_command(0xC2);
write_data(0x0A); write_data(0x00);
write_command(0xC3);
write_data(0x8A); write_data(0x2A);
write_command(0xC4);
write_data(0x8A); write_data(0xEE);
write_command(0xC5); //VCOM
write_data(0x0E);
write_command(0x36); //MX, MY, RGB mode
write_data(0xC8);
//ST7735R Gamma Sequence
write_command(0xe0);
write_data(0x0f); write_data(0x1a);
write_data(0x0f); write_data(0x18);
write_data(0x2f); write_data(0x28);
write_data(0x20); write_data(0x22);
write_data(0x1f); write_data(0x1b);
write_data(0x23); write_data(0x37); write_data(0x00);
write_data(0x07);
write_data(0x02); write_data(0x10);
write_command(0xe1);
write_data(0x0f); write_data(0x1b);
write_data(0x0f); write_data(0x17);
write_data(0x33); write_data(0x2c);
write_data(0x29); write_data(0x2e);
write_data(0x30); write_data(0x30);
write_data(0x39); write_data(0x3f);
write_data(0x00); write_data(0x07);
write_data(0x03); write_data(0x10);
write_command(0x2a);
write_data(0x00);write_data(0x00);
write_data(0x00);write_data(0x7f);
write_command(0x2b);
write_data(0x00);write_data(0x00);
write_data(0x00);write_data(0x9f);
write_command(0xF0); //Enable test command
write_data(0x01);
write_command(0xF6); //Disable ram power save mode
write_data(0x00);
write_command(0x3A); //65k mode
write_data(0x05);
write_command(0x29);//Display on
}
void dsp_single_colour(DH,DL)
{
uchar i,j;
//RamAdressSet();
for (i=0;i<160;i++)
for (j=0;j<128;j++)
LCD_DataWrite(DH,DL);
}
main()
{
lcd_initial();
while(1)
{
write_command(0x2C);
// Disp_gradscal(); //»Ò½×
// delay(500);
// dsp_single_colour(0x84,0x10);//»ÒÉ«
// delay(500);
dsp_single_colour(0xff,0xff);//°×É«
delay(500);
dsp_single_colour(0x00,0x00);//ºÚÉ«
delay(500);
dsp_single_colour(0xf8,0x00);//ºìÉ«
delay(500);
dsp_single_colour(0x07,0xe0);//ÂÌÉ«
delay(500);
dsp_single_colour(0x00,0x1f);//À¶É«
delay(500);
}
}
My own code:
Code:
sbit cs at latB0_bit;
sbit rs at latB1_bit;
sbit sdalcd at latB2_bit;
sbit scllcd at latB3_bit;
sbit reset at latB4_bit;
char bitdata;
sbit bit7 at bitdata.b7;
sbit bit6 at bitdata.b6;
sbit bit5 at bitdata.b5;
sbit bit4 at bitdata.b4;
sbit bit3 at bitdata.b3;
sbit bit2 at bitdata.b2;
sbit bit1 at bitdata.b1;
sbit bit0 at bitdata.b0;
void LCD_CtrlWrite_IC(char c)
{
bitdata=c;
cs=0;
rs=0;
sdalcd=bit7; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit6; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit5; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit4; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit3; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit2; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit1; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit0; scllcd=0; delay_us(100); scllcd=1;
cs=1;
}
void LCD_DataWrite_IC(char d)
{
bitdata=d;
cs=0;
rs=1;
sdalcd=bit7; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit6; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit5; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit4; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit3; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit2; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit1; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit0; scllcd=0; delay_us(100); scllcd=1;
cs=1;
}
void LCD_DataWrite(char LCD_DataH,char LCD_DataL)
{
LCD_DataWrite_IC(LCD_DataH);
LCD_DataWrite_IC(LCD_DataL);
}
void write_command(char c)
{
bitdata=c;
cs=0;
rs=0;
sdalcd=bit7; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit6; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit5; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit4; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit3; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit2; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit1; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit0; scllcd=0; delay_us(100); scllcd=1;
cs=1;
}
void write_data(char d)
{
bitdata=d;
cs=0;
rs=1;
sdalcd=bit7; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit6; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit5; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit4; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit3; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit2; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit1; scllcd=0; delay_us(100); scllcd=1;
sdalcd=bit0; scllcd=0; delay_us(100); scllcd=1;
cs=1;
}
void lcd_initial()
{
reset=0;
delay_ms(100);
reset=1;
delay_ms(100);
//------------------------------------------------------------------//
//-------------------Software Reset-------------------------------//
write_command(0x11);//Sleep exit
delay_ms(500);
//ST7735R Frame Rate
write_command(0xB1); delay_us(100);
write_data(0x01); delay_us(100);
write_data(0x2C); delay_us(100);
write_data(0x2D); delay_us(100);
write_command(0xB2); delay_us(100);
write_data(0x01); delay_us(100);
write_data(0x2C); delay_us(100);
write_data(0x2D); delay_us(100);
write_command(0xB3); delay_us(100);
write_data(0x01); delay_us(100);
write_data(0x2C); delay_us(100);
write_data(0x2D); delay_us(100);
write_data(0x01); delay_us(100);
write_data(0x2C); delay_us(100);
write_data(0x2D); delay_us(100);
//Column inversion
write_command(0xB4); delay_us(100);
write_data(0x07); delay_us(100);
//ST7735R Power Sequence
write_command(0xC0); delay_us(100);
write_data(0xA2); delay_us(100);
write_data(0x02); delay_us(100);
write_data(0x84); delay_us(100);
write_command(0xC1); delay_us(100);
write_data(0xC5); delay_us(100);
write_command(0xC2); delay_us(100);
write_data(0x0A); delay_us(100);
write_data(0x00); delay_us(100);
write_command(0xC3); delay_us(100);
write_data(0x8A); delay_us(100);
write_data(0x2A); delay_us(100);
write_command(0xC4); delay_us(100);
write_data(0x8A); delay_us(100);
write_data(0xEE); delay_us(100);
//VCOM
write_command(0xC5); delay_us(100);
write_data(0x0E); delay_us(100);
//MX, MY, RGB mode
write_command(0x36); delay_us(100);
write_data(0xC8); delay_us(100);
//ST7735R Gamma Sequence
write_command(0xe0); delay_us(100);
write_data(0x0f); delay_us(100);
write_data(0x1a); delay_us(100);
write_data(0x0f); delay_us(100);
write_data(0x18); delay_us(100);
write_data(0x2f); delay_us(100);
write_data(0x28); delay_us(100);
write_data(0x20); delay_us(100);
write_data(0x22); delay_us(100);
write_data(0x1f); delay_us(100);
write_data(0x1b); delay_us(100);
write_data(0x23); delay_us(100);
write_data(0x37); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x07); delay_us(100);
write_data(0x02); delay_us(100);
write_data(0x10); delay_us(100);
write_command(0xe1); delay_us(100);
write_data(0x0f); delay_us(100);
write_data(0x1b); delay_us(100);
write_data(0x0f); delay_us(100);
write_data(0x17); delay_us(100);
write_data(0x33); delay_us(100);
write_data(0x2c); delay_us(100);
write_data(0x29); delay_us(100);
write_data(0x2e); delay_us(100);
write_data(0x30); delay_us(100);
write_data(0x30); delay_us(100);
write_data(0x39); delay_us(100);
write_data(0x3f); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x07); delay_us(100);
write_data(0x03); delay_us(100);
write_data(0x10); delay_us(100);
write_command(0x2a); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x7f); delay_us(100);
write_command(0x2b); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x00); delay_us(100);
write_data(0x9f); delay_us(100);
//Enable test command
write_command(0xF0); delay_us(100);
write_data(0x01); delay_us(100);
//Disable ram power save mode
write_command(0xF6); delay_us(100);
write_data(0x00); delay_us(100);
//65k mode
write_command(0x3A); delay_us(100);
write_data(0x05); delay_us(100);
//Display on
write_command(0x29); delay_us(100);
}
void dsp_single_colour(char DH,char DL)
{
char i,j;
//RamAdressSet();
for (i=0;i<160;i++)
for (j=0;j<128;j++)
LCD_DataWrite(DH,DL);
}
void main()
{
ADCON1 |= 0x0F; // Configure all ports with analog function as digital
ANSELB = 0; // Configure pins as digital
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
reset = 1;
cs = 1;
trisA = 0;
trisB = 0;
trisC = 0;
trisD = 0;
trisE = 0;
lcd_initial();
while(1)
{
write_command(0x2C);
dsp_single_colour(0xff,0xff);
delay_ms(500);
dsp_single_colour(0x00,0x00);
delay_ms(500);
dsp_single_colour(0xf8,0x00);
delay_ms(500);
dsp_single_colour(0x07,0xe0);
delay_ms(500);
dsp_single_colour(0x00,0x1f);
delay_ms(500);
}
}
I'm completely stuck, so it would be very grateful if someone could help me out.