OpenEdv-开源电子网

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

使用ILI9340驱动不正常,请大神解答一下

[复制链接]

5

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2014-2-27
在线时间
67 小时
发表于 2023-5-24 11:48:27 | 显示全部楼层 |阅读模式
本帖最后由 zhilve 于 2023-5-24 11:52 编辑

我在驱动ILI9340的时候,出现问题,在显示字符串的时候,发现如果每次画点的时候不发送坐标给屏幕,就会出现乱码
以下代码是正常使用的,每次画点的时候,发送了XY坐标
代码如下
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t chr,uint8_t size1,int color,int Bcolor)
{
        //x = X_MAX_PIXEL - x;
        //y = Y_MAX_PIXEL - y;
//        int tsendcol[1000];//-- 发送数组
//        int tsendcolsing = 0;//-- 发送数组标志
        uint16_t i,m,temp,size2,chr1;
        uint16_t x0=x,y0=y;
        if(size1==8)size2=6;
        else size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占的字节敿
        chr1=chr-' ';  //计算偏移后的倿
        //-- 对100号字体做限制
        if (size1 == 100)//-- 100号字体是从0开始的
        {
        
                if (chr == ' ')//-- 空格
                {
                        chr1 = 10;
                }
                else
                if (chr == '.')//-- 小数点
                {
                        chr1 = 11;
                }
                else
                        if ((chr >= '0')&&(chr <= '9'))
                        {
                                chr1=chr-'0';  //计算偏移后的倿
                        }
                        else
                        {
                                chr1 = 10;
                        }
        
                //chr1=chr-'0';  //计算偏移后的倿
        }
        Lcd_SetRegion(x, y, x + size1/2-1,y+size1-1);
                for(i=0;i<size2;i++)
                {
                if(size1==8)
                {temp=asc2_0806[chr1];} //调用0806字体
                else if(size1==12)
                {temp=asc2_1206[chr1];} //调用1206字体
                else if(size1==16)
                {temp=asc2_1608[chr1];} //调用1608字体
                else if(size1==24)
                {temp=asc2_2412[chr1];} //调用2412字体
                else if(size1==48)
                {temp=asc2_4824[chr1];} //调用4824字体
                else if(size1==100)
                {temp=asc2_10050[chr1];} //调用10050字体 100号字使
                else return;
               
                for(m=0;m<8;m++)
                {
                        
                        if(temp&0x01 != 0)draw_point(x,y,color);
                        else draw_point(x,y,Bcolor);
//                         if(temp&0x01)Lcd_WriteData_16Bit(color);
//                         else Lcd_WriteData_16Bit(Bcolor);
                        
                        temp>>=1;
                        y++;
                }
                 x++;
                 if((size1!=8)&&((x-x0)==size1/2))
                 {x=x0;y0=y0+8;}
                 y=y0;
        }
        Lcd_SetRegion(0, 0, X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
}

此时显示是正常的,但是如果发送点的时候,把坐标去掉就会出现乱码
                        if(temp&0x01 != 0)draw_point(x,y,color);
                        else draw_point(x,y,Bcolor);
替换掉,用下面的代码
                        if(temp&0x01)Lcd_WriteData_16Bit(color);
                        else Lcd_WriteData_16Bit(Bcolor);
微信截图_20230524113708.png 微信截图_20230524113644.png
可以看到,显示乱码了,但是仔细看右侧显示的0.000,显示的时候是0被切成两半并且横放了,

代码经过如下测试并没有效果
1.怀疑开窗口错误,经检查并没有,开窗口是对的
2.屏幕方向设置错误,
Lcd_WriteIndex(0x36);//-- 设置RGB占位大小,和刷新方向,去掉后颜色不正帿
        //
        /*
        D7:MY(行扫描顺序),0表示从上到下,1表示从下到上
        D6:MX(列扫描顺序),0表示从左到右,1表示从右到左
        D5:MV(RGB排列顺序),0表示RGB,1表示BGR
        D4:ML(扫描方式),0表示从上到下,从左到右,1表示从上到下,从右到左
        D3-D0:RGB像素格式,0000表示16位565格式,其他为RGB格式,可以根据自己的需要进行设置。
        */
        if (LCDHORIZONTAL == TRUE)
        {
                Lcd_WriteData(0X40);//-- A液晶正方向显示
                //Lcd_WriteData(0X80);//-- A液晶旋转180度
        }
        else
        {
                Lcd_WriteData(0X20);//-- B液晶旋转180度显示
                //Lcd_WriteData(0XE0);//-- B液晶正方向显示
        }

经测试,我看别人家发送的都不是这行参数,而我的智能使用这几个才正常。

提问1:我现在怀疑是开窗没错,但是LCD把内存放到现实,刷新方式不对,请问我应该往那边测试?
提问2:我现在使用直接SPI刷新,发现,如果向LCD发送过快,会导致白屏或者花屏
void LCD_SPI_WriteByte(uint8_t data)
{

         (hspi22.Instance->DR)=data;        

        for (uint8_t i = 0 ; i < 5; i ++)//-- 去掉检查标志位,使用硬延时_4是极限,如果花屏,需要改大&#12351;
        {

        }
        
}

必须等待5个周期,如果是4,屏幕是花屏,如果4以下直接白屏了。5或者以上是正常,但是这样刷屏太慢了。

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

使用道具 举报

5

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2014-2-27
在线时间
67 小时
 楼主| 发表于 2023-5-26 18:30:56 | 显示全部楼层
顶一下,我现在怀疑是生成的字体扫描方向不对,有这个可能吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 09:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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