关于8266点亮TFT彩屏的一系列问题( 自动重启,lmg2Lcd V2.9取模显示失真 )

作为一个电子爱好者,没有系统学习基础,一切靠自己瞎琢磨,纯属个人兴趣。故一步一个坑,坑坑不一样。。

硬件:单片机:ESP12F, 

          屏幕:1.77" TFT彩屏(RGB 160x128) 

问题1:ESP12F反复重启,串口监视器提示  Soft WDT reset          Exception (4) :

经查询是软件看门口复位,那么猜想是LOOP函数里有问题。由于屏幕商家给的例程是STM32单片机的,故需进行程序移植,本人使用的arduino IDE。程序移植后的LOOP函数如下;

void loop() { 

    TFT_full(RED);  //全屏红
    delay(5000);
    TFT_full(GREEN);  // 全屏绿
    delay(5000);
    TFT_full(BLUE);  //全屏蓝
    delay(5000);
    TFT_clear();   //全屏清除
    delay(5000);
    display_char16_16(16,64,RED,china_char[0]); //汉字显示
    display_char16_16(32,64,GREEN,china_char[1]);//汉字显示
    display_char16_16(48,64,BLUE,china_char[2]);//汉字显示
    display_char16_16(64,64,0XFFFF,china_char[3]);//汉字显示
    display_char16_16(80,64,BLUE,china_char[4]);//汉字显示
    display_char16_16(96,64,GREEN,china_char[5]);//汉字显示
    display_char16_16(112,64,RED,china_char[6]);//汉字显示
    display_char16_16(40,80,BLUE,china_char[7]);//汉字显示
    display_char16_16(56,80,GREEN,china_char[8]);//汉字显示
    display_char16_16(72,80,RED,china_char[9]);//汉字显示
    display_char16_16(88,80,BLUE,china_char[10]);//汉字显示
    delay(5000);
    TFT_clear();  //全屏清除
    Picture_display(point);   //显示图片
    delay(30000);

}

经仔细观察,发现每次重启的时间非常稳定,都是“ TFT_full(GREEN);  // 全屏绿 ”函数执行到大概2/3的位置发生了重启,如下图。那么更加怀疑是长时间没有喂狗发生了复位。

于是尝试如下办法:

1.减少每个delay();的时间,看是否是delay时间过长,导致长时间没有喂狗而发生复位。将每个delay改为delay(1000); 下载运行后发现依旧会发生复位重启,不过由于delay的时间变短,重启的位置发生在了第一个“TFT_clear();   //全屏清除”函数快执行完的时候,如下图。

2.在每个delay();函数后面增加喂狗函数ESP.wdtFeed();重新编译下载,故障依旧!!!重启的位置也如上图。    

3.   难道说不看门狗的问题?但串口监视器提示 Soft WDT reset 就是看门口复位啊?! 还是说喂狗的方式有问题或者狗没有喂对?从启动到重启 loop里只运行了TFT_full和 TFT_clear两个函数,那么重点分析这两个函数后尝试在for循环里喂狗没想到程序顺利运行。具体函数如下: 

//全屏显示单色----------------

void TFT_full(unsigned long color) {   
  TFT_ADR_SET();    //行列地址集设置
  for (int ROW = 0; ROW < TFT_LINE_NUMBER; ROW++){  //ROW loop
    for (int column = 0; column < TFT_COLUMN_NUMBER; column++){  //column loop
      TFT_SEND_DATA(color >> 8);
      TFT_SEND_DATA(color);
    }
    ESP.wdtFeed();    //增加的喂狗函数
  }
}


//全屏清除----------------

void TFT_clear(void) {
  TFT_ADR_SET();    //行列地址集设置
  for (int ROW = 0; ROW < TFT_LINE_NUMBER; ROW++){  //ROW loop
    for (int column = 0; column < TFT_COLUMN_NUMBER; column++){  //column loop
      TFT_SEND_DATA(0x00);
      TFT_SEND_DATA(0x00);
      TFT_SEND_DATA(0x00);
    }
    ESP.wdtFeed();    //增加的喂狗函数
  }
}

4.期间趴贴发现有大佬说delay函数里有喂狗机制,尝试用delay(1);替换上面的ESP.wdtFeed(); 程序也能顺利运行!!

5. 那么问题来了,程序从开始运行到重启,期间loop里执行了多次的delay,包括我后面也添加了喂狗函数,为什么还是会触发看门狗复位??把喂狗函数放到loop执行的函数中和直接放到loop中有什么样的区别??

问题2显示图片错乱,看不出显示的是啥。。。。

解决问题1后使用商家提供的例程,可以正常显示,包括纯色,汉字,图片。而使用我自己的图片经过lmg2Lcd V2.9取模后的数据,图片显示错乱。。

如下图,商家例程显示图片(左),我的图片(中),我的图片显示(右)。。  

        

好嘛。。这显示的是个啥? 继续研究例程。。。图片显示函数

//图片显示
void Picture_display(const unsigned char *ptr_pic) {
  unsigned int ROW, column;
  TFT_SEND_CMD(0x2a);   //Column address set
  TFT_SEND_DATA(0x00);  //start column
  TFT_SEND_DATA(0x00 + TFT_COLUMN_OFFSET);
  TFT_SEND_DATA(0x00);  //end column
  TFT_SEND_DATA(PIC_LEN - 1 + TFT_COLUMN_OFFSET);

  TFT_SEND_CMD(0x2b);   //Row address set
  TFT_SEND_DATA(0x00);  //start row
  TFT_SEND_DATA(0x00 + TFT_LINE_OFFSET);
  TFT_SEND_DATA(0x00);  //end row
  TFT_SEND_DATA(PIC_HIG - 1 + TFT_LINE_OFFSET);
  TFT_SEND_CMD(0x2C);                  //Memory write

  for (ROW = 0; ROW < PIC_HIG; ROW++)  //ROW loop
  {

    for (column = 0; column < PIC_LEN; column++)  //column loop
    {
      TFT_SEND_DATA(*ptr_pic++);
      TFT_SEND_DATA(*ptr_pic++);
    }
   ESP.wdtFeed();    //增加的喂狗函数
   //delay(1);
  }
}

仔细观察for循环中用到了两个常量PIC_LEN和PIC_HIG,分别对应了图片的长和高。定义时这两个常量的值都是120,因为例程图片的大小为120x120像素。而lmg2Lcd V2.9取模转换后的图像大小为121x160像素,如下图所示。从而造成行循环和列循环次数与图像的长和高对应不上,造成像素显示错位。。。。

将PIC_LEN和PIC_HIG的值分别改为图片的长高值即可解决问题。

//定义常用颜色
#define RED 0XF800
#define GREEN 0X07E0
#define BLUE 0X001F

//定义图片长 高
//#define PIC_LEN 120  //原来值
//#define PIC_HIG 120  //原来值     
#define PIC_LEN 121    //新图片长
#define PIC_HIG 160    //新图片高   

问题3显示图片失真,能看出轮廓,但失真严重。。

       

这像鬼一样的显示的是啥? 这不是我心目中的赵丽颖!!这不是!!!

根据例程分析一下显示屏的RGB原理吧,

1.例程里定义了 

        红色为0xF800 对应的二进制为 1111 1000 0000 0000;(前5位)

        绿色为0x07E0 对应的二进制为 0000 0111 1110 0000; (中6位)

        蓝色为0x001F 对应的二进制为 0000 0000 0001 1111; (后5位)

        那么每个像素都应该对应了一个16位的数据;

2.     图片显示函数Picture_display里每个column loop列循环里发送了2次8位数据;

        那么图片数组里的前两个数据应该对应了图片的第一个像素。

3.    官方例程的图片数组为:

const unsigned char  picture_tab[]={0X8D,0X62,0X8D,0X42,0X85,0X01................

        那么0x8D和0x62对应颜色为第一个像素颜色——绿色(根据问题2中的第一张图目测。。。)

4.   验证3猜想,

        0x8D转为二进制为 1000 1101,   0x62转为二进制为 0110 0010。  两数据先后一起发送,那么发送的数据为1000 1101 0110 0010;前5位为红色,中间6位为绿色,后5位为蓝色。

        将各颜色转换为RGB数值:  

        红 ---  10001(前5位)转为十进制为17,11111转为十进制为31,那么 红 的RGB值为17/31*255 = 138.9 。取整140;

        绿 ---  101011(中6位)转为十进制为43,111111转为十进制为63,那么 绿 的RGB值为43/63*255 = 174.01。取整174;

        蓝 ---  00010(后5位)转为十进制为2, 11111转为十进制为31,那么 蓝 的RGB值为2/31*255 = 16.45 。取整16;

由上可得0x8D和0x62对应的RGB值为 140.170.16。 将次值输入到画图软件的颜色编辑工具中可看到颜色确实与例程显示图片左上角颜色相差无几。

由此可知,上述猜想及公式正确。那么也可通过提取图片的颜色,反向计算出图片数组的数值,从而验证lmg2Lcd V2.9取模的数据的正确性。

以下为操作步骤,

用windows自带画图软件打开图片——图片放大至最大——移动到图片左上角第一个像素点——使用颜色选取器提取第一像素点颜色——点击编辑颜色查看RGB数值。如图

如图,提取的颜色值为104.61.42;按照上面的方法反向计算

红 ---104/255*31 = 12.6 取整13,转换二进制为 01101(5位)

绿 ---61/255*63 = 15.07 取整15,转换二进制为 001111(6位)

蓝 ---42/255*31 = 5.10 取整5, 转换二进制为 00101 (5位)

得出对应的16位二进制数据为0110 1001 1110 0101;转换为两个8位数据位0x69,0xE5。

那么lmg2Lcd V2.9取模得到得数据第一组应为0x69,0xE5。

查看lmg2Lcd V2.9取模数据:

const unsigned char gImage_mypic1[38720] = { /*0X00,0X10,0X79,0X00,0XA0,0X00,0X01,0X1B, */
0XE5,0X69,0XE4,0X69,0X04,0X6A,0X05,0X6A,0X04,0X6A,0X05.............

多么显眼得问题啊!!计算第一组数据应为0x69,0xE5 而实际lmg2Lcd V2.9取模得到得数据为0XE5,0X69!! 两个数据位置竟然是颠倒的!! 怪不得显示图片会失真。。

问题找到了,下面解决问题!经研究发现lmg2Lcd V2.9 左下角有个“高位在前”的选框,果断打上钩试试。问题完美解决!所有数据的位置都颠倒过来了,图片也显示正常了。

const unsigned char gImage_mypic1[38720] = { /* 0X10,0X10,0X00,0X79,0X00,0XA0,0X01,0X1B, */
0X69,0XE5,0X69,0XE4,0X6A,0X04,0X6A,0X05,0X6A,0X04,0X6A,0X05,0X72,0X05,0X72,0X25..........

另外提一句,mg2Lcd V2.9 左下角的“包含图像头数据”打钩后,会将数据组中的第一行8个数据的注释去掉,成为真正的数据。这时要改写显示函数,否则也会造成图像错位。。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值