|
#include "bsp_include.h"
uint16_t LCD_RD_DATA(void)
{
uint16_t t;
gpio_init_type gpio_init_struct = {0};
gpio_default_para_init(&gpio_init_struct);
/*-- gpio configuration ------------------------------------------------------*/
/* lcd data lines configuration */
gpio_init_struct.gpio_pins = LCD_DATA0_PIN | LCD_DATA1_PIN | LCD_DATA2_PIN | LCD_DATA3_PIN |
LCD_DATA4_PIN | LCD_DATA5_PIN | LCD_DATA6_PIN | LCD_DATA7_PIN;
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOA, &gpio_init_struct);
/*// IO 转换为输入模式
GPIOA->cfglr = 0x88888888; //PA0-7 上拉输入.
//GPIOA->cfghr=0x88888888; //PA8-15 上拉输入
GPIOA->odt = 0x0000; //全部输出0*/
LCD_CS_CLR;
LCD_RS_SET;
LCD_WR_SET;
LCD_RD_CLR;
//delay_us(2);
t = DATAIN;
delay_us(2);
LCD_RD_SET;
LCD_CS_SET;
/*// IO 转换为输出模式
GPIOA->cfglr = 0x11111111; //PA0-7 通用推挽输出
//GPIOA->cfghr=0x11111111; //PA8-15 通用推挽输出
GPIOA->odt = 0xffff; //全部输出高*/
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOA, &gpio_init_struct);
return t;
}
void LCD_WR_DATA(uint8_t data)
{
LCD_CS_CLR;
LCD_RS_SET;
LCD_RD_SET;
DATAOUT(data);
LCD_WR_CLR;
delay_us(1);
LCD_WR_SET;
LCD_CS_SET;
}
void LCD_WR_COMMAND(uint8_t command)
{
LCD_CS_CLR;
LCD_RS_CLR;
LCD_RD_SET;
DATAOUT(command);
LCD_WR_CLR;
delay_us(1);
LCD_WR_SET;
//LCD_CS_SET;
}
void LCD_SetBlock(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend)
{
/* Set row coordinates */
LCD_WR_COMMAND(0x2a);
LCD_WR_DATA(xstart >> 8);
LCD_WR_DATA(xstart);
LCD_WR_DATA(xend >> 8);
LCD_WR_DATA(xend);
/* Set column coordinates */
LCD_WR_COMMAND(0x2b);
LCD_WR_DATA(ystart >> 8);
LCD_WR_DATA(ystart);
LCD_WR_DATA(yend >> 8);
LCD_WR_DATA(yend);
/* Enable write menory */
LCD_WR_COMMAND(0x2c);
}
void LCD_WriteOnePoint(uint16_t color)
{
LCD_WR_DATA(color >> 8);
LCD_WR_DATA(color);
}
void LCD_WriteOneBlock(uint16_t *color, int size)
{
for (int i = 0; i < size; i++)
{
//*(uint8_t*) XMC_LCD_DATA = color[i]>>8;
//*(uint8_t*) XMC_LCD_DATA = color[i];
LCD_WR_DATA(color[i] >> 8);
LCD_WR_DATA(color[i]);
}
}
/**
* @brief This function is write one point to LCD.
* @param data : the data to write.
* @retval None
*/
/**
* @brief This function is draw point to LCD.
* @param data : the data to write.
* @retval None
*/
void LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t color)
{
LCD_SetBlock(x, y, x, y);
LCD_WriteOnePoint(color);
}
/**
* @brief This function is clear the LCD.
* @param data : the data to write.
* @retval None
*/
void LCD_Clear(uint16_t color)
{
uint32_t i, total_Pixel;
LCD_SetBlock(0, 0, LV_HOR_RES_MAX, LV_VER_RES_MAX);
total_Pixel = LV_HOR_RES_MAX * LV_VER_RES_MAX;
for (i = 0; i < total_Pixel; i++)
{
// *(uint8_t *) XMC_LCD_DATA = color >> 8;
// *(uint8_t *) XMC_LCD_DATA = color;
LCD_WR_DATA(color >> 8);
LCD_WR_DATA(color);
}
}
/**
* @brief configures the xmc and gpios to interface with the lcd.
* this function must be called before any write/read operation
* on the lcd.
* @param none
* @retval none
*/
void xmc_init(void)
{
gpio_init_type gpio_init_struct = {0};
/* enable the gpio clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
//crm_periph_clock_enable(CRM__PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
gpio_pin_remap_config(SWJTAG_GMUX_010, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_bits_reset(GPIOA, LCD_PWM_PIN);
/*-- gpio configuration ------------------------------------------------------*/
/* lcd data lines configuration */
gpio_init_struct.gpio_pins = LCD_DATA0_PIN | LCD_DATA1_PIN | LCD_DATA2_PIN | LCD_DATA3_PIN |
LCD_DATA4_PIN | LCD_DATA5_PIN | LCD_DATA6_PIN | LCD_DATA7_PIN | LCD_PWM_PIN;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOA, &gpio_init_struct);
gpio_bits_set(GPIOA, LCD_DATA0_PIN | LCD_DATA1_PIN | LCD_DATA2_PIN | LCD_DATA3_PIN |
LCD_DATA4_PIN | LCD_DATA5_PIN | LCD_DATA6_PIN | LCD_DATA7_PIN);
/* lcd rs/cs/wr/rd reset lines configuration */
gpio_init_struct.gpio_pins = LCD_WR_PIN | LCD_RS_PIN | LCD_CS_PIN | LCD_RD_PIN | LCD_RESET_PIN;
// gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
// gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
// gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
// gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOB, &gpio_init_struct);
gpio_bits_set(GPIOB, LCD_WR_PIN | LCD_RS_PIN | LCD_CS_PIN | LCD_RD_PIN | LCD_RESET_PIN);
}
static void ILI9341_REG_Config ( void )
{
/* Power control B (CFh) */
LCD_WR_COMMAND ( 0xCF );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x81 );
LCD_WR_DATA ( 0x30 );
/* Power on sequence control (EDh) */
LCD_WR_COMMAND ( 0xED );
LCD_WR_DATA ( 0x64 );
LCD_WR_DATA ( 0x03 );
LCD_WR_DATA ( 0x12 );
LCD_WR_DATA ( 0x81 );
/* Driver timing control A (E8h) */
LCD_WR_COMMAND ( 0xE8 );
LCD_WR_DATA ( 0x85 );
LCD_WR_DATA ( 0x10 );
LCD_WR_DATA ( 0x78 );
/* Power control A (CBh) */
LCD_WR_COMMAND ( 0xCB );
LCD_WR_DATA ( 0x39 );
LCD_WR_DATA ( 0x2C );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x34 );
LCD_WR_DATA ( 0x02 );
/* Pump ratio control (F7h) */
LCD_WR_COMMAND ( 0xF7 );
LCD_WR_DATA ( 0x20 );
/* Driver timing control B */
LCD_WR_COMMAND ( 0xEA );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x00 );
/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
LCD_WR_COMMAND ( 0xB1 );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x1B );
/* Display Function Control (B6h) */
LCD_WR_COMMAND ( 0xB6 );
LCD_WR_DATA ( 0x0A );
LCD_WR_DATA ( 0xA2 );
/* Power Control 1 (C0h) */
LCD_WR_COMMAND ( 0xC0 );
LCD_WR_DATA ( 0x35 );
/* Power Control 2 (C1h) */
LCD_WR_COMMAND ( 0xC1 );
LCD_WR_DATA ( 0x11 );
/* VCOM Control 1 (C5h) */
LCD_WR_COMMAND ( 0xC5 );
LCD_WR_DATA ( 0x45 );
LCD_WR_DATA ( 0x45 );
/* VCOM Control 2 (C7h) */
LCD_WR_COMMAND ( 0xC7 );
LCD_WR_DATA ( 0xA2 );
/* Enable 3G (F2h) */
LCD_WR_COMMAND ( 0xF2 );
LCD_WR_DATA ( 0x00 );
/* Gamma Set (26h) */
LCD_WR_COMMAND ( 0x26 );
LCD_WR_DATA ( 0x01 );
/* Positive Gamma Correction */
LCD_WR_COMMAND ( 0xE0 ); //Set Gamma
LCD_WR_DATA ( 0x0F );
LCD_WR_DATA ( 0x26 );
LCD_WR_DATA ( 0x24 );
LCD_WR_DATA ( 0x0B );
LCD_WR_DATA ( 0x0E );
LCD_WR_DATA ( 0x09 );
LCD_WR_DATA ( 0x54 );
LCD_WR_DATA ( 0xA8 );
LCD_WR_DATA ( 0x46 );
LCD_WR_DATA ( 0x0C );
LCD_WR_DATA ( 0x17 );
LCD_WR_DATA ( 0x09 );
LCD_WR_DATA ( 0x0F );
LCD_WR_DATA ( 0x07 );
LCD_WR_DATA ( 0x00 );
/* Negative Gamma Correction (E1h) */
LCD_WR_COMMAND ( 0XE1 ); //Set Gamma
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x19 );
LCD_WR_DATA ( 0x1B );
LCD_WR_DATA ( 0x04 );
LCD_WR_DATA ( 0x10 );
LCD_WR_DATA ( 0x07 );
LCD_WR_DATA ( 0x2A );
LCD_WR_DATA ( 0x47 );
LCD_WR_DATA ( 0x39 );
LCD_WR_DATA ( 0x03 );
LCD_WR_DATA ( 0x06 );
LCD_WR_DATA ( 0x06 );
LCD_WR_DATA ( 0x30 );
LCD_WR_DATA ( 0x38 );
LCD_WR_DATA ( 0x0F );
/* memory access control set */
LCD_WR_COMMAND ( 0x36 );
LCD_WR_DATA ( 0xC8 ); /*竖屏 左上角到 (起点)到右下角 (终点)扫描方式*/
/* column address control set */
LCD_WR_COMMAND ( 0x2A );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0xEF );
/* page address control set */
LCD_WR_COMMAND ( 0x2B );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x00 );
LCD_WR_DATA ( 0x01 );
LCD_WR_DATA ( 0x3F );
/* Pixel Format Set (3Ah) */
LCD_WR_COMMAND ( 0x3a );
LCD_WR_DATA ( 0x55 );
/* Sleep Out (11h) */
LCD_WR_COMMAND ( 0x11 );
delay_ms(10);
/* Display ON (29h) */
LCD_WR_COMMAND ( 0x29 );
}
void LCD_init(void)
{
uint16_t i;
xmc_init();
gpio_bits_reset(GPIOB, LCD_RESET_PIN);
delay_ms(10);
gpio_bits_set(GPIOB, LCD_RESET_PIN);
delay_ms(10);
/* Reset LCD */
LCD_RESET_HIGH;
delay_ms(10);
LCD_RESET_LOW;
delay_ms(10);
LCD_RESET_HIGH;
delay_ms(10);
/*Software Reset*/
/*LCD_WR_COMMAND(0x01);
delay_ms(20);
//显示器型号STL3.5-180-318-K 驱动IC ST7796S
LCD_WR_COMMAND(0x36);
LCD_WR_DATA(BIT5 | BIT3);
LCD_WR_COMMAND(0x3a);
LCD_WR_DATA(0x55);
LCD_WR_COMMAND(0x11); //Exit Sleep
delay_ms(10);
LCD_WR_COMMAND(0x29); //display on
delay_ms(1);*/
ILI9341_REG_Config();
//lcd->lcd_clear((uint16_t)(63488)); //先写白色
//LCD_Clear(WHITE); //先写白色
LCD_Clear(0xffff);
//LCD_Clear((uint16_t)0);
LCD_WR_COMMAND(0x0c);
LCD_RD_DATA();
Printf("....%x\n", (char)LCD_RD_DATA());
gpio_bits_set(GPIOA, LCD_PWM_PIN);
// Printf("xmc\r\n");
// delay_ms(1);
// LCD_WR_COMMAND(0x0c);
// LCD_RD_DATA();
// u16 tmp = LCD_RD_DATA();
// Printf("command 0x0c, input data: 0x%x\r\n", tmp);
// LCD_WR_COMMAND(0XD3);
// LCD_RD_DATA(); //dummy read
// u16 id = LCD_RD_DATA(); //读到0X00
// id = LCD_RD_DATA(); //读取0X93
// id <<= 8;
// id |= LCD_RD_DATA(); //读取0X41
// Printf("command 0xD3, input data: 0x%x\r\n", id);
}
|
|