stm32驱动ili9486液晶显示屏

  这是我接手的第一个小项目,也是第一次我写的代码真正排上用场,虽然不超过50行。但遇到的阻碍,我想确实硬件厂商善意的刁难。这个项目最大的收获是弄清楚我与软件工程师最大的不同吧!给我职业生涯上的第一个教训。下面言归正传(驱动见51hei论坛附件TFT资料)。 

  (一)ili9486显示屏简介
           ili9486支持262144种色彩,有320RGB*480个像素点,内部GRAM345600Bytres(320*480*18bit),有全彩(262K_colors,65K_colors)和idle(8_colors)两种显示模式,支持8种总线,用IM2,IM1,IM0决定,见下图        

                   stm32驱动ili9486液晶显示屏_第1张图片 
支持16bit-RGB(5,6,5)和18bit-RGB(6,6,6)两种色彩格式,也用单一纯色格式(in idle mode)。

    (二)常用命令
          显示屏的需求,最多的还是在怎样满足我们的显示要求,比如横屏,竖屏,颜色格式,刷屏速度等等。这里只稍微讲一下在此次项目中用到的命令,慢慢补充。
          1)与坐标原点相关的命令:
               1.Display Function Control(B6h)
                  命令主要参数:GS,SM,SS
               2.Memory Access Control (36h)
                  命令主要参数:MX,MY,MV,BGR(色彩模式RGB or GBR),MH,ML

         2)设置指针位置
              1.Set Page Address (2Bh)
                 设置指针X起点, 默认情况为0~13F(B5= 0),受36h的第五位(B5)影响0~1DF(B5 = 1)

              2.Set Column Address (2Ah)
                  设置指针Y起点, 默认情况为0~1DF(B5= 0),受36h的第五位(B5)影响0~13F(B5 = 1)

         3)设置像素格式
              1. Interface Pixel Format(3Ah)
                 设置是16bit或则18bit的像素。DPI设置接口像素格式,DBI设置CPU像素格式

         4)连续写
              1.Memory Write Continue (3Ch)
                  要在使用Memory Write (2Ch)后使用此命令,最多能连续读取65535个字节。     

      (三)与uCUI接口相关函数
stm32驱动ili9486液晶显示屏_第2张图片 
              接口函数在GUI/LCDDriver文件夹下LCD_Dummy.c以及Config目录下LCDConfig.h。

              1. LCD_Dummy.c主要是接口相应显示屏

                  1--void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 设置像素点,要使用自己的函数实现设置像素点功能。下面一个简单的例子:
                 void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 
                {
                   LCD_Setpixel(xPhys, yPhys,PixelIndex);//底层TFT相关的函数(可以转换XY的值,达到想要的效果)
                }   

                  2--void LCD_L0_DrawVLine  (int x,  int y0,  int y1)//画横线
                  3--void LCD_L0_DrawHLine  (int x0, int y,  int x1)//画竖线
                  注:这两个函数,可以不用替换,uCGUI默认情况下给一个坐标,画一个像素点(速度慢,但准确,无差错)。如果你觉得你使用自己的函数更加快速,可进行替换(ili9486有自动移动指针的功能,可以只送一个起始点,然后送数据,指针会自动加也会自动换行(列),而不用送坐标地址)

                  4--LCD_L0_DrawBitmap(...)//画位图
                  5--DrawBitLine16BPP(...)//画位图主要功能函数
                  注:这两个函数底层功能函数与2,3两个函数类似,但色彩不同。自行替换时要注意相关参数。

              2.LCDConfig.h需修改如下项

              #define LCD_XSIZE                 (480)   /* X-resolution of LCD, Logical coor. */
              #define LCD_YSIZE                  (350)   /* Y- resolution of LCD, Logical coor. */
              #define LCD_BITSPERPIXEL      (16)     //像素点位数
              #define LCD_CONTROLLER       -1        // -1表示不在GUI_Init()里面初始化显示屏 
              #define LCD_SWAP_RB             1        // 1--BGR 0--RGB
              #define LCD_MIRROR_X           (1)      //0 If active: X ->-X /1--翻转X轴起点
              #define LCD_MIRROR_Y           (0)      //0 If active: Y -> -Y /1--翻转Y轴起点
              #define LCD_SWAP_XY             1        //0  If active: X <->Y/1--调换XY的值

      (四)FAQ
                1.显示颜色不对,而图像轮廓正确
                              1)这个问题最常见的是RB调换,TFT显示屏常见的像素格式为BGR(5,6,5),而一般的windows的格式为RGB(5,6,5),这个问题只要转换Memory Access Control(36h)命令BGR参数即可。
                               2)第二个可能原因是由于高低字节的问题,这款ili9486的显示屏为低字节在前,高字节在后,可以在送数据到显示屏之前将数据转换一下。
                               3)如果以上步骤没有将颜色的问题解决,考虑显示屏质量问题或者屏幕焊接问题(换块显示屏试试)。

                 2.背景图显示不正确,没有完整的图像
                               1)这个问题主要是取图像大小时出错,如果要铺满整个屏幕的话,图像一定要与显示屏规格相同,例如:ili9486是320*480,所以你的图像大小也要为320*480或者横屏480*320,不能多也不能少,否则不会正确显示图像。

                 3.图像无法整屏显示,或者是整屏显示需要更多的像素点
                               1)这个问题很有可能是总线模式选择错误,ili9486支持多种纵向模式8、9、16、18以及3/4SPI等等,总线模式取决于IM[2:0]的选择,详细内容请参考相关数据手册。
                               2)还有一个可能是数据在传输的过程中丢失了(因为传输速度过快/频率太高),可以每传送一次数据,延时一段时间,观察有没有出现漏点的情况(对比色要鲜明),或者调整频率,让送数据的速度变慢些(不太建议这样做,因为频率low,可能导致其他问题出现,频率high也是)。

                 4.屏幕总是白屏,而无法显示其他内容
                                1)这问题最有可能是因为屏幕的显示模式不正确,极有可能处在idle模式下,加入命令0x0011(退出idle模式,进入normal模式)可解决。

                 5. 颜色抖动现象
                                1)这个问题最有可能的是电路上的问题,可以尝试重新焊接一下。

       (五)测试
                 1.颜色测试:让显示屏显示出三原色的三种纯色,三种颜色正确,基本不会出现颜色问题,若出现颜色问题,考虑硬件上的问题。

                 2.刷屏测试:用320*480个像素点刷屏,如果能铺满整屏,总线模式正确。反之模式不正确。


注意:
3.5_TFT彩色LCD模块 驱动芯片型号为SSD2119

3.2_TFT彩色LCD模块 驱动芯片型号为ILI9320

2.8_TFT彩色LCD模块 驱动芯片型号为ST7781、ILI9325、ILI9328、或ILI9331。具体是哪种控制芯片可以在UCGUI程序里初始化LCD程序的读ID函数里下个断点即可看到器件ID号。 

驱动程序全兼容这些控制芯片,要想详细了解控制芯片请查看目录下的对应芯片数据手册,ILI9328的数据手册请参考ILI9325的。两个是一样的,只是读到的ID不一样,驱动程序也是相同的。

SSD2119    读到的ID为        0x9919
ILI9320    读到的ID为        0x9320
ILI9325    读到的ID为        0x9325
ILI9328    读到的ID为        0x9328
ILI9331    读到的ID为        0x9331
ST7781     读到的ID为        0x7783
LGDP4531   读到的ID为        0x4531
用户可以自己提取对应驱动芯片的初始化文件用到自己的工程中。
 

你可能感兴趣的:(STM32)