void fun

本文介绍了一种用于嵌入式系统的中英文混合显示函数,该函数支持自动换行并能在指定区域内显示字符串。文章详细解释了如何根据不同字体大小获取字符点阵数据,并展示了如何在屏幕上绘制这些字符。
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{                   
    u16 x0=x;
    u16 y0=y;                                 
    u8 bHz=0;     //×Ö·û»òÕßÖÐÎÄ                                                  
    while(*str!=0)//Êý¾Ýδ½áÊø
    { 
        if(!bHz)
        {
            if(*str>0x80)bHz=1;//ÖÐÎÄ 
            else              //×Ö·û
            {      
                if(x>(x0+width-size/2))//»»ÐÐ
                {                  
                    y+=size;
                    x=x0;      
                }                               
                if(y>(y0+height-size))break;//Ô½½ç·µ»Ø      
                if(*str==13)//»»ÐзûºÅ
                {         
                    y+=size;
                    x=x0;
                    str++; 
                }  
                else LCD_ShowChar(x,y,*str,size,mode);//ÓÐЧ²¿·ÖдÈë 
                str++; 
                x+=size/2; //×Ö·û,Ϊȫ×ÖµÄÒ»°ë 
            }
        }else//ÖÐÎÄ 
        {     
            bHz=0;//Óкº×Ö¿â    
            if(x>(x0+width-size))//»»ÐÐ
            {       
                y+=size;
                x=x0;         
            }
            if(y>(y0+height-size))break;//Ô½½ç·µ»Ø                               
            Show_Font(x,y,str,size,mode); //ÏÔʾÕâ¸öºº×Ö,¿ÕÐÄÏÔʾ 
            str+=2; 
            x+=size;//ÏÂÒ»¸öºº×ÖÆ«ÒÆ        
        }                        
    }   
}                    
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{           
    unsigned char qh,ql;
    unsigned char i;                      
    unsigned long foffset; 
    u8 csize=(size/8+((size%8)?1:0))*(size);//µÃµ½×ÖÌåÒ»¸ö×Ö·û¶ÔÓ¦µãÕó¼¯ËùÕ¼µÄ×Ö½ÚÊý     
    qh=*code;
    ql=*(++code);
    if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//·Ç ³£Óúº×Ö
    {               
        for(i=0;i<csize;i++)*mat++=0x00;//Ìî³äÂú¸ñ
        return; //½áÊø·ÃÎÊ
    }          
    if(ql<0x7f)ql-=0x40;//×¢Òâ!
    else ql-=0x41;
    qh-=0x81;   
    foffset=((unsigned long)190*qh+ql)*csize;   //µÃµ½×Ö¿âÖеÄ×Ö½ÚÆ«ÒÆÁ¿          
    switch(size)
    {
        case 12:
            SPI_Flash_Read(mat,foffset+ftinfo.f12addr,24);
            break;
        case 16:
            SPI_Flash_Read(mat,foffset+ftinfo.f16addr,32);
            break;
        case 24:
            SPI_Flash_Read(mat,foffset+ftinfo.f24addr,72);
            break;

    }                                                       
}  
//ÏÔʾһ¸öÖ¸¶¨´óСµÄºº×Ö
//x,y :ºº×ÖµÄ×ø±ê
//font:ºº×ÖGBKÂë
//size:×ÖÌå´óС
//mode:0,Õý³£ÏÔʾ,1,µþ¼ÓÏÔʾ       
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
    u8 temp,t,t1;
    u16 y0=y;
    u8 dzk[72];   
    u8 csize=(size/8+((size%8)?1:0))*(size);//µÃµ½×ÖÌåÒ»¸ö×Ö·û¶ÔÓ¦µãÕó¼¯ËùÕ¼µÄ×Ö½ÚÊý     
    if(size!=12&&size!=16&&size!=24)return; //²»Ö§³ÖµÄsize
    Get_HzMat(font,dzk,size);   //µÃµ½ÏàÓ¦´óСµÄµãÕóÊý¾Ý 
    for(t=0;t<csize;t++)
    {                                                      
        temp=dzk[t];            //µÃµ½µãÕóÊý¾Ý                          
        for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
            else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR); 
            temp<<=1;
            y++;
            if((y-y0)==size)
            {
                y=y0;
                x++;
                break;
            }
        }    
    }  
}
//ÔÚÖ¸¶¨Î»ÖÿªÊ¼ÏÔʾһ¸ö×Ö·û´®      
//Ö§³Ö×Ô¶¯»»ÐÐ
//(x,y):ÆðÊ¼×ø±ê
//width,height:ÇøÓò
//str  :×Ö·û´®
//size :×ÖÌå´óС
//mode:0,·Çµþ¼Ó·½Ê½;1,µþ¼Ó·½Ê½                 
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{                   
    u16 x0=x;
    u16 y0=y;                                 
    u8 bHz=0;     //×Ö·û»òÕßÖÐÎÄ                                                  
    while(*str!=0)//Êý¾Ýδ½áÊø
    { 
        if(!bHz)
        {
            if(*str>0x80)bHz=1;//ÖÐÎÄ 
            else              //×Ö·û
            {      
                if(x>(x0+width-size/2))//»»ÐÐ
                {                  
                    y+=size;
                    x=x0;      
                }                               
                if(y>(y0+height-size))break;//Ô½½ç·µ»Ø      
                if(*str==13)//»»ÐзûºÅ
                {         
                    y+=size;
                    x=x0;
                    str++; 
                }  
                else LCD_ShowChar(x,y,*str,size,mode);//ÓÐЧ²¿·ÖдÈë 
                str++; 
                x+=size/2; //×Ö·û,Ϊȫ×ÖµÄÒ»°ë 
            }
        }else//ÖÐÎÄ 
        {     
            bHz=0;//Óкº×Ö¿â    
            if(x>(x0+width-size))//»»ÐÐ
            {       
                y+=size;
                x=x0;         
            }
            if(y>(y0+height-size))break;//Ô½½ç·µ»Ø                               
            Show_Font(x,y,str,size,mode); //ÏÔʾÕâ¸öºº×Ö,¿ÕÐÄÏÔʾ 
            str+=2; 
            x+=size;//ÏÂÒ»¸öºº×ÖÆ«ÒÆ        
        }                        
    }   
}                    
//ÔÚÖ¸¶¨¿í¶ÈµÄÖмäÏÔʾ×Ö·û´®
//Èç¹û×Ö·û³¤¶È³¬¹ýÁËlen,ÔòÓÃShow_StrÏÔʾ
//len:Ö¸¶¨ÒªÏÔʾµÄ¿í¶È            
void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len)
{
    u16 strlenth=0;
    strlenth=strlen((const char*)str);
    strlenth*=size/2;
    if(strlenth>len)Show_Str(x,y,lcddev.width,lcddev.height,str,size,1);
    else
    {
        strlenth=(len-strlenth)/2;
        Show_Str(strlenth+x,y,lcddev.width,lcddev.height,str,size,1);
    }
}   




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andrewbytecoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值