求助关于如何用库 来玩原子的TFT的。
今早我调了一个早上还是没成功,一直都是白屏。
现在我觉得我改该的都改了,实在找不出哪里的问题。。想请教一下,改怎么办
void Lcd_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //把JTAG和SW口重映射为普通IO
GPIO_InitStructure.GPIO_Pin = Lcd_CS_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(Lcd_CS_PORT, &GPIO_InitStructure);
GPIO_SetBits(Lcd_CS_PORT,Lcd_CS_PIN);
GPIO_InitStructure.GPIO_Pin = Lcd_RS_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(Lcd_RS_PORT, &GPIO_InitStructure);
GPIO_SetBits(Lcd_RS_PORT,Lcd_RS_PIN);
GPIO_InitStructure.GPIO_Pin = Lcd_WR_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(Lcd_WR_PORT, &GPIO_InitStructure);
GPIO_SetBits(Lcd_WR_PORT,Lcd_WR_PIN);
GPIO_InitStructure.GPIO_Pin = Lcd_RD_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(Lcd_RD_PORT, &GPIO_InitStructure);
GPIO_SetBits(Lcd_RD_PORT,Lcd_RD_PIN);
GPIO_InitStructure.GPIO_Pin = Lcd_LED_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(Lcd_LED_PORT, &GPIO_InitStructure);
GPIO_SetBits(Lcd_RD_PORT,Lcd_LED_PIN);
Lcd_Data_Out();
delay_ms(50);
Lcd_WriteCMD(0x00,0x0001);
delay_ms(50);
DeviceCode = Lcd_ReadCMD(0x0000);
if(DeviceCode==0||DeviceCode==0XFFFF)//读到ID不正确
{
//可能是9341,尝试9341的ID读取
Lcd_WR_CMD(0XD3);
LCD_RD_DATA(); //dummy read
LCD_RD_DATA(); //读回0X00
DeviceCode=LCD_RD_DATA()&0XBF;//这里读回0XD3,实际是0X93才对.强制去掉第6位
DeviceCode<<=8;
DeviceCode|=LCD_RD_DATA();
}
// printf("\n\r LCD ID = 0x%x",DeviceCode);
if(DeviceCode==0X9341) //9341初始化
{
Lcd_WR_CMD(0xCF);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0xC1);
Lcd_WR_Data(0X30);
Lcd_WR_CMD(0xED);
Lcd_WR_Data(0x64);
Lcd_WR_Data(0x03);
Lcd_WR_Data(0X12);
Lcd_WR_Data(0X81);
Lcd_WR_CMD(0xE8);
Lcd_WR_Data(0x85);
Lcd_WR_Data(0x10);
Lcd_WR_Data(0x7A);
Lcd_WR_CMD(0xCB);
Lcd_WR_Data(0x39);
Lcd_WR_Data(0x2C);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x34);
Lcd_WR_Data(0x02);
Lcd_WR_CMD(0xF7);
Lcd_WR_Data(0x20);
Lcd_WR_CMD(0xEA);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x00);
Lcd_WR_CMD(0xC0); //Power control
Lcd_WR_Data(0x1B); //VRH[5:0]
Lcd_WR_CMD(0xC1); //Power control
Lcd_WR_Data(0x01); //SAP[2:0];BT[3:0]
Lcd_WR_CMD(0xC5); //VCM control
Lcd_WR_Data(0x30); //3F
Lcd_WR_Data(0x30); //3C
Lcd_WR_CMD(0xC7); //VCM control2
Lcd_WR_Data(0XB7);
Lcd_WR_CMD(0x36); // Memory Access Control
Lcd_WR_Data(0x48);
Lcd_WR_CMD(0x3A);
Lcd_WR_Data(0x55);
Lcd_WR_CMD(0xB1);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x1A);
Lcd_WR_CMD(0xB6); // Display Function Control
Lcd_WR_Data(0x0A);
Lcd_WR_Data(0xA2);
Lcd_WR_CMD(0xF2); // 3Gamma Function Disable
Lcd_WR_Data(0x00);
Lcd_WR_CMD(0x26); //Gamma curve selected
Lcd_WR_Data(0x01);
Lcd_WR_CMD(0xE0); //Set Gamma
Lcd_WR_Data(0x0F);
Lcd_WR_Data(0x2A);
Lcd_WR_Data(0x28);
Lcd_WR_Data(0x08);
Lcd_WR_Data(0x0E);
Lcd_WR_Data(0x08);
Lcd_WR_Data(0x54);
Lcd_WR_Data(0XA9);
Lcd_WR_Data(0x43);
Lcd_WR_Data(0x0A);
Lcd_WR_Data(0x0F);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x00);
Lcd_WR_CMD(0XE1); //Set Gamma
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x15);
Lcd_WR_Data(0x17);
Lcd_WR_Data(0x07);
Lcd_WR_Data(0x11);
Lcd_WR_Data(0x06);
Lcd_WR_Data(0x2B);
Lcd_WR_Data(0x56);
Lcd_WR_Data(0x3C);
Lcd_WR_Data(0x05);
Lcd_WR_Data(0x10);
Lcd_WR_Data(0x0F);
Lcd_WR_Data(0x3F);
Lcd_WR_Data(0x3F);
Lcd_WR_Data(0x0F);
Lcd_WR_CMD(0x2B);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x01);
Lcd_WR_Data(0x3f);
Lcd_WR_CMD(0x2A);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0x00);
Lcd_WR_Data(0xef);
Lcd_WR_CMD(0x11); //Exit Sleep
delay_ms(120);
Lcd_WR_CMD(0x29); //display on
}
}
这个是我的初始化
#define Lcd_LED_PORT GPIOC
#define Lcd_LED_PIN GPIO_Pin_10
#define Lcd_CS_PORT GPIOC
#define Lcd_CS_PIN GPIO_Pin_9
#define Lcd_RS_PORT GPIOC
#define Lcd_RS_PIN GPIO_Pin_8
#define Lcd_WR_PORT GPIOC
#define Lcd_WR_PIN GPIO_Pin_7
#define Lcd_RD_PORT GPIOC
#define Lcd_RD_PIN GPIO_Pin_6
#define Lcd_DATA_PORT GPIOB
#define Lcd_DATA_PIN GPIO_Pin_All
#define Lcd_CS_SET GPIO_SetBits(Lcd_CS_PORT, Lcd_CS_PIN) // 片选
#define Lcd_RS_SET GPIO_SetBits(Lcd_RS_PORT, Lcd_RS_PIN) // 数据
#define Lcd_WR_SET GPIO_SetBits(Lcd_WR_PORT, Lcd_WR_PIN) // 写
#define Lcd_RD_SET GPIO_SetBits(Lcd_RD_PORT, Lcd_RD_PIN) // 读
#define Lcd_CS_CLR GPIO_ResetBits(Lcd_CS_PORT, Lcd_CS_PIN) // 片选
#define Lcd_RS_CLR GPIO_ResetBits(Lcd_RS_PORT, Lcd_RS_PIN) // 命令
#define Lcd_WR_CLR GPIO_ResetBits(Lcd_WR_PORT, Lcd_WR_PIN) // 写
#define Lcd_RD_CLR GPIO_ResetBits(Lcd_RD_PORT, Lcd_RD_PIN) // 读
// PB0~15,作为数据线
#define Lcd_DATA_WR(x) GPIO_Write(Lcd_DATA_PORT, x) // 写数据
#define Lcd_DATA_RD GPIO_ReadInputData(Lcd_DATA_PORT) // 读数据
//选择LCD寄存器
#define Lcd_WR_CMD(val){\
Lcd_RS_CLR;\
Lcd_CS_CLR;\
Lcd_DATA_WR(val);\
Lcd_WR_CLR;\
Lcd_WR_SET;\
Lcd_CS_SET;\
}
//向LCD写寄存器值或颜色值
#define Lcd_WR_Data(val){\
Lcd_RS_SET;\
Lcd_CS_CLR;\
Lcd_DATA_WR(val);\
Lcd_WR_CLR;\
Lcd_WR_SET;\
Lcd_CS_SET;\
}
u16 LCD_RD_DATA(void)
{
u16 t;
Lcd_Data_In();
Lcd_DATA_WR(0x0000); //PB全部 上拉输入
Lcd_RS_SET;
Lcd_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
Lcd_CS_CLR;
if(DeviceCode==0X8989)delay_us(2);//FOR 8989,延时2us
Lcd_RD_SET;
t=Lcd_DATA_RD;
Lcd_CS_SET;
Lcd_Data_Out();
Lcd_DATA_WR(0xFFFF); //全部输出高
return t;
}
void Lcd_Data_In(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = Lcd_DATA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(Lcd_DATA_PORT, &GPIO_InitStructure);
//Lcd_DATA_WR(0xFFFF);
}
//配置数据为输出
void Lcd_Data_Out(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = Lcd_DATA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(Lcd_DATA_PORT, &GPIO_InitStructure);
//Lcd_DATA_WR(0xFFFF);
}
//写寄存器
void Lcd_WriteCMD(u8 CMD,u16 val)
{
Lcd_WR_CMD(CMD);
Lcd_WR_Data(val);
}
//读寄存器
u16 Lcd_ReadCMD(u8 CMD)
{
u16 i;
Lcd_WR_CMD(CMD);
Lcd_Data_In();
Lcd_RS_SET;
Lcd_CS_CLR;
Lcd_RD_CLR; //读取数据
delay_us(5);//给0x8989延时5us
Lcd_RD_SET;
i=Lcd_DATA_RD;
Lcd_CS_SET;
Lcd_Data_Out();
return i;
} |