这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 驱动ST7796LCD屏

共1条 1/1 1 跳转至

驱动ST7796LCD屏

工程师
2025-08-12 09:29:34     打赏

一、接口设计

st7796使用spi接口共需要  接口,分别为


/*


 * SCK  P0_7


 * MOSI P0_5


 * CS   P0_11


 * DC   P1_6


 * RST  P0-19


 */


2、工程创建

1、新建一个基于spi示例创建的工程


2、复制一个在其他工程可以正常驱动的ST7789LCD屏驱动到工程中。

添加st7796文件.png

添加st7796文件

3、此次先采用模拟SPI来驱动,验证屏与开发板接口是否正确,屏是否能正常工作。


4、定义IO的宏:


#define CS_PORT    MXC_GPIO0

#define CS_PIN     MXC_GPIO_PIN_11

#define DC_PORT    MXC_GPIO1

#define DC_PIN     MXC_GPIO_PIN_6

#define RST_PORT   MXC_GPIO0

#define RST_PIN    MXC_GPIO_PIN_19

#define SCK_PORT   MXC_GPIO0

#define SCK_PIN    MXC_GPIO_PIN_7

#define MOSI_PORT  MXC_GPIO0

#define MOSI_PIN   MXC_GPIO_PIN_5

#define CS_SET     MXC_GPIO_OutSet(CS_PORT,CS_PIN)

#define CS_CLR     MXC_GPIO_OutClr(CS_PORT,CS_PIN)

#define DC_SET     MXC_GPIO_OutSet(DC_PORT,DC_PIN)

#define DC_CLR     MXC_GPIO_OutClr(DC_PORT,DC_PIN)

#define RST_SET    MXC_GPIO_OutSet(RST_PORT,RST_PIN)

#define RST_CLR    MXC_GPIO_OutClr(RST_PORT,RST_PIN)

#define SCK_SET     (SCK_PORT->out_set = SCK_PIN)

#define SCK_CLR     (SCK_PORT->out_clr = SCK_PIN)

#define MOSI_SET    (MOSI_PORT->out_set = MOSI_PIN)

#define MOSI_CLR    (MOSI_PORT->out_clr = MOSI_PIN)

5、添加软件spi的初始化


static void tft_spi_init(void)

{

    mxc_gpio_cfg_t gpio_out;

    gpio_out.port = DC_PORT;

    gpio_out.mask = DC_PIN;

    gpio_out.pad = MXC_GPIO_PAD_NONE;

    gpio_out.func = MXC_GPIO_FUNC_OUT;

    gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;

    gpio_out.drvstr = MXC_GPIO_DRVSTR_0;

    MXC_GPIO_Config(&gpio_out);

    gpio_out.port = SCK_PORT;

    gpio_out.mask = SCK_PIN;

    gpio_out.pad = MXC_GPIO_PAD_NONE;

    gpio_out.func = MXC_GPIO_FUNC_OUT;

    gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;

    gpio_out.drvstr = MXC_GPIO_DRVSTR_0;

    MXC_GPIO_Config(&gpio_out);

    gpio_out.port = MOSI_PORT;

    gpio_out.mask = MOSI_PIN;

    gpio_out.pad = MXC_GPIO_PAD_NONE;

    gpio_out.func = MXC_GPIO_FUNC_OUT;

    gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;

    gpio_out.drvstr = MXC_GPIO_DRVSTR_0;

    MXC_GPIO_Config(&gpio_out);

    gpio_out.port = CS_PORT;

    gpio_out.mask = CS_PIN;

    gpio_out.pad = MXC_GPIO_PAD_NONE;

    gpio_out.func = MXC_GPIO_FUNC_OUT;

    gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;

    gpio_out.drvstr = MXC_GPIO_DRVSTR_0;

    MXC_GPIO_Config(&gpio_out);

    gpio_out.port = RST_PORT;

    gpio_out.mask = RST_PIN;

    gpio_out.pad = MXC_GPIO_PAD_NONE;

    gpio_out.func = MXC_GPIO_FUNC_OUT;

    gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;

    gpio_out.drvstr = MXC_GPIO_DRVSTR_0;

    MXC_GPIO_Config(&gpio_out);

    DC_CLR;

    CS_SET;

    SCK_CLR;

    RST_SET;

}

6、编写发送一个bit的功能函数


static void spi_transmit(void *datain, unsigned int count)

{

    uint32_t len = count;

    uint8_t *data = (uint8_t *)datain;

    uint8_t i;

    while (len--)

    {

        // 发送8位数据,从高位到低位

        for(i = 0; i < 8; i++)

        {

            // 先设置数据

            if(*data & 0x80)

            {

                MXC_GPIO_OutSet(MOSI_PORT, MOSI_PIN);

            }

            else

            {

                MXC_GPIO_OutClr(MOSI_PORT, MOSI_PIN);

            }

            // 时钟脉冲,高电平期间数据有效

            MXC_GPIO_OutSet(SCK_PORT, SCK_PIN);

            // 短暂延时,确保数据稳定

//            for(int j = 0; j < 10; j++);

            // 时钟拉低,准备下一位

            MXC_GPIO_OutClr(SCK_PORT, SCK_PIN);

            // 移位,处理下一位

            *data <<= 1;

            // 短暂延时

//            for(int j = 0; j < 5; j++);

        }

        data++;

    }

}

7、修改st7796命令发送相关指令:


static void st7796_send_command(uint8_t cmd)

{

    DC_CLR;

#if SOFT_SPI

    CS_CLR;

    unsigned char val = cmd;

    spi_transmit(&val, 1);

    CS_SET;

#else

    unsigned char val = cmd;

    spi_transmit(&cmd, 1);

#endif

    DC_SET;

}

// ��������

static void st7796_send_data(uint8_t *data, uint32_t len)

{

    DC_SET;  // ����ģʽ

    uint16_t val;

#if SOFT_SPI

    CS_CLR;

//    for(uint32_t i=0;i<len;i++)

//    {

//      val = data[i];

//      spi_transmit(&val, 1);

//    }

    spi_transmit(data, len);

    CS_SET;  // ȡ��ѡ��

#else

    for(uint32_t i=0;i<len;i++)

    {

        val = data[i];

        spi_transmit(&val, 1);

        val++;

        MXC_Delay(10);

    }

#endif

}

// ����16���

static void st7796_send_data16(uint16_t data)

{

    DC_SET;  

#if SOFT_SPI

    uint8_t buff[2];

    buff[0] = data>>8;

    buff[1] = data&0xff;

    CS_CLR;

    spi_transmit(&buff, 2);

    CS_SET;  // ȡ��ѡ��

#else

    spi_transmit(&data, 1);

    MXC_Delay(10);

#endif

}

8、修改st7796初始化


void st7796_init(void)

{

    tft_spi_init();

    // ��ʼ������

    //CS_SET;

    DC_SET;

    RST_SET;

//    BL_CLR;

    

    // ��λLCD

    RST_CLR;

    MXC_Delay(100000);

    RST_SET;

    MXC_Delay(120000);

    

    // ��ʼ������ - ST7796

    st7796_send_command(0x11);  // �˳�˯��ģʽ

    MXC_Delay(120000);

    

    st7796_send_command(0xf0);

    st7796_send_data((uint8_t[]){0xc3}, 1); 

    st7796_send_command(0x36);  // �ڴ����ݷ��ʿ���

    st7796_send_data((uint8_t[]){0x48}, 1);  // ������Ļ�������

    

    st7796_send_command(0x3A);  // �������ظ�ʽ

    st7796_send_data((uint8_t[]){0x05}, 1);  // 16λ����

    

    st7796_send_command(0xB4);  // ֡���ʿ��� (����ģʽ)

    st7796_send_data((uint8_t[]){0x01}, 1);

    

    st7796_send_command(0xE6);

    st7796_send_data((uint8_t[]){0x0f, 0xf2, 0x3f,0x4f,0x4f,0x28,0x0e,0x00}, 8);

    st7796_send_command(0xc5);

    st7796_send_data((uint8_t[]){0x20}, 1);

    st7796_send_command(0xe0);

    st7796_send_data((uint8_t[]){0xf0,0x03,0x0a,0x11,0x14,0x1c,0x3b,0x55,0x4a,0x0a,0x13,0x14,0x1c,0x1f},14);

    st7796_send_command(0xe1);

    st7796_send_data((uint8_t[]){0xf0,0x03,0x0a,0x0c,0x0c,0x09,0x36,0x54,0x49,0x0f,0x1b,0x18,0x1b,0x1f},14);

   

    st7796_send_command(0xf0);

    st7796_send_data((uint8_t[]){0x3c}, 1);

    st7796_send_command(0xf0);

    st7796_send_data((uint8_t[]){0x69}, 1);

    // st7796_send_command(0x20);  // ���Թر�

    MXC_Delay(120000);

    

    st7796_send_command(0x29); // ��ʾ����

    // �




关键词: ST7796LCD     MAX7800    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]