#define SET_LCD_RDS LCD_RDS_PORT->BSRR = LCD_RDS #define RESET_LCD_RDS LCD_RDS_PORT->BRR = LCD_RDS #define SET_LCD_WR LCD_WR_PORT->BSRR = LCD_WR #define RESET_LCD_WR LCD_WR_PORT->BRR = LCD_WR #define SET_LCD_RST LCD_RST_PORT->BSRR = LCD_RST #define RESET_LCD_RST LCD_RST_PORT->BRR = LCD_RST void SSD1963_Init (void) { uint16_t HDP=799; uint16_t HT=928; uint16_t HPS=46; uint16_t LPS=15; uint8_t HPW=48; uint16_t VDP=479; uint16_t VT=525; uint16_t VPS=16; uint16_t FPS=8; uint8_t VPW=16; RESET_LCD_RST; delay_ms(5); SET_LCD_RST; delay_ms(5); SSD1963_WriteCommand(0x00E2); //PLL multiplier, set PLL clock to 120M SSD1963_WriteData(0x0023); //N=0x36 for 6.5M, 0x23 for 10M crystal SSD1963_WriteData(0x0002); SSD1963_WriteData(0x0004); SSD1963_WriteCommand(0x00E0); // PLL enable SSD1963_WriteData(0x0001); delay_ms(1); SSD1963_WriteCommand(0x00E0); SSD1963_WriteData(0x0003); delay_ms(5); SSD1963_WriteCommand(0x0001); // software reset delay_ms(5); SSD1963_WriteCommand(0x00E6); //PLL setting for PCLK, depends on resolution SSD1963_WriteData(0x0003); SSD1963_WriteData(0x00ff); SSD1963_WriteData(0x00ff); SSD1963_WriteCommand(0x00B0); //LCD SPECIFICATION SSD1963_WriteData(0x0000); SSD1963_WriteData(0x0000); SSD1963_WriteData((HDP>>8)&0X00FF); //Set HDP SSD1963_WriteData(HDP&0X00FF); SSD1963_WriteData((VDP>>8)&0X00FF); //Set VDP SSD1963_WriteData(VDP&0X00FF); SSD1963_WriteData(0x0000); SSD1963_WriteCommand(0x00B4); //HSYNC SSD1963_WriteData((HT>>8)&0X00FF); //Set HT SSD1963_WriteData(HT&0X00FF); SSD1963_WriteData((HPS>>8)&0X00FF); //Set HPS SSD1963_WriteData(HPS&0X00FF); SSD1963_WriteData(HPW); //Set HPW SSD1963_WriteData((LPS>>8)&0X00FF); //Set HPS SSD1963_WriteData(LPS&0X00FF); SSD1963_WriteData(0x0000); SSD1963_WriteCommand(0x00B6); //VSYNC SSD1963_WriteData((VT>>8)&0X00FF); //Set VT SSD1963_WriteData(VT&0X00FF); SSD1963_WriteData((VPS>>8)&0X00FF); //Set VPS SSD1963_WriteData(VPS&0X00FF); SSD1963_WriteData(VPW); //Set VPW SSD1963_WriteData((FPS>>8)&0X00FF); //Set FPS SSD1963_WriteData(FPS&0X00FF); SSD1963_WriteCommand(0x00BA); SSD1963_WriteData(0x0005); //GPIO[3:0] out 1 SSD1963_WriteCommand(0x00B8); SSD1963_WriteData(0x0007); //GPIO3=input, GPIO[2:0]=output SSD1963_WriteData(0x0001); //GPIO0 normal SSD1963_WriteCommand(0x0036); //rotation SSD1963_WriteData(0x0000); SSD1963_WriteCommand(0x00F0); //pixel data interface #if DATAPIXELWIDTH==16 SSD1963_WriteData(0x0003); //16 bit (565) #endif #if DATAPIXELWIDTH==9 SSD1963_WriteData(0x0006); // 9 bit #endif #if DATAPIXELWIDTH==8 SSD1963_WriteData(0x0000); // 8 bit #endif delay_ms(5); SSD1963_WriteCommand(0x0029); //display on SSD1963_WriteCommand(0x00d0); SSD1963_WriteData(0x000d); } void SSD1963_WriteCommand(uint16_t commandToWrite) { LCD_DATA_PORT->ODR = commandToWrite; RESET_LCD_RDS; RESET_LCD_WR; SET_LCD_WR; } void SSD1963_WriteData(uint16_t dataToWrite) { LCD_DATA_PORT->ODR = dataToWrite; SET_LCD_RDS; RESET_LCD_WR; SET_LCD_WR; }
tick_init(); // lcd_port_init(); // - SSD1963_Init(); //
// Fills whole screen specified color void SSD1963_SetArea(uint16_t x1, uint16_t x2, uint16_t y1, uint16_t y2) { SSD1963_WriteCommand(0x002a); SSD1963_WriteData((x1 >> 8) & 0xff); SSD1963_WriteData(x1 & 0xff); SSD1963_WriteData((x2 >> 8) & 0xff); SSD1963_WriteData(x2 & 0xff); SSD1963_WriteCommand(0x002a); SSD1963_WriteData((y1 >> 8) & 0xff); SSD1963_WriteData(y1 & 0xff); SSD1963_WriteData((y2 >> 8) & 0xff); SSD1963_WriteData(y2 & 0xff); } #if DATAPIXELWIDTH==16 void SSD1963_WriteDataPix(uint16_t pixdata) { LCD_DATA_PORT->ODR = pixdata; SET_LCD_RDS; RESET_LCD_WR; SET_LCD_WR; } #endif #if DATAPIXELWIDTH==9 void SSD1963_WriteDataPix(uint16_t pixdata) { LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & 0xfe00) | ((pixdata >> 8) & 0x000f) | ((pixdata >> 7) & 0x01f0); SET_LCD_RDS; RESET_LCD_WR; SET_LCD_WR; LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & 0xfe00) | ((pixdata << 1) & 0x01f7) | (pixdata & 0x0001); RESET_LCD_WR; SET_LCD_WR; } #endif #if DATAPIXELWIDTH==8 void SSD1963_WriteDataPix(uint16_t pixdata) { LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & 0xff00) | ((pixdata >> 8) & 0x00f8) | ((pixdata >> 9) & 0x0004); SET_LCD_RDS; RESET_LCD_WR; SET_LCD_WR; LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & 0xff00) | ((pixdata >> 3) & 0x00fc); RESET_LCD_WR; SET_LCD_WR; LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & 0xff00) | ((pixdata << 3) & 0x00f8) | ((pixdata << 2) & 0x0004); RESET_LCD_WR; SET_LCD_WR; } #endif void SSD1963_ClearScreen(uint16_t color) { unsigned int x,y; SSD1963_SetArea(0, TFT_WIDTH-1 , 0, TFT_HEIGHT-1); SSD1963_WriteCommand(0x002c); for(x=0;x<TFT_WIDTH;x++){ for(y= 0;y<TFT_HEIGHT;y++){ SSD1963_WriteDataPix(color); } } }
// 18- RGB666 void SSD1963_WriteDataPix_9(uint32_t pixdata) { uint32_t tmp = (LCD_DATA_PORT->ODR & 0xfe00); SET_LCD_RDS; LCD_DATA_PORT->ODR = tmp | ((pixdata >> 9) & 0x01ff); RESET_LCD_WR; SET_LCD_WR; LCD_DATA_PORT->ODR = tmp | (pixdata & 0x01ff); RESET_LCD_WR; SET_LCD_WR; } // 18- RGB666 void SSD1963_ClearScreen_9(uint32_t color) { unsigned int x,y; SSD1963_SetArea(0, TFT_WIDTH-1 , 0, TFT_HEIGHT-1); SSD1963_WriteCommand(0x002c); for(x=0;x<TFT_WIDTH;x++) { for(y= 0;y<TFT_HEIGHT;y++) { SSD1963_WriteDataPix_9(color); } } }
void SSD1963_WriteDataPix_9(uint32_t pixdata) { SET_LCD_RDS; LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & 0xfe00) | ((pixdata >> 9) & 0x01ff); RESET_LCD_WR; SET_LCD_WR; LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & 0xfe00) | (pixdata & 0x01ff); RESET_LCD_WR; SET_LCD_WR; }
void SSD1963_WriteDataPix_9(uint32_t pixdata) { SET_LCD_RDS; LCD_DATA_PORT->ODR = pixdata >> 9; RESET_LCD_WR; SET_LCD_WR; LCD_DATA_PORT->ODR = pixdata; RESET_LCD_WR; SET_LCD_WR; }
void SSD1963_WriteDataPix_9(uint32_t pixdata, uint32_t n){ static uint32_t dp[4]; uint8_t i; SET_LCD_RDS; RESET_LCD_WR; dp[0] = (pixdata >> 9) & 0x01ff; dp[1] = ((pixdata >> 9) & 0x01ff) | 0x0200; dp[2] = pixdata & 0x01ff; dp[3] = (pixdata & 0x01ff) | 0x0200; for (;n;n--){ for (i=0;i<4;i++) { LCD_DATA_PORT->ODR = dp[i]; } } void SSD1963_ClearScreen_9(uint32_t color) { SSD1963_SetArea(0, TFT_WIDTH-1 , 0, TFT_HEIGHT-1); SSD1963_WriteCommand(0x002c); SSD1963_WriteDataPix_9(color, TFT_HEIGHT*TFT_WIDTH); }
08000265: ldr r3, [pc, #24] ; (0x8000280 <SSD1963_WriteDataPix_9+84>)
08000267: str r6, [r3, #12]
08000269: str r5, [r3, #12]
0800026b: str r4, [r3, #12]
0800026d: str r1, [r3, #12]
0800026f: subs r2, #1
08000271: bne.n 0x8000266 <SSD1963_WriteDataPix_9+58>
// void SSD1963_TimInit2(void){ TIM_TimeBaseInitTypeDef Timer; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStructInit(&Timer); Timer.TIM_Prescaler = 72-1; Timer.TIM_Period = 10000; Timer.TIM_CounterMode = TIM_CounterMode_Down; TIM_TimeBaseInit(TIM4, &Timer); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); NVIC_EnableIRQ(TIM4_IRQn); } void SSD1963_WriteDataPix(uint32_t pixdata, uint32_t n){ GPIO_InitTypeDef GPIO_InitStr; SET_LCD_RDS; LCD_DATA_PORT->ODR = (LCD_DATA_PORT->ODR & ~0x01ff) | (pixdata & 0x01ff); GPIO_InitStr.GPIO_Pin = LCD_WR; GPIO_InitStr.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStr.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_WR_PORT, &GPIO_InitStr); // TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); // if (n > 32000 ){ TIM_PrescalerConfig(TIM4, 72 - 1, TIM_PSCReloadMode_Immediate); // 1 TIM4->CNT = (uint16_t) (n / 36); // } else { TIM_PrescalerConfig(TIM4, 0, TIM_PSCReloadMode_Immediate); // 1/72 () TIM4->CNT = (uint16_t) (n * 2 - 1); // } TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // RCC_MCOConfig(RCC_MCO_SYSCLK); //MCO TIM4->CR1 |= TIM_CR1_CEN; // } void TIM4_IRQHandler() { GPIO_InitTypeDef GPIO_InitStr; if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // TIM_Cmd(TIM4, DISABLE); // RCC_MCOConfig(RCC_MCO_NoClock); // SYSCLK MCO GPIO_InitStr.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStr.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStr.GPIO_Pin = LCD_WR; GPIO_Init(LCD_WR_PORT, &GPIO_InitStr); // } } void SSD1963_ClearScreen_9(uint32_t color) { SSD1963_SetArea(0, TFT_WIDTH-1 , 0, TFT_HEIGHT-1); SSD1963_WriteCommand(0x2c); SSD1963_WriteDataPix(color, TFT_HEIGHT*TFT_WIDTH); } int main(void){ tick_init(); // lcd_port_init(); // - SSD1963_Init(); // SSD1963_TimInit2(); // TIM4 SSD1963_ClearScreen_9(0x1ff); // while(1) {} }
Source: https://habr.com/ru/post/278967/
All Articles