显示图片
一般用Img2Lcd软件进行取模,配置如下
取模出的.c文件数组元素的个数通常为宽*高*2,这是因为LCD的颜色命令为16位数据,而取模出的为8位数据,需要两个数组元素组成一个点的颜色数据,即(p[i]<<8)|p[i+1],先通过Lcd_SetRegion函数确定图像范围,再将每一个点的颜色数据送入LCD
/*************************************************
函数名:LCD_Set_Region
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
void Lcd_SetRegion(uint x_start,uint y_start,uint x_end,uint y_end)
{
/*#ifdef
USE_LANDSCAPE//使用横屏模式
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(x_start+3);
Lcd_WriteData(0x00);
Lcd_WriteData(x_end+3);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(y_start+2);
Lcd_WriteData(0x00);
Lcd_WriteData(y_end+2);
*/
//#else//竖屏模式
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(x_start+2);
Lcd_WriteData(0x00);
Lcd_WriteData(x_end+2);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(y_start+3);
Lcd_WriteData(0x00);
Lcd_WriteData(y_end+3);
//#endif
Lcd_WriteIndex(0x2c);
}
//显示图片
//x,y:起点坐标
//width,height:区域大小
//*p:图片起始地址
//高位在前
void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t width,uint16_t height,const unsigned char *p)
{
uint16_t i=0,j=0;
uint16_t pcolor = 0;
//设置显示区域
//设置光标位置(0x2A 0x2B)
Lcd_SetRegion(x,y,x+width-1,y+height-1);
//TFTLCD->LCD_REG=lcddev.wramcmd;//开始写入GRAM(0x2C)
for(j=0;j<height;j++)
{
for(i=0;i<width;i++)
{
pcolor = (*p<<8)|(*(p+1));
LCD_WriteData_16Bit(pcolor); //写显示颜色
p+=2;
}
}
}
显示汉字字符
/*************************************************
函数名:LCD_ShowChar
功能:写字符函数,阴码,高位在前,逐行式
入口参数:x,y:起始位置;*p:字符指针
返回值:无
*************************************************/
void LCD_ShowChar(uint x,uint y,uint16_t width,uint16_t heigth,const unsigned char *p,uint16_t char_color)
{
//uchar a;
int i,j;
uint new_x,new_y;
//Lcd_SetRegion(x,y,x+width-1,y+heigth-1);
for(j=0;j<(width*heigth/8);j++)
{
for(i=0;i<8;i++)
{
new_y=y+(j*8+i)/width;
new_x=x+(j*8+i)%width;
//a=*p;
if(((*p<<i)&0x80)==0x80)
//LCD_WriteData_16Bit(char_color); //写显示颜色
{
Gui_DrawPoint(new_x,new_y,char_color);
}
//else
//LCD_WriteData_16Bit(back_color);
}
p++;
}
//LCD_ShowPicture(0,0,70,63,gImage_beidou);
}
PCtoLCD2002软件设置如下
取模出的16进制数代表了,8个像素点的亮灭,取模得到一个16进制数时,要判断从高位到低位,第几位是1,并在那一位写入颜色命令,根据字模大小,以16*16汉字为例,,一行需要2个16进制数表示,一共有16行,利用for(j=0;j<(width*heigth/8);j++)判断在第几个16进制数时需要写入颜色,再用for(i=0;i<8;i++){if(((*p<<i)&0x80)==0x80)第几个点,利用new_y=y+(j*8+i)/width;new_x=x+(j*8+i)%width;确定点的坐标
之所以不像图片那样用Lcd_SetRegion函数,是因为,这个函数要求范围内每一个点都要写颜色,这样导致汉字再图片上显示不方便;
这个函数应该可以适用任意大小字符,如果不行,请留言一起学习。
void LCD_ShowString(uint x,uint y,uint16_t width,uint16_t heigth,const unsigned char *p,uint16_t char_color,uint16_t longth)
{
int i;
for(i=0;i<longth;i++)
{
LCD_ShowChar(x+i*width,y,width,heigth,p+((width/8*heigth)*i),char_color);
}
}
字符串函数基于字符函数编写
唉,写的好麻烦,自己明白和写出来根本不是一回事儿
这是结果图