OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6502|回复: 7

求助关于ST7735R液晶屏 刷屏颜色不对应问题

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-4-13
在线时间
7 小时
发表于 2018-10-22 23:00:29 | 显示全部楼层 |阅读模式
本帖最后由 liunan 于 2018-10-22 23:24 编辑

前几天从某宝上买了一块ST7735R液晶屏,在stm32f103上进行代码移植。初始化发现刷屏颜色不对应黑色刷成白色,白色刷成黑色其他颜色一团糟。求路过的大佬帮看看呀感激不尽!
代码如下

#define LCD_HEIGHT   160
#define LCD_WIDTH    128
//画笔颜色
#define RED     0XF800    //红色
#define GREEN   0X07E0    //绿色
#define BLUE    0X001F    //蓝色
#define BRED    0XF81F
#define GRED    0XFFE0    //灰色
#define GBLUE   0X07FF    //
#define BLACK   0X0000    //黑色
#define WHITE   0XFFFF    //白色
#define YELLOW  0xFFE0    //黄色


void ST7725R_Init(void)
{  
    LCD_GPIO_Init();             //端口初始化
    LCD_Reset();                 //LCD复位,在LCD初始化之前
    delay_ms(300);
        
    LCD_WR_CMD(0x11);           //Sleep out   退出睡眠模式
    delay_ms(120);      //Delay 120ms
    //------------------------------------ST7735R Frame Rate-----------------------------------------//
    /* Set the frame frequency of the full colors normal mode. */
    LCD_WR_CMD(0xB1);     //In Normal Mode (Full Colors)    全屏模式
    LCD_WR_Byte(0x05);    //设置 RTNA Set 1-line  Period  一行周期
    LCD_WR_Byte(0x3A);    //设置 FPA: Front Porch
    LCD_WR_Byte(0x3A);    //设置 BPA: Back Porch
    //Frame rate=fosc/((RTNA x 2 + 40) x (LINE + FPA + BPA +2))
    //其中 fosc = 850kHz

    /* Set the frame frequency of the Idle mode.  */
    LCD_WR_CMD(0xB2);     //In Idle Mode (8-colors)
    LCD_WR_Byte(0x05);
    LCD_WR_Byte(0x3A);
    LCD_WR_Byte(0x3A);

    /* Set the frame frequency of the Partial mode/ full colors. */
    LCD_WR_CMD(0xB3);
    LCD_WR_Byte(0x05);
    LCD_WR_Byte(0x3A);
    LCD_WR_Byte(0x3A);
    LCD_WR_Byte(0x05);
    LCD_WR_Byte(0x3A);
    LCD_WR_Byte(0x3A);

    //------------------------------------End ST7735R Frame Rate-----------------------------------------//
    LCD_WR_CMD(0xB4);   //Display Inversion Control  显示反转控制
    LCD_WR_Byte(0x07);  //LCD_WR_Byte(0x03); 原来为3,改为7
    // 低三位从高到低,分别为  full colors normal mode 、Idle mode 、
    // full Colors partial mode  的 点反转 或 列反转 ,1为列反转

    LCD_WR_CMD(0xC0);   //Power Control Setting  电源控制设置
    LCD_WR_Byte(0x28);
    LCD_WR_Byte(0x08);
    LCD_WR_Byte(0x84);
               
    LCD_WR_CMD(0xC1);
    LCD_WR_Byte(0XC0);
               
    LCD_WR_CMD(0xC2);
    LCD_WR_Byte(0x0C);
    LCD_WR_Byte(0x00);
               
    LCD_WR_CMD(0xC3);
    LCD_WR_Byte(0x8C);
    LCD_WR_Byte(0x2A);
               
    LCD_WR_CMD(0xC4);
    LCD_WR_Byte(0x8A);
    LCD_WR_Byte(0xEE);
    //---------------------------------End ST7735R Power Sequence-------------------------------------//
    LCD_WR_CMD(0xC5);   //  VCOM 电压配置
    LCD_WR_Byte(0x0C); //  -0.725
    //------------------------------------ST7735R Gamma Sequence-----------------------------------------//

     LCD_WR_CMD(0x36); //MX, MY, RGB mode
     LCD_WR_Byte(0xC8);  //0x68

    LCD_WR_CMD(0xE0);
    LCD_WR_Byte(0x05);
    LCD_WR_Byte(0x1A);
    LCD_WR_Byte(0x0C);
    LCD_WR_Byte(0x0E);
    LCD_WR_Byte(0x3A);
    LCD_WR_Byte(0x34);
    LCD_WR_Byte(0x2D);
    LCD_WR_Byte(0x2F);
    LCD_WR_Byte(0x2D);
    LCD_WR_Byte(0x2A);
    LCD_WR_Byte(0x2F);
    LCD_WR_Byte(0x3C);
    LCD_WR_Byte(0x00);
    LCD_WR_Byte(0x01);
    LCD_WR_Byte(0x02);
    LCD_WR_Byte(0x10);
               
    LCD_WR_CMD(0xE1);
    LCD_WR_Byte(0x04);
    LCD_WR_Byte(0x1B);
    LCD_WR_Byte(0x0D);
    LCD_WR_Byte(0x0E);
    LCD_WR_Byte(0x2D);
    LCD_WR_Byte(0x29);
    LCD_WR_Byte(0x24);
    LCD_WR_Byte(0x29);
    LCD_WR_Byte(0x28);
    LCD_WR_Byte(0x26);
    LCD_WR_Byte(0x31);
    LCD_WR_Byte(0x3B);
    LCD_WR_Byte(0x00);
    LCD_WR_Byte(0x00);
    LCD_WR_Byte(0x03);
    LCD_WR_Byte(0x12);
    //------------------------------------End ST7735R Gamma Sequence-----------------------------------------//
    LCD_WR_CMD(0x3A); //65k mode
    LCD_WR_Byte(0x05);
               
    LCD_WR_CMD(0x29); //开显示 Display on
    LCD_WR_CMD(0x2c); //
               
    LCD_Clear(BLACK);  //刷屏黑色
}
//设置lcd显示区域,在此区域写点数据自动换行
//xy起点和终点
void LCD_SetRegion(u16 x_start,u16 y_start,u16 x_end,u16 y_end)
{               
        LCD_WR_CMD(0x2a);
        LCD_WR_Byte(0x00);
        LCD_WR_Byte(x_start);
        LCD_WR_Byte(0x00);
        LCD_WR_Byte(x_end);
        LCD_WR_CMD(0x2b);
        LCD_WR_Byte(0x00);
        LCD_WR_Byte(y_start);
        LCD_WR_Byte(0x00);
        LCD_WR_Byte(y_end);
        LCD_WR_CMD(0x2c);
}

//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(u16 x, u16 y)
{
    LCD_SetRegion(x,y,x,y);
}
//LCD清屏函数
//color:填充的函数
void LCD_Clear(u16 color)
{
    u16 i,m;
    LCD_SetRegion(0,0,LCD_WIDTH-1,LCD_HEIGHT-1);
    LCD_WR_CMD(0x2C);
    for(i=0;i<LCD_HEIGHT;i++)
    for(m=0;m<LCD_WIDTH;m++)
    {        
      LCD_WR_Byte16Bit(color);
    }   
}


//向液晶屏写一个16位数据
void LCD_WR_Byte16Bit(u16 data)
{
        u8 bit8,DATAH,DATAL;
        DATAH=(data>>8);
        DATAL=(data&0xff);
        LCD_RS=1;
        LCD_CS=0;                               
        for(bit8=0;bit8<8;bit8++)
        {
                LCD_SCLK=0;
                if((DATAH&0x80)==0x80)
                        LCD_SDIN=1;
                else
                        LCD_SDIN=0;
                        LCD_SCLK=1;
                        DATAH=(DATAH<<1);
        }
        LCD_CS=1;

        LCD_CS=0;
        for(bit8=0;bit8<8;bit8++)
        {
                LCD_SCLK=0;
                if((DATAL&0x80)==0x80)
                LCD_SDIN=1;
                else
                LCD_SDIN=0;
                LCD_SCLK=1;
                DATAL=(DATAL<<1);

        }
        LCD_CS=1;
}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-4-13
在线时间
7 小时
 楼主| 发表于 2018-10-22 23:07:07 | 显示全部楼层
本帖最后由 liunan 于 2018-10-22 23:14 编辑

我怀疑是初始化的寄存器设置问题查询手册发现 寄存器0X36 这个值时控制扫平方向和RGB模式的设置的也正确,找不到问题呀C:\Users\liuhuan\Desktop\594c79d72c90874bd3c7a9cd10bcb4c.png

数据手册关于0x36寄存器的描述

数据手册关于0x36寄存器的描述
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-1-2
在线时间
0 小时
发表于 2019-1-2 17:11:46 | 显示全部楼层
liunan 发表于 2018-10-22 23:07
我怀疑是初始化的寄存器设置问题查询手册发现 寄存器0X36 这个值时控制扫平方向和RGB模式的设置的也正确, ...

楼主这个问题解决了吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-10-28
在线时间
5 小时
发表于 2019-11-27 19:04:16 | 显示全部楼层
LCD_WR_CMD(0x36); //MX, MY, RGB mode
     LCD_WR_Byte(0xC8);  //0x68
改成C8改成C0试试
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2018-12-5
在线时间
43 小时
发表于 2019-12-9 11:41:45 | 显示全部楼层
我也遇到了同样的问题,请问楼主解决了吗?在线等,急。感谢
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-23
在线时间
6 小时
发表于 2019-12-13 13:42:07 | 显示全部楼层
试一下 0x36   数值改成 0x70 ,然后 不要开启 0x21 反相,今天刚实验好
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-5-6
在线时间
9 小时
发表于 2020-4-21 01:38:16 | 显示全部楼层
这样就好了

void WriteInitCMD(void){
        WriteComm(0x11);//Sleep exit
        delay_ms (120);
               
        //ST7735R Frame Rate
        WriteComm(0xB1);
        WriteData(0x01);
        WriteData(0x2C);
        WriteData(0x2D);

        WriteComm(0xB2);
        WriteData(0x01);
        WriteData(0x2C);
        WriteData(0x2D);

        WriteComm(0xB3);
        WriteData(0x01);
        WriteData(0x2C);
        WriteData(0x2D);
        WriteData(0x01);
        WriteData(0x2C);
        WriteData(0x2D);
        
        WriteComm(0xB4); //Column inversion
        WriteData(0x07);
        
        //ST7735R Power Sequence
        WriteComm(0xC0);
        WriteData(0xA2);
        WriteData(0x02);
        WriteData(0x84);
        WriteData(0xC1);
        WriteData(0xC5);

        WriteComm(0xC2);
        WriteData(0x0A);
        WriteData(0x00);

        WriteComm(0xC3);
        WriteData(0x8A);
        WriteData(0x2A);
        WriteComm(0xC4);
        WriteData(0x8A);
        WriteData(0xEE);
        
        WriteComm(0xC5); //VCOM
        WriteData(0x0E);
        
        WriteComm(0x36); //MX, MY, RGB mode
#ifdef USE_LANDSCAPE
        Lcd_WriteData(0xA8); //竖屏C8 横屏08 A8
#else
        WriteData(0xC8); //竖屏C8 横屏08 A8
#endif               
        //ST7735R Gamma Sequence
        WriteComm(0xe0);
        WriteData(0x0f);
        WriteData(0x1a);
        WriteData(0x0f);
        WriteData(0x18);
        WriteData(0x2f);
        WriteData(0x28);
        WriteData(0x20);
        WriteData(0x22);
        WriteData(0x1f);
        WriteData(0x1b);
        WriteData(0x23);
        WriteData(0x37);
        WriteData(0x00);         
        WriteData(0x07);
        WriteData(0x02);
        WriteData(0x10);

        WriteComm(0xe1);
        WriteData(0x0f);
        WriteData(0x1b);
        WriteData(0x0f);
        WriteData(0x17);
        WriteData(0x33);
        WriteData(0x2c);
        WriteData(0x29);
        WriteData(0x2e);
        WriteData(0x30);
        WriteData(0x30);
        WriteData(0x39);
        WriteData(0x3f);
        WriteData(0x00);
        WriteData(0x07);
        WriteData(0x03);
        WriteData(0x10);  
        
        WriteComm(0x2a);
        WriteData(0x00);
        WriteData(0x00+2);
        WriteData(0x00);
        WriteData(0x80+2);

        WriteComm(0x2b);
        WriteData(0x00);
        WriteData(0x00+3);
        WriteData(0x00);
        WriteData(0x80+3);
        
        WriteComm(0xF0); //Enable test command  
        WriteData(0x01);
        WriteComm(0xF6); //Disable ram power save mode
        WriteData(0x00);
        
        WriteComm(0x3A); //65k mode
        WriteData(0x05);
        
        
        WriteComm(0x29);//Display on
}
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-11-8
在线时间
17 小时
发表于 2020-7-2 08:44:47 | 显示全部楼层
一行一行刷屏太慢了,怎样全屏快速刷
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 19:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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