📄 lcd.c
字号:
/*
*******************************************************************************
* file name: lcd.c
* description: lcd driver
* author: xzChen(chxzh123@163.com)
* QQ / msn: 36725175 / chxzh123@hotmail.com
*******************************************************************************
*/
#ifndef __LCD_C__
#define __LCD_C__
#include "Includes.h"
#if (LCD_TYPE == LTV350QVF04)
#define INDEX 1
#define INSTR 0
#define set_lcd_scl() rGPCDAT |= (1 << 8)
#define clr_lcd_scl() rGPCDAT &= ~(1 << 8)
#define set_lcd_cs() rGPDDAT |= (1 << 0)
#define clr_lcd_cs() rGPDDAT &= ~(1 << 0)
#define set_lcd_sda() rGPCDAT |= (1 << 10)
#define clr_lcd_sda() rGPCDAT &= ~(1 << 10)
#define set_lcd_rst() rGPDDAT |= (1 << 9)
#define clr_lcd_rst() rGPDDAT &= ~(1 << 9)
void SPI_Send(U08 type,U16 datas)
{
U16 S_data;
U08 i,orders;
set_lcd_scl();
set_lcd_sda();
clr_lcd_cs();
if(type)
orders = 0x74;
else
orders = 0x76;
for(i=0; i<8; i++)
{
clr_lcd_scl();
if((orders&0x80) == 0x80)
set_lcd_sda();
else
clr_lcd_sda();
Delay(140);
set_lcd_scl();
orders <<= 1;
}
S_data = datas;
for(i=0; i<16; i++)
{
clr_lcd_scl();
if((S_data&0x8000)==0x8000)
set_lcd_sda();
else
clr_lcd_sda();
Delay(140);
set_lcd_scl();
S_data <<= 1;
}
Delay(140);
set_lcd_cs();
set_lcd_scl();
set_lcd_sda();
return;
}
void LCD_Write_Regdata(U16 reg,U16 datas)
{
SPI_Send(INDEX,reg);
SPI_Send(INSTR,datas);
}
void LCD_START(void)
{
LCD_Write_Regdata(9,0); //power On reset display off state
Delay(700);
LCD_Write_Regdata(9,0x4000);
LCD_Write_Regdata(0x0a,0x2000);
LCD_Write_Regdata(9,0x4055);
Delay(3500);
LCD_Write_Regdata(1,0x409d);
LCD_Write_Regdata(2,0x0204);
LCD_Write_Regdata(3,0x0100);
LCD_Write_Regdata(4,0x3000);
LCD_Write_Regdata(5,0x4003);
LCD_Write_Regdata(6,0x0020);
LCD_Write_Regdata(7,0x0020);
LCD_Write_Regdata(8,0x0c00);
LCD_Write_Regdata(10,0x0103);
LCD_Write_Regdata(11,0x0301);
LCD_Write_Regdata(12,0x1f0f);
LCD_Write_Regdata(13,0x1f0f);
LCD_Write_Regdata(14,0x0707);
LCD_Write_Regdata(15,0x0307);
LCD_Write_Regdata(16,0x0707);
LCD_Write_Regdata(17,0x0000);
LCD_Write_Regdata(18,0x0004);
LCD_Write_Regdata(19,0x0000);
Delay(1400);
LCD_Write_Regdata(9,0x4a55);
LCD_Write_Regdata(5,0x5003);
}
#endif
void SPI_Init(void)
{
//nRST
rGPDCON &= ~(3 << 18);
rGPDCON |= (1 << 18);
rGPDDAT &= ~(1 << 9);
#if (LCD_TYPE == LTV350QVF04)
//nCS
rGPDCON &= ~(3 << 0);
rGPDCON |= (1 << 0);
rGPDDAT |= (1 << 0);
//SCL
rGPCCON &= ~(3 << 16);
rGPCCON |= (1 << 16);
rGPCDAT |= (1 << 8);
//SDI
rGPCCON &= ~(3 << 20);
rGPCCON |= (1 << 20);
rGPCDAT |= (1 << 10);
#endif
Delay(3500);
rGPDDAT |= (1 << 9);
// rGPDDAT &= ~(1 << 9);
Delay(1400);
#if (LCD_TYPE == LTV350QVF04)
LCD_START();
#endif
Delay(1400);
}
void lcd_init(void)
{
U32 i,j,times;
UNION tmp;
#if (LCD_TYPE == LTS350Q1)
UartPutStr(SHL_PRT,"LCD LTS350Q1\r\n");
rTCONSEL = (rTCONSEL|(1<<4))&(~1);
#elif (LCD_TYPE == LTV350QVF04)
UartPutStr(SHL_PRT,"LCD LTV350QVF04\r\n");
rGPGCON &= ~(3 << 8); // Set LCD_PWREN as output
rGPGCON |= (1 << 8);
rGPGDAT |= (1 << 4); // set GPG4 to enable LTC3440 LCD DCDC
// LCD VDEN
rGPCCON &= ~(3 << 8);
rGPCCON |= (1 << 8);
rGPCDAT |= (1 << 4);
// BL open
rGPCCON &= ~(3 << 12); // Set LCD_PWREN as output
rGPCCON |= (1 << 12);
rGPCDAT |= (1 << 6); // set GPC6 to enable LTC3440 LCD DCDC
SPI_Init();
rTCONSEL = 0;
#elif (LCD_TYPE == PHE350Q1)
rGPGCON &= ~(3 << 8); // Set LCD_PWREN as output
rGPGCON |= (1 << 8);
rGPGDAT |= (1 << 4); // set GPG4 to enable LTC3440 LCD DCDC
// LCD VDEN
rGPCCON &= ~(3 << 8);
rGPCCON |= (1 << 8);
rGPCDAT |= (1 << 4);
// BL open
rGPCCON &= ~(3 << 12); // Set LCD_PWREN as output
rGPCCON |= (1 << 12);
rGPCDAT |= (1 << 6); // set GPC6 to enable LTC3440 LCD DCDC
SPI_Init();
rTCONSEL = 0;
#elif (LCD_TYPE == MT502TML8B)
rGPGCON &= ~(3 << 8); // Set LCD_PWREN as output
rGPGCON |= (1 << 8);
rGPGDAT |= (1 << 4); // set GPG4 to enable LTC3440 LCD DCDC
// LCD VDEN
rGPCCON &= ~(3 << 8);
rGPCCON |= (1 << 8);
rGPCDAT |= (1 << 4);
// BL open
rGPCCON &= ~(3 << 12); // Set LCD_PWREN as output
rGPCCON |= (1 << 12);
rGPCDAT |= (1 << 6); // set GPC6 to enable LTC3440 LCD DCDC
SPI_Init();
rTCONSEL = 0;
#elif (LCD_TYPE == PHE480272)
UartPutStr(SHL_PRT,"LCD PHE480272\r\n");
rGPGCON &= ~(3 << 8); // Set LCD_PWREN as output
rGPGCON |= (1 << 8);
rGPGDAT |= (1 << 4); // set GPG4 to enable LTC3440 LCD DCDC
// LCD VDEN
rGPCCON &= ~(3 << 8);
rGPCCON |= (1 << 8);
rGPCDAT |= (1 << 4);
// rGPCDAT &= ~(1 << 4);
// BL open
rGPCCON &= ~(3 << 12); // Set LCD_PWREN as output
rGPCCON |= (1 << 12);
rGPCDAT |= (1 << 6); // set GPC6 to enable LTC3440 LCD DCDC
SPI_Init();
rTCONSEL = 0;
#else
UartPutStr(SHL_PRT,"LCD error\r\n");
#endif
UartPutStr(SHL_PRT,"LCD test\r\n");
rLCDCON1 = (CLKVAL << 8) |
(MMODE << 7) |
(PNRMODE << 5) |
(BPPMODE << 1) |
(0 << 0) ;
rLCDCON2 = (VBPD << 24) |
((LCD_YSIZE-1) << 14) |
(VFPD << 6) |
(VSPW << 0) ;
rLCDCON3 = (HBPD << 19) |
((LCD_XSIZE-1) << 8) |
(HFPD << 0) ;
rLCDCON4 = (MVAL << 8) |
(HSPW << 0) ;
rLCDCON5 = (BPP24BL << 12) |
(FRM565 << 11) |
(INVVCLK << 10) |
(INVVLINE << 9) |
(INVVFRAME << 8) |
(INVVD << 7) |
(INVVDEN << 6) |
(INVPWREN << 5) |
(INVENDLINE << 4) |
(PWREN << 3) |
(ENLEND << 2) |
(BSWP << 1) |
(HWSWP << 0) ;
rLCDSADDR1 = (((U32)DispBuf >> 22) << 21) |
M5D((U32)DispBuf >> 1);
rLCDSADDR2 = M5D(((U32)DispBuf + (LCD_XSIZE * LCD_YSIZE * 4)) >> 1);
rLCDSADDR3 = (((LCD_XSIZE*2 - LCD_XSIZE)/1) << 11) | (LCD_XSIZE/1);
rLCDINTMSK |= (3);
rTPAL = 0x0;
rLCDCON1 |= 1;
clrdevice();
set_backlight();
rGPBDAT &= ~(1 << 3);
// gPrintf(10,10,dispclr,0,"123456");
// while(1);
times = 0x0E000000;
//while(1)
//{
for (i=0; i<240; i++)
{
for (j=0; j<160; j++)
{
tmp.B08[2] = gImage_Welcome[i*2*320 + 4*j];
tmp.B08[3] = gImage_Welcome[i*2*320 + 4*j+1];
tmp.B08[0] = gImage_Welcome[i*2*320 + 4*j+2];
tmp.B08[1] = gImage_Welcome[i*2*320 + 4*j+3];
DispBuf[i][j] = tmp.B32;
}
}
/*
Delay(times);
for (i=0; i<240; i++)
{
for (j=0; j<160; j++)
{
tmp.B08[2] = gImage_p1[i*2*320 + 4*j];
tmp.B08[3] = gImage_p1[i*2*320 + 4*j+1];
tmp.B08[0] = gImage_p1[i*2*320 + 4*j+2];
tmp.B08[1] = gImage_p1[i*2*320 + 4*j+3];
DispBuf[i][j] = tmp.B32;
}
}
for (i=0; i<240; i++)
{
for (j=0; j<160; j++)
{
tmp.B08[2] = gImage_p1[i*2*320 + 4*j];
tmp.B08[3] = gImage_p1[i*2*320 + 4*j+1];
tmp.B08[0] = gImage_p1[i*2*320 + 4*j+2];
tmp.B08[1] = gImage_p1[i*2*320 + 4*j+3];
DispBuf[i][j] = tmp.B32;
}
}
Delay(times);
for (i=0; i<240; i++)
{
for (j=0; j<160; j++)
{
tmp.B08[2] = gImage_p2[i*2*320 + 4*j];
tmp.B08[3] = gImage_p2[i*2*320 + 4*j+1];
tmp.B08[0] = gImage_p2[i*2*320 + 4*j+2];
tmp.B08[1] = gImage_p2[i*2*320 + 4*j+3];
DispBuf[i][j] = tmp.B32;
}
}
Delay(times);
for (i=0; i<240; i++)
{
for (j=0; j<160; j++)
{
tmp.B08[2] = gImage_p3[i*2*320 + 4*j];
tmp.B08[3] = gImage_p3[i*2*320 + 4*j+1];
tmp.B08[0] = gImage_p3[i*2*320 + 4*j+2];
tmp.B08[1] = gImage_p3[i*2*320 + 4*j+3];
DispBuf[i][j] = tmp.B32;
}
}
Delay(times);
for (i=0; i<240; i++)
{
for (j=0; j<160; j++)
{
tmp.B08[2] = gImage_p4[i*2*320 + 4*j];
tmp.B08[3] = gImage_p4[i*2*320 + 4*j+1];
tmp.B08[0] = gImage_p4[i*2*320 + 4*j+2];
tmp.B08[1] = gImage_p4[i*2*320 + 4*j+3];
DispBuf[i][j] = tmp.B32;
}
}
Delay(times);
//}
*/
/*
for (i=0; i<272; i++)
{
for (j=0; j<240; j++)
{
tmp.B08[2] = gImage_Welcome[i*2*480 + 4*j];
tmp.B08[3] = gImage_Welcome[i*2*480 + 4*j+1];
tmp.B08[0] = gImage_Welcome[i*2*480 + 4*j+2];
tmp.B08[1] = gImage_Welcome[i*2*480 + 4*j+3];
DispBuf[i][j] = tmp.B32;
}
}
while(1);
*/
}
void put_pixel(U32 x,U32 y,U32 color,U08 type)
{
UNION tmp;
if ((x < SCR_XSIZE) && (y < SCR_YSIZE))
{
switch (type)
{
case 8: //U08 data
#if (HWSWP == 1)
DispBuf[(y)][(x)/2] =(DispBuf[(y)][x/2] &
~(0xffff0000 >> ((1-(x)%2))*16) |
((color & 0x0000ffff) << ((x)%2)*16));
#else
DispBuf[(y)][(x)/2] =(DispBuf[(y)][x/2] &
~(0xffff0000 >> ((x)%2)*16) |
(color & 0x0000ffff) << ((1-((x)%2))*16));
#endif
break;
case 16: //U16 data
tmp.B32 = DispBuf[y][x/2];
#if (HWSWP == 1)
if (x%2)
tmp.B16[0] = color & 0xffff;
else
tmp.B16[1] = color & 0xffff;
#else
if (x%2)
tmp.B16[1] = color & 0xffff;
else
tmp.B16[0] = color & 0xffff;
#endif
DispBuf[y][x/2] = tmp.B32;
break;
case 32: //U32 data
DispBuf[y][x] = color;
break;
default:
break;
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -