正点原子4.3寸电容屏显示任意大小汉字以及图片显示

   今天在做毕业设计时候,为了让内容显示更加好看,我在考虑使用整点原子探索者显示任意大小汉字,发现正点原子的开发板历程中都是通过SD卡内容读取,而且相对来说比较麻烦,下面介绍一种可以通过数据存储少量汉字的方法。
   这个方法是借鉴一个博主的方法,但是他的只能固定显示16*16或者24*24的方法,本来想引用下那位博主的文章,但因为扒的文章太多的情况,我也没有找到,非常感谢这位博主的文章。
    我在这个基础上对函数做了一些修改,可以实现显示任意大小的汉字,但是目前显示的长宽必须相等,不相等的情况我还没尝试过。

首先对PCtoLC2002的设置
在这里插入图片描述
目前这个地方需要注意一点,就是字模每行显示数据的设置和在外框中的设计要一样。
首先贴出函数(此函数是我借鉴博主的原版,非常感谢这位博主)

void Test_Show_DESIGNER_Font24(u16 x,u16 y,u8 index,u16 color)
{                   
    u8 temp,t,t1;
    u16 y0=y;                  
    for(t=0;t<72;t++)//每个24*24的汉字点阵 有72个字节
    {   
        if(t<24)temp=Designer[index*3][t];           //前24个字节
        else if(t<48)temp=Designer[index*3+1][t-24]; //中24个字节                              
        else temp=Designer[index*3+2][t-48];         //后24个字节
        for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)LCD_Draw_Point(x,y,color);//画实心点
            else LCD_Draw_Point(x,y,BACK_COLOR);   //画空白点(使用背景色)
            temp<<=1;
            y++;
            if((y-y0)==24)
            {
                y=y0;
                x++;
                break;
            }
        }    
    }          
}

Designer是我个人命名的二维数组名字,移植时可以进行修改。首先我们对这个函数做一个分析
在这里插入图片描述这是我生成的一组数组,我们首先对这个数组进行一个分析,24*24等于576,总共有72字节的长度。每个字有三行,每行长度是24,所以代码的写法如下

    for(t=0;t<72;t++)//每个24*24的汉字点阵 有72个字节
    {   
        if(t<24)temp=SCHOOL_CLASS[index*3][t];           //前24个字节
        else if(t<48)temp=SCHOOL_CLASS[index*3+1][t-24]; //中24个字节                              
        else temp=SCHOOL_CLASS[index*3+2][t-48];         //后24个字节
        for(t1=0;t1<8;t1++)//处理一个字节

所以当我们想将字体编程48乘48大小时,我们可以做一个类比
在这里插入图片描述
48乘48 字体每行长度是48,总共六行,总共288字节,所以修改后的代码为:

void Test_Show_title_Font48(u16 x,u16 y,u8 index,u16 color)
{                   
    u16 temp,t,t1;
    u16 y0=y;                  
    for(t=0;t<288;t++)//每个48*48的汉字点阵 有288个字节   需要进行六次判断
    {   
        if(t<48)temp=title[index*6][t];           //前48个字节   1
        else if(t<96)temp=title[index*6+1][t-48]; //48~96个字节          2                    
        else if(t<144)temp=title[index*6+2][t-96];         //96~144个字节     3
			   else if(t<192)temp=title[index*6+3][t-144];   //4
			   else if(t<240)temp=title[index*6+4][t-192];   //5
			   else if(t<288)temp=title[index*6+5][t-240];   //6
        for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)LCD_Draw_Point(x,y,color);//画实心点
            else LCD_Draw_Point(x,y,BACK_COLOR);   //画空白点(使用背景色)
            temp<<=1;
            y++;
            if((y-y0)==48)
            {
                y=y0;
                x++;
                break;
            }
        }    
    }          
}

因此我们可以通过这个方法对这个函数修改,可以实现任意大小汉字的显示。

顺便写一下图片的显示函数:
关于图片的配置:
在这里插入图片描述
注意分辨率的大小需要一样,不然会造成显示的图片混乱问题,后续直接调用以下函数既可。

#define LCD_HEIGHT	800  //此处是你的屏幕分辨率
#define LCD_WIDTH  480
/****************************************************
函数名:LCD_DrawPoint
形参:x,y:坐标
返回值:POINT_COLOR:此点的颜色
函数功能:画点函数
****************************************************/
void LCD_DrawPoint_user(u16 x,u16 y,u16 c)
{	 
	LCD_SetCursor(x,y);		//设置光标位置 
	LCD_WriteRAM_Prepare();	//开始写入GRAM
	LCD->LCD_RAM=c; 
}
/**************************************************************************
***** 函数名:   LCD_Show_Photo()
***** 功能:     显示指定大小图片
***** 参数:     x0 开始位置,y0开始位置  ,high高度,width 宽度 ,bmp 图片数据数组
***** 返回值:	 无 
****************************************************************************/
void LCD_Show_Photo(int x0,int y0,int width,int high,const unsigned char photo[])
{
	int x,y;
	u32 c;
	int p = 0;
	
    for( y = y0 ; y < (high+y0) ; y++ )
    {
    	for( x = x0 ; x < (width+x0) ; x++ )
    	{
    		c = photo[p+1] | (photo[p]<<8) ;
				//竖屏
			if ( ( (x) < LCD_WIDTH) && ( (y) < LCD_HEIGHT) )
				//横屏
			//if ( ( (x) < LCD_HEIGHT) && ( (y) < LCD_WIDTH) )
				
			LCD_DrawPoint_user(x,y,c);  
    		p = p + 2 ;
    	}
    }
}

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值