Files
retrobsd/sys/pic32/gpanel/nt35702.c

331 lines
7.4 KiB
C

#define LCD_RD A0
#define LCD_WR A1
#define LCD_RS A2
#define LCD_CS A3
#define LCD_REST A4
void Lcd_Writ_Bus(unsigned char VH)
{
unsigned int i,temp,data;
data=VH;
for (i=8; i<=9; i++) {
temp=(data&0x01);
if (temp)
digitalWrite(i,HIGH);
else
digitalWrite(i,LOW);
data=data>>1;
}
for (i=2; i<=7; i++) {
temp=(data&0x01);
if (temp)
digitalWrite(i,HIGH);
else
digitalWrite(i,LOW);
data=data>>1;
}
digitalWrite(LCD_WR,LOW);
digitalWrite(LCD_WR,HIGH);
}
void Lcd_Write_Com(unsigned char VH)
{
digitalWrite(LCD_RS,LOW);
Lcd_Writ_Bus(VH);
}
void Lcd_Write_Data(unsigned char VH)
{
digitalWrite(LCD_RS,HIGH);
Lcd_Writ_Bus(VH);
}
void Lcd_Write_Com_Data(unsigned char com,unsigned char dat)
{
Lcd_Write_Com(com);
Lcd_Write_Data(dat);
}
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
Lcd_Write_Com_Data(0x2a,x1>>8);
Lcd_Write_Com_Data(0x2a,x1);
Lcd_Write_Com_Data(0x2a,x2>>8);
Lcd_Write_Com_Data(0x2a,x2);
Lcd_Write_Com_Data(0x2b,y1>>8);
Lcd_Write_Com_Data(0x2b,y1);
Lcd_Write_Com_Data(0x2b,y2>>8);
Lcd_Write_Com_Data(0x2b,y2);
Lcd_Write_Com(0x2c);
}
void Lcd_Init(void)
{
digitalWrite(LCD_REST, HIGH);
delay(5);
digitalWrite(LCD_REST, LOW);
delay(15);
digitalWrite(LCD_REST, HIGH);
delay(15);
digitalWrite(LCD_CS, HIGH);
digitalWrite(LCD_WR, HIGH);
digitalWrite(LCD_CS, LOW); //CS
Lcd_Write_Com(0x01);// Software Reset
delay(20);
Lcd_Write_Com(0x11);//Sleep Out
delay(120);
Lcd_Write_Com(0xc2);//Power Control 3
Lcd_Write_Data(0x05);//APA2 APA1 APA0 Large
Lcd_Write_Data(0x00);//Step-up cycle in Booster circuit 1
//Step-up cycle in Booster circuit 2,3
Lcd_Write_Com(0xc3);//Power Control 4
Lcd_Write_Data(0x05);//APA2 APA1 APA0 Large
Lcd_Write_Data(0x00);//Step-up cycle in Booster circuit 1
//Step-up cycle in Booster circuit 2,3
Lcd_Write_Com(0xc4);//Power Control 5
Lcd_Write_Data(0x05);//APA2 APA1 APA0 Large
Lcd_Write_Data(0x00);//Step-up cycle in Booster circuit 1
//Step-up cycle in Booster circuit 2,3
Lcd_Write_Com(0x3A);
Lcd_Write_Data(0x55);
Lcd_Write_Com(0xD7);
Lcd_Write_Data(0x40);
Lcd_Write_Data(0xE0);
Lcd_Write_Com(0xFD);
Lcd_Write_Data(0x06);
Lcd_Write_Data(0x11);
Lcd_Write_Com(0xFA);
Lcd_Write_Data(0x38);
Lcd_Write_Data(0x20);
Lcd_Write_Data(0x1C);
Lcd_Write_Data(0x10);
Lcd_Write_Data(0x37);
Lcd_Write_Data(0x12);
Lcd_Write_Data(0x22);
Lcd_Write_Data(0x1E);
Lcd_Write_Com(0xC0);//Set GVDD
Lcd_Write_Data(0x05);
Lcd_Write_Com(0xC5);//Set Vcom
Lcd_Write_Data(0x60);
Lcd_Write_Data(0x00);
Lcd_Write_Com(0xC7);//Set VCOM-OFFSET
Lcd_Write_Data(0xA9);// 可以微调改善flicker
Lcd_Write_Com(0x36);//Memory data access control
Lcd_Write_Data(0xC8);//MY MX MV ML RGB MH 0 0
////Gamma//////////////////
Lcd_Write_Com(0xE0);//E0H Set
Lcd_Write_Data(0x23);
Lcd_Write_Data(0x23);
Lcd_Write_Data(0x24);
Lcd_Write_Data(0x02);
Lcd_Write_Data(0x08);
Lcd_Write_Data(0x0F);
Lcd_Write_Data(0x35);
Lcd_Write_Data(0x7B);
Lcd_Write_Data(0x43);
Lcd_Write_Data(0x0E);
Lcd_Write_Data(0x1F);
Lcd_Write_Data(0x25);
Lcd_Write_Data(0x10);
Lcd_Write_Data(0x16);
Lcd_Write_Data(0x31);
Lcd_Write_Com(0xE1);//E1H Set
Lcd_Write_Data(0x0D);
Lcd_Write_Data(0x28);
Lcd_Write_Data(0x2E);
Lcd_Write_Data(0x0B);
Lcd_Write_Data(0x11);
Lcd_Write_Data(0x12);
Lcd_Write_Data(0x3E);
Lcd_Write_Data(0x59);
Lcd_Write_Data(0x4C);
Lcd_Write_Data(0x10);
Lcd_Write_Data(0x26);
Lcd_Write_Data(0x2B);
Lcd_Write_Data(0x1B);
Lcd_Write_Data(0x1B);
Lcd_Write_Data(0x1B);
Lcd_Write_Com(0x29);//display on
Lcd_Write_Com(0x2c);//Memory Write
}
void H_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c)
{
unsigned int i, j;
Lcd_Write_Com(0x02c); //write_memory_start
digitalWrite(LCD_RS, HIGH);
digitalWrite(LCD_CS, LOW);
l = l+x;
Address_set(x,y,l,y);
j = l*2;
for(i=1;i<=j;i++)
{
Lcd_Write_Data(c>>8);
Lcd_Write_Data(c);
}
digitalWrite(LCD_CS, HIGH);
}
void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c)
{
unsigned int i, j;
Lcd_Write_Com(0x02c); //write_memory_start
digitalWrite(LCD_RS, HIGH);
digitalWrite(LCD_CS, LOW);
l = l+y;
Address_set(x,y,x,l);
j = l*2;
for(i=1;i<=j;i++)
{
Lcd_Write_Data(c>>8);
Lcd_Write_Data(c);
}
digitalWrite(LCD_CS, HIGH);
}
void Rect(unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int c)
{
H_line(x , y , w, c);
H_line(x , y+h, w, c);
V_line(x , y , h, c);
V_line(x+w, y , h, c);
}
void Rectf(unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int c)
{
unsigned int i;
for (i=0; i<h; i++) {
H_line(x , y , w, c);
H_line(x , y+i, w, c);
}
}
int RGB(int r, int g, int b)
{
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}
void LCD_Clear(unsigned int j)
{
unsigned int i, m;
Address_set(0, 0, 320, 240);
Lcd_Write_Com(0x02c); //write_memory_start
digitalWrite(LCD_RS,HIGH);
digitalWrite(LCD_CS,LOW);
for (i=0; i<320; i++) {
for (m=0; m<240; m++) {
//ch=((fcolorr&248)|fcolorg>>5);
//cl=((fcolorg&28)<<3|fcolorb>>3);
Lcd_Write_Data(j>>8);
Lcd_Write_Data(j);
}
}
digitalWrite(LCD_CS,HIGH);
}
void draw_Pixel(int x,int y, unsigned int c)
{
Address_set(x, y, x, y);
Lcd_Write_Data(c >> 8);
Lcd_Write_Data(c);
}
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
void draw_Hline(int x, int y, int l,unsigned int c)
{
Address_set(x, y, x+l, y);
for (int i=0; i<l+1; i++)
{
Lcd_Write_Data(c >> 8);
Lcd_Write_Data(c);
}
}
void draw_Vline(int x, int y, int l, unsigned int c)
{
Address_set(x, y, x, y+l);
for (int i=0; i<l+1; i++)
{
Lcd_Write_Data(c);
Lcd_Write_Data(c);
}
}
void RoundRect(int x1, int y1, int x2, int y2,unsigned int c)
{
Lcd_Write_Com(0x02c); //write_memory_start
digitalWrite(LCD_RS,HIGH);
digitalWrite(LCD_CS,LOW);
int tmp;
if (x1 > x2) {
swap(x1, x2);
}
if (y1 > y2) {
swap(y1, y2);
}
if ((x2-x1 > 4 && (y2-y1) > 4) {
draw_Pixel(x1+1,y1+1,c);
draw_Pixel(x2-1,y1+1,c);
draw_Pixel(x1+1,y2-1,c);
draw_Pixel(x2-1,y2-1,c);
draw_Hline(x1+2, y1, x2-x1-4,c);
draw_Hline(x1+2, y2, x2-x1-4,c);
draw_Vline(x1, y1+2, y2-y1-4,c);
draw_Vline(x2, y1+2, y2-y1-4,c);
}
}
void setup()
{
for (int p=2; p<10; p++)
pinMode(p, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
Lcd_Init();
//LCD_Clear(RGB(255, 0, 0));
//LCD_Clear(RGB(255, 255, 0));
//LCD_Clear(RGB(255, 0, 255));
//LCD_Clear(RGB(0, 255, 255));
//LCD_Clear(RGB(0, 255, 0));
}