硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1451|回复: 7
收起左侧

[有问必答] 用GPIO模拟8080时序驱动st7796s屏幕, 花屏, 并且读 Read Display Pixel Format 错误

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2024-2-23 10:56:17 | 显示全部楼层 |阅读模式

#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);
}





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116242
QQ
发表于 2024-2-23 13:48:42 | 显示全部楼层
楼主这个代码读取显示屏ID正常吗,ID读取正常了,后面就好弄。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-2-23 14:03:17 | 显示全部楼层
eric2013 发表于 2024-2-23 13:48
楼主这个代码读取显示屏ID正常吗,ID读取正常了,后面就好弄。

读取的都是ffff
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116242
QQ
发表于 2024-2-24 00:25:02 | 显示全部楼层

那不正常,优先解决读取ID问题。
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2024-2-26 12:30:44 | 显示全部楼层
注意以下两点:
1、你用的是8080接口,那就是传数据是用的16bit的,不应该用8bit的传数据方式。
2、SPI方式传数据,图片格式生成的是高位在前的,8080接口生成的图片格式不能用高位在前的方式生成,不然花屏。
除了以上两点,其他代码屏厂家的驱动基本都可以直接套用
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2024-2-26 15:38:15 | 显示全部楼层
benny 发表于 2024-2-26 12:30
注意以下两点:
1、你用的是8080接口,那就是传数据是用的16bit的,不应该用8bit的传数据方式。
2、SPI方 ...

感谢, 现在的问题是 st7796s 读不出id号
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-10-6 21:16:03 | 显示全部楼层
解决了吗?

/****************************************************************************************************
//=========================================电源接线================================================//
//     LCD模块                STM32单片机
//      VCC          接        DC5V/3.3V      //电源
//      GND          接          GND          //电源地
//=======================================液晶屏数据线接线==========================================//
//本模块默认数据总线类型为SPI总线
//     LCD模块                STM32单片机   
//            MOSI         接          PA7          //液晶屏SPI总线数据写信号
//      MISO         接          PA6          //液晶屏SPI总线数据读信号,如果不需要读,可以不接线
//=======================================液晶屏控制线接线==========================================//
//     LCD模块                                               STM32单片机
//      LCD_BL       接          PB6          //液晶屏背光控制信号(如果不需要控制,可以不接)
//       SCK         接          PA5          //液晶屏SPI总线时钟信号
//      LCD_RS       接          PB7          //液晶屏数据/命令控制信号
//      RESET        接          PB8         //液晶屏复位控制信号
//      LCD_CS       接          PB9          //液晶屏片选控制信号
//=========================================触摸屏触接线=========================================//
//如果模块不带触摸功能或者带有触摸功能,但是不需要触摸功能,则不需要进行触摸屏接线
//           LCD模块                STM32单片机
//     CTP_INT       接          PA1          //电容触摸屏触摸中断信号
//     CTP_SDA       接          PA9          //电容触摸屏IIC总线数据信号
//     CTP_RST       接          PA10         //电容触摸屏触摸复位信号
//     CTP_SCL       接          PB5          //电容触摸屏IIC总线时钟信号
**************************************************************************************************/       
/* @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
**************************************************************************************************/       
#include "lcd.h"
#include "stdlib.h"
          
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;

//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;  
uint16_t DeviceCode;         

/*****************************************************************************
* @name       :void LCD_WR_REG(uint8_t data)
* @date       :2018-08-09
* @function   :Write an 8-bit command to the LCD screen
* @parameters :data:Command value to be written
* @retvalue   :None
******************************************************************************/
void LCD_WR_REG(uint8_t data)
{
   LCD_CS_CLR;     
         LCD_RS_CLR;          
   SPI_WriteByte(SPI1,data);
   LCD_CS_SET;       
}

/*****************************************************************************
* @name       :void LCD_WR_DATA(uint8_t data)
* @date       :2018-08-09
* @function   :Write an 8-bit data to the LCD screen
* @parameters :data:data value to be written
* @retvalue   :None
******************************************************************************/
void LCD_WR_DATA(uint8_t data)
{
   LCD_CS_CLR;
         LCD_RS_SET;
   SPI_WriteByte(SPI1,data);
   LCD_CS_SET;
}

uint8_t LCD_RD_DATA(void)
{
         uint8_t data;
         LCD_CS_CLR;
         LCD_RS_SET;
         SPI1_SetSpeed(0);
         data = SPI_ReadByte();
         SPI1_SetSpeed(1);
         LCD_CS_SET;
         return data;
}

/*****************************************************************************
* @name       :void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
* @date       :2018-08-09
* @function   :Write data into registers
* @parameters CD_Reg:Register address
                LCD_RegValueata to be written
* @retvalue   :None
******************************************************************************/
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{       
        LCD_WR_REG(LCD_Reg);  
        LCD_WR_DATA(LCD_RegValue);                             
}          

uint8_t LCD_ReadReg(uint8_t LCD_Reg)
{
        LCD_WR_REG(LCD_Reg);
  return LCD_RD_DATA();
}

/*****************************************************************************
* @name       :void LCD_WriteRAM_Prepare(void)
* @date       :2018-08-09
* @function   :Write GRAM
* @parameters :None
* @retvalue   :None
******************************************************************************/         
void LCD_WriteRAM_Prepare(void)
{
        LCD_WR_REG(lcddev.wramcmd);
}         


void LCD_ReadRAM_Prepare(void)
{
        LCD_WR_REG(lcddev.rramcmd);
}         

/*****************************************************************************
* @name       :void Lcd_WriteData_16Bit(uint16_t Data)
* @date       :2018-08-09
* @function   :Write an 16-bit command to the LCD screen
* @parameters ataata to be written
* @retvalue   :None
******************************************************************************/         
void Lcd_WriteData_16Bit(uint16_t Data)
{       
   LCD_CS_CLR;
   LCD_RS_SET;  
        SPI_WriteByte(SPI1,Data>>8);
        SPI_WriteByte(SPI1,Data);

   LCD_CS_SET;
}

uint16_t Lcd_ReadData_16Bit(void)
{
        uint16_t r,g;
        LCD_CS_CLR;
        LCD_RS_CLR;          
        SPI_WriteByte(SPI1,lcddev.rramcmd);
        SPI1_SetSpeed(0);
        LCD_RS_SET;
        SPI_ReadByte();
        r = SPI_ReadByte();
        g = SPI_ReadByte();
        LCD_CS_SET;
        r<<=8;
        r|=g;
        return r;
}

/*****************************************************************************
* @name       :void LCD_DrawPoint(uint16_t x,uint16_t y)
* @date       :2018-08-09
* @function   :Write a pixel data at a specified location
* @parameters :x:the x coordinate of the pixel
                y:the y coordinate of the pixel
* @retvalue   :None
******************************************************************************/       
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
        LCD_SetCursor(x,y);//设置光标位置
        Lcd_WriteData_16Bit(POINT_COLOR);
}

uint16_t LCD_ReadPoint(uint16_t x,uint16_t y)
{
        uint16_t color;
        LCD_SetCursor(x,y);//设置光标位置
        color = Lcd_ReadData_16Bit();
        return color;
}

/*****************************************************************************
* @name       :void LCD_Clear(uint16_t Color)
* @date       :2018-08-09
* @function   :Full screen filled LCD screen
* @parameters :color:Filled color
* @retvalue   :None
******************************************************************************/       
void LCD_Clear(uint16_t Color)
{
  unsigned int i,m;  
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);   
        LCD_CS_CLR;
        LCD_RS_SET;
        for(i=0;i<lcddev.height;i++)
        {
    for(m=0;m<lcddev.width;m++)
    {       
                        SPI_WriteByte(SPI1,Color>>8);
                        SPI_WriteByte(SPI1,Color);
                }
        }
         LCD_CS_SET;
}

/*****************************************************************************
* @name       :void LCD_RESET(void)
* @date       :2018-08-09
* @function   :Reset LCD screen
* @parameters :None
* @retvalue   :None
******************************************************************************/       
void LCD_RESET(void)
{
        LCD_RST_CLR;
        HAL_Delay(100);       
        LCD_RST_SET;
        HAL_Delay(50);
}

/*****************************************************************************
* @name       :void LCD_RESET(void)
* @date       :2018-08-09
* @function   :Initialization LCD screen
* @parameters :None
* @retvalue   :None
******************************************************************************/                  
void LCD_Init(void)
{                                                           
//如果mcu的复位引脚没有引出来,则接PB8,调用下列复位函数       
        LCD_RESET(); //LCD 复位
//*************3.5 ST7796S IPS初始化**********//       
        LCD_WR_REG(0x11);     

        HAL_Delay(120);                //Delay 120ms

        LCD_WR_REG(0x36);     // Memory Data Access Control MY,MX~~
        LCD_WR_DATA(0x48);   

        LCD_WR_REG(0x3A);     
        LCD_WR_DATA(0x55);   //LCD_WR_DATA(0x66);

        LCD_WR_REG(0xF0);     // Command Set Control
        LCD_WR_DATA(0xC3);   

        LCD_WR_REG(0xF0);     
        LCD_WR_DATA(0x96);   

        LCD_WR_REG(0xB4);     
        LCD_WR_DATA(0x01);   

        LCD_WR_REG(0xB7);     
        LCD_WR_DATA(0xC6);   

        //LCD_WR_REG(0xB9);     
        //LCD_WR_DATA(0x02);
        //LCD_WR_DATA(0xE0);

        LCD_WR_REG(0xC0);     
        LCD_WR_DATA(0x80);   
        LCD_WR_DATA(0x45);   

        LCD_WR_REG(0xC1);     
        LCD_WR_DATA(0x13);   //18  //00

        LCD_WR_REG(0xC2);     
        LCD_WR_DATA(0xA7);   

        LCD_WR_REG(0xC5);     
        LCD_WR_DATA(0x0A);   

        LCD_WR_REG(0xE8);     
        LCD_WR_DATA(0x40);
        LCD_WR_DATA(0x8A);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x29);
        LCD_WR_DATA(0x19);
        LCD_WR_DATA(0xA5);
        LCD_WR_DATA(0x33);

        LCD_WR_REG(0xE0);
        LCD_WR_DATA(0xD0);
        LCD_WR_DATA(0x08);
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x06);
        LCD_WR_DATA(0x06);
        LCD_WR_DATA(0x33);
        LCD_WR_DATA(0x30);
        LCD_WR_DATA(0x33);
        LCD_WR_DATA(0x47);
        LCD_WR_DATA(0x17);
        LCD_WR_DATA(0x13);
        LCD_WR_DATA(0x13);
        LCD_WR_DATA(0x2B);
        LCD_WR_DATA(0x31);

        LCD_WR_REG(0xE1);
        LCD_WR_DATA(0xD0);
        LCD_WR_DATA(0x0A);
        LCD_WR_DATA(0x11);
        LCD_WR_DATA(0x0B);
        LCD_WR_DATA(0x09);
        LCD_WR_DATA(0x07);
        LCD_WR_DATA(0x2F);
        LCD_WR_DATA(0x33);
        LCD_WR_DATA(0x47);
        LCD_WR_DATA(0x38);
        LCD_WR_DATA(0x15);
        LCD_WR_DATA(0x16);
        LCD_WR_DATA(0x2C);
        LCD_WR_DATA(0x32);
         

        LCD_WR_REG(0xF0);     
        LCD_WR_DATA(0x3C);   

        LCD_WR_REG(0xF0);     
        LCD_WR_DATA(0x69);   

        HAL_Delay(120);               

        LCD_WR_REG(0x21);     

        LCD_WR_REG(0x29);

  LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
        LCD_Clear(WHITE);//清全屏白色
}

/*****************************************************************************
* @name       :void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
* @date       :2018-08-09
* @function   :Setting LCD display window
* @parameters :xStar:the bebinning x coordinate of the LCD display window
                                                                yStar:the bebinning y coordinate of the LCD display window
                                                                xEnd:the endning x coordinate of the LCD display window
                                                                yEnd:the endning y coordinate of the LCD display window
* @retvalue   :None
******************************************************************************/
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{       
        LCD_WR_REG(lcddev.setxcmd);       
        LCD_WR_DATA(xStar>>8);
        LCD_WR_DATA(0x00FF&xStar);               
        LCD_WR_DATA(xEnd>>8);
        LCD_WR_DATA(0x00FF&xEnd);

        LCD_WR_REG(lcddev.setycmd);       
        LCD_WR_DATA(yStar>>8);
        LCD_WR_DATA(0x00FF&yStar);               
        LCD_WR_DATA(yEnd>>8);
        LCD_WR_DATA(0x00FF&yEnd);

        LCD_WriteRAM_Prepare();        //开始写入GRAM                       
}   

/*****************************************************************************
* @name       :void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
* @date       :2018-08-09
* @function   :Set coordinate value
* @parameters :Xpos:the  x coordinate of the pixel
                                                                Ypos:the  y coordinate of the pixel
* @retvalue   :None
******************************************************************************/
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{                                             
        LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);       
}

/*****************************************************************************
* @name       :void LCD_direction(uint8_t direction)
* @date       :2018-08-09
* @function   :Setting the display direction of LCD screen
* @parameters :direction:0-0 degree
                          1-90 degree
                                                                                                        2-180 degree
                                                                                                        3-270 degree
* @retvalue   :None
******************************************************************************/
void LCD_direction(uint8_t direction)
{
                        lcddev.setxcmd=0x2A;
                        lcddev.setycmd=0x2B;
                        lcddev.wramcmd=0x2C;
                        lcddev.rramcmd=0x2E;
                        lcddev.dir = direction%4;
        switch(lcddev.dir){                  
                case 0:                                                                         
                        lcddev.width=LCD_W;
                        lcddev.height=LCD_H;               
                        LCD_WriteReg(0x36,(1<<3)|(1<<6));
                break;
                case 1:
                        lcddev.width=LCD_H;
                        lcddev.height=LCD_W;
                        LCD_WriteReg(0x36,(1<<3)|(1<<5));
                break;
                case 2:                                                                         
                        lcddev.width=LCD_W;
                        lcddev.height=LCD_H;       
                        LCD_WriteReg(0x36,(1<<3)|(1<<7));
                break;
                case 3:
                        lcddev.width=LCD_H;
                        lcddev.height=LCD_W;
                        LCD_WriteReg(0x36,(1<<3)|(1<<7)|(1<<6)|(1<<5));
                break;       
                default:break;
        }       
}         

uint16_t LCD_Read_ID(void)
{
        uint8_t i,val[3] = {0};
        LCD_WR_REG(0xF0);     // Command Set Control
        LCD_WR_DATA(0xC3);   

        LCD_WR_REG(0xF0);     
        LCD_WR_DATA(0x96);  
        LCD_CS_CLR;
        for(i=1;i<4;i++)
        {
                LCD_RS_CLR;          
                SPI_WriteByte(SPI1,0xFB);
                LCD_RS_SET;
                SPI_WriteByte(SPI1,0x10+i);
                LCD_RS_CLR;          
                SPI_WriteByte(SPI1,0xD3);
                SPI1_SetSpeed(0);
                LCD_RS_SET;
                val[i-1] = SPI_WriteByte(SPI1,0xFF);
                SPI1_SetSpeed(1);
                LCD_RS_CLR;          
                SPI_WriteByte(SPI1,0xFB);
                LCD_RS_SET;
                SPI_WriteByte(SPI1,0x00);       
        }
        LCD_CS_SET;
        LCD_WR_REG(0xF0);     // Command Set Control
        LCD_WR_DATA(0x3C);   
        LCD_WR_REG(0xF0);     
        LCD_WR_DATA(0x69);  
        lcddev.id=val[1];
        lcddev.id<<=8;
        lcddev.id|=val[2];
        return lcddev.id;
}


我这个可以读ID但是是花屏
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116242
QQ
发表于 2024-10-7 10:14:16 | 显示全部楼层
此乃刘同学 发表于 2024-10-6 21:16
解决了吗?

/************************************************************************************* ...

读ID正常,说明读操作没问题了

写操作可以刷个单色试试。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-11 08:54 , Processed in 0.710454 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表