中级会员
- 积分
- 255
- 金钱
- 255
- 注册时间
- 2014-2-27
- 在线时间
- 67 小时
|
本帖最后由 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);
可以看到,显示乱码了,但是仔细看右侧显示的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是极限,如果花屏,需要改大〿
{
}
}
必须等待5个周期,如果是4,屏幕是花屏,如果4以下直接白屏了。5或者以上是正常,但是这样刷屏太慢了。
|
|