如图,不知道哪里出错了,想刷屏一直刷不了。求各位大神给个意见。
/*
控制线:RS<->FSMC_A0; WR<->FSMC_NWE<->  D5; RD<->FSMC_NOE<->  D4; CS<->FSMC_NE4<->  G12; REST<->  A1 ;LED_A<->  C1
+-------------------+--------------------+------------------+------------------+
+ SRAM pins assignment +
+-------------------+--------------------+------------------+------------------+
| PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 |
| PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 |
| PD4 <-> FSMC_NOE | PE7 <-> FSMC_D4 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 |
| PD5 <-> FSMC_NWE | PE8 <-> FSMC_D5 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 |
| PD8 <-> FSMC_D13 | PE9 <-> FSMC_D6 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 |
| PD9 <-> FSMC_D14 | PE10 <-> FSMC_D7 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 |
| PD10 <-> FSMC_D15 | PE11 <-> FSMC_D8 | PF12 <-> FSMC_A6 | PG12<-> FSMC_NE4 |
| PD11 <-> FSMC_A16 | PE12 <-> FSMC_D9 | PF13 <-> FSMC_A7 |
| PD12 <-> FSMC_A17 | PE13 <-> FSMC_D10 | PF14 <-> FSMC_A8 |
| PD14 <-> FSMC_D0 | PE14 <-> FSMC_D11 | PF15 <-> FSMC_A9 |
| PD15 <-> FSMC_D1 | PE15 <-> FSMC_D12 |------------------+
+-------------------+--------------------+
*/
#include "ssd1963.h"
#define LCD_RAM *(__IO uint16_t *) (0x6c000001) //地址寄存器
#define LCD_REG *(__IO uint16_t *) (0x6c000000) //指令寄存器
unsigned int HDP=799;
unsigned int HT=1000;
unsigned int HPS=51;
unsigned int LPS=46;
unsigned char HPW=20;
unsigned int VDP=479;
unsigned int VT=625;
unsigned int VPS=22;
unsigned int FPS=23;
unsigned char VPW=3;
void write_reg(unsigned short reg)
{
LCD_REG = reg;
}
void write_data(unsigned short dat)
{
LCD_RAM = dat;
}
void write_cmd(unsigned short reg,unsigned short dat)
{
LCD_REG = reg;
LCD_RAM = dat;
}
unsigned short read_reg(void)
{
return LCD_REG;
}
unsigned short read_data(void)
{
return LCD_RAM;
}
static delay(unsigned int dl)
{
unsigned int i,y;
for(i = 0; i < dl; i++)
{
for(y = 0; y < 1000; y++);
}
}
void lcd_set_colpage_addr(unsigned int colS,unsigned int colE,unsigned int pageS,unsigned int pageE)
{
/* set column address */
write_reg(SSD1963_REG_SET_COL_ADDRESS);
/* start column */
write_data(colS >> 8);
write_data(colS & 0x00ff);
/* end column */
write_data(colE >> 8);
write_data(colE & 0x00ff);
/* set page address */
write_reg(SSD1963_REG_SET_PAGE_ADDRESS);
/* start page */
write_data(pageS >> 8);
write_data(pageS & 0x00ff);
/* end page */
write_data(pageE >> 8);
write_data(pageE & 0x00ff);
}
void lcd_clear(unsigned int color)
{
uint32_t index = 0;
lcd_set_colpage_addr(0, TFT_WIDTH-1, 0, TFT_HEIGHT-1);
write_reg(SSD1963_REG_WR_MEM_START);
while( index < (TFT_WIDTH * TFT_HEIGHT) )
{
//write_data(color);
write_data(color >> 8);
write_data(color & 0x00ff);
index++;
}
}
/*
控制线:RS<->FSMC_A0; WR<->FSMC_NWE<->  D5; RD<->FSMC_NOE<->  D4; CS<->FSMC_NE4<->  G12; REST<->  A1 ;LED_A<->  C1
+-------------------+--------------------+------------------+------------------+
+ SRAM pins assignment +
+-------------------+--------------------+------------------+------------------+
| PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 |
| PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 |
| PD4 <-> FSMC_NOE | PE7 <-> FSMC_D4 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 |
| PD5 <-> FSMC_NWE | PE8 <-> FSMC_D5 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 |
| PD8 <-> FSMC_D13 | PE9 <-> FSMC_D6 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 |
| PD9 <-> FSMC_D14 | PE10 <-> FSMC_D7 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 |
| PD10 <-> FSMC_D15 | PE11 <-> FSMC_D8 | PF12 <-> FSMC_A6 | PG12<-> FSMC_NE4 |
| PD11 <-> FSMC_A16 | PE12 <-> FSMC_D9 | PF13 <-> FSMC_A7 |
| PD12 <-> FSMC_A17 | PE13 <-> FSMC_D10 | PF14 <-> FSMC_A8 |
| PD14 <-> FSMC_D0 | PE14 <-> FSMC_D11 | PF15 <-> FSMC_A9 |
| PD15 <-> FSMC_D1 | PE15 <-> FSMC_D12 |------------------+
+-------------------+--------------------+
*/
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
FSMC_NORSRAMTimingInitTypeDef writeTiming;
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); //使能FSMC时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG,ENABLE);//使能PORTB,D,E,G以及AFIO复用功能时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 推挽输出 复位
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PC1 推挽输出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//PORTD复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15; // //PORTD复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//PORTE复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // //PORTD复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//PORTF福永推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
//PORTG复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //复用推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间(ADDSET)为2个HCLK 1/96M=21ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0x0f; // 数据保存时间为16个HCLK
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK
writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
writeTiming.FSMC_DataSetupTime = 0x04; ////数据保存时间为5个HCLK
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// 使用NE4
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存储器写使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读时序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1
GPIO_SetBits(GPIOG,GPIO_Pin_12); // 置位cs
GPIO_SetBits(GPIOA,GPIO_Pin_1); // 置位REST
delay(10);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //复位REST
delay(10);
GPIO_SetBits(GPIOA,GPIO_Pin_1); //置位REST
GPIO_SetBits(GPIOD,GPIO_Pin_4); //置位RD
GPIO_SetBits(GPIOD,GPIO_Pin_5); //置位WR
delay(10);
GPIO_SetBits(GPIOG,GPIO_Pin_12); //复位CS
以下不懂是怎么写的,复制网上的ssd1963的初始化函数。
#define LCD_WR_REG write_reg
#define LCD_WR_DATA write_data
#define Delay_10ms delay
/* 命令E2H Set PLL MN*/
LCD_WR_REG(0x00E2);
/* 参数1 设置VCO频率
SSD1963外部晶振频率为10MHz,VCO要求大有250MHz
36倍频,最后得360MHz*/
LCD_WR_DATA(0x0023);
/* 参数2 设置PLL频率
M=2, PLL=360/(M+1)=120MHz*/
LCD_WR_DATA(0x0002);
/* 参数3 使设置生效*/
LCD_WR_DATA(0x0004);
LCD_WR_REG(0x00E0); /* Set PLL */
LCD_WR_DATA(0x0001); /* PLL enable */
Delay_10ms(10); /* 延时100ms */
LCD_WR_REG(0x00E0);
LCD_WR_DATA(0x0003);
Delay_10ms(10);
LCD_WR_REG(0x0001); /* 软件复位命令,没有参数 */
Delay_10ms(10);
LCD_WR_REG(0x00E6); /* Set LSHIFT Frequency */
LCD_WR_DATA(0x0004);
LCD_WR_DATA(0x0093);
LCD_WR_DATA(0x00e0);
LCD_WR_REG(0x00B0); /*命令Set LCD Mode */
LCD_WR_DATA(0x0000);
LCD_WR_DATA(0x0000);
LCD_WR_DATA((HDP>>8)&0X00FF); /*Set the horizontal panel size*/
LCD_WR_DATA(HDP&0X00FF);
LCD_WR_DATA((VDP>>8)&0X00FF); /*Set the horizontal panel size*/
LCD_WR_DATA(VDP&0X00FF);
LCD_WR_DATA(0x0000);
LCD_WR_REG(0x00B4); /*Set Horizontal Period */
LCD_WR_DATA((HT>>8)&0X00FF); //Set HT
LCD_WR_DATA(HT&0X00FF);
LCD_WR_DATA((HPS>>8)&0X00FF); //Set HPS
LCD_WR_DATA(HPS&0X00FF);
LCD_WR_DATA(HPW); //Set HPW
LCD_WR_DATA((LPS>>8)&0X00FF); //Set HPS
LCD_WR_DATA(LPS&0X00FF);
LCD_WR_DATA(0x0000);
LCD_WR_REG(0x00B6); //VSYNC
LCD_WR_DATA((VT>>8)&0X00FF); //Set VT
LCD_WR_DATA(VT&0X00FF);
LCD_WR_DATA((VPS>>8)&0X00FF); //Set VPS
LCD_WR_DATA(VPS&0X00FF);
LCD_WR_DATA(VPW); //Set VPW
LCD_WR_DATA((FPS>>8)&0X00FF); //Set FPS
LCD_WR_DATA(FPS&0X00FF);
LCD_WR_REG(0x00BA);
LCD_WR_DATA(0x0005); //GPIO[3:0] out 1
LCD_WR_REG(0x00B8);
LCD_WR_DATA(0x0007); //GPIO3=input, GPIO[2:0]=output
LCD_WR_DATA(0x0001); //GPIO0 normal
LCD_WR_REG(0x0036); //rotation
LCD_WR_DATA(0x0008|(0<<5));
LCD_WR_REG(0x00F0); //pixel data interface
LCD_WR_DATA(0x0003);
LCD_WR_REG(0x00F1); //pixel data interface
LCD_WR_DATA(0x0003);
/* write_reg(0x0021); //进入图形颜色翻转模式
write_reg(0x00BC);//重要
write_data(0x0080);//对比度
write_data(0x0080);//亮度
write_data(0x0080);//饱和度值
write_data(0x0001);//处理机允许
*/
Delay_10ms(50);
lcd_clear(BLACK);
LCD_WR_REG(0x0029); //display on
LCD_WR_REG(0x00BE); //set PWM for B/L
LCD_WR_DATA(0x0006);
LCD_WR_DATA(0x0080);
LCD_WR_DATA(0x0001);
LCD_WR_DATA(0x00f0);
LCD_WR_DATA(0x0000);
LCD_WR_DATA(0x0000);
LCD_WR_REG(0x00d0);//设置动态背光控制配置
LCD_WR_DATA(0x000d);
GPIO_SetBits(GPIOC,GPIO_Pin_1);
}
|