OpenEdv-开源电子网

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

如何自己建立新的ASCII字符库,并且引用到lcd.c工程中基于stem32F103的TFTLCD程序

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-4-2
在线时间
6 小时
发表于 2019-4-7 08:39:11 | 显示全部楼层 |阅读模式
7金钱
    以下是我自己模仿原程序改变的程序:
font.h中编写的
         const unsigned char asc2_6030[2][240]={/*"1",0*/和/*" ",0*/};这两个字符的PCtoLCD2002软件字的大小为60*60的。
lcd.c中编写的         void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode){                                                            
    u8 temp,t1,t;
        u16 y0=y;
        u8 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数        
         num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
        for(t=0;t<csize;t++)
        {   
                if(size==12)temp=asc2_1206[num][t];                  //调用1206字体  
        else if(size==16)temp=asc2_1608[num][t];        //调用1608字体
                else if(size==24)temp=asc2_2412[num][t];        //调用2412字体
        else if(size==60)temp=asc2_6030[num][t];        //调用6030字体                          (这部分是按照上边的格式写的)
                else return;                                                                //没有的字库
                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>=lcddev.height)return;                //超区域了
                        if((y-y0)==size)
                        {
                                y=y0;
                                x++;
                                if(x>=lcddev.width)return;        //超区域了
                                break;
                        }
                }           
        }                                            
}   
main.c中的编写
        POINT_COLOR=RED;         
                LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^");
                LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
                LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
                 LCD_ShowString(30,110,200,16,16,lcd_id);                //显示LCD ID
                LCD_ShowString(30,150,200,60,60,"11111");           //自己写的   其中200这个值的原因不清楚        
            x++;
                if(x==12)x=0;
                LED0=!LED0;                                                   
                delay_ms(1000);        
显示屏结果

         有点阵的轮廓,但没有数字1111

综合:问题1:字符串按照视频教的进行编写是正确的,是lcd.c中的定义有问题?
         问题2: const unsigned char asc2_6030[2][240]={/*"1",0*/和/*" ",0*/};必须是个完整的字符库?










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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2019-4-8 01:46:39 | 显示全部楼层
回复

使用道具 举报

0

主题

164

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2019-4-2
在线时间
4 小时
发表于 2019-4-9 09:10:20 | 显示全部楼层
帮忙顶一顶
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-4-2
在线时间
6 小时
 楼主| 发表于 2019-4-9 15:20:25 | 显示全部楼层
正点原子 发表于 2019-4-8 01:46
可以仿真找下问题

JLINK进行仿真吗?我没买这个下载器
       昨天我又网上参考别人自己写的48*48的汉字,不过没有编成用字库,而是用pctolcd2002编译器编的三个汉字。复制到我的程序中可以显示,然后用他的模板写字符(ASCII)就会乱码。今天我接着用他的模板编写了150*150 的字就可以显示了。 接着我在这个(size=2850,是字符的2倍)的函数下编写了数字0,下载后也能在LCD中显示。
       我自己分析出错的原因:用编写汉字函数的定义,我用来编写数字(0,1,2,3,4,5,6,7,8,9)没有把size赋值为汉字的量(以150*150为例汉字的size=2850),而是 把150*150的    size=1425,结果显示为错。反过来如果不改变size=2850的值,直接在这个定义上编写数字就能显示成功了。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-4-2
在线时间
6 小时
 楼主| 发表于 2019-4-9 15:21:40 | 显示全部楼层

谢谢,我已经初步可以显示出一部分了。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-4-2
在线时间
6 小时
 楼主| 发表于 2019-4-9 15:29:07 | 显示全部楼层
lcd.c下的添加代码

const u8 LiaoShuLong[2][2850]=
{
“我”和“0”};
}:

//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowHZ(u16 x,u16 y,u8 num)
{                                                            
    u8 temp,t1;
    u16 t;
        u16 y0=y;
        //u16 csize=288;   //得到字体一个字符对应点阵集所占的字节数       
    u16 csize=2850;   //得到字体一个字符对应点阵集所占的字节数
        for(t=0;t<csize;t++)
        {   
                temp=LiaoShuLong[num][t];                   
                for(t1=0;t1<8;t1++)
                {                            
                        if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
                        temp<<=1;
                        y++;
                        if(y>=lcddev.height)return;                //超区域了
                        //if((y-y0)==48)
                                if((y-y0)==150)
                        {
                                y=y0;
                                x++;
                                if(x>=lcddev.width)return;        //超区域了
                                break;
                        }
                }           
        }                                            
}
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowHZStr(u16 x,u16 y,u8* pstr)
{                                                            
    u8 temp,t1;
    u16 t;
        u16 y0=y;
        //u16 csize=288;   //得到字体一个字符对应点阵集所占的字节数
    u16 csize=2850;   //得到字体一个字符对应点阵集所占的字节数
    u16 *p=(u16*)pstr;
    u8 num=0;
    while(*p!=0)
    {
        if(*p==0XCEC1)num=0;
        if(*p==0XF7CA)num=1;
        if(*p==0XFAC1)num=2;
        for(t=0;t<csize;t++)
        {   
            temp=LiaoShuLong[num][t];                   
            for(t1=0;t1<8;t1++)
            {                            
                if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
                temp<<=1;
                y++;
                if(y>=lcddev.height)return;                //超区域了
               // if((y-y0)==48)
                      if((y-y0)==150)
                {
                    y=y0;
                    x++;
                    if(x>=lcddev.width)return;        //超区域了
                    break;
                }
            }           
        }
        p++;        
    }        
}

main.c下的代码
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"


/************************************************
ALIENTEK 战舰STM32F103开发板实验13
TFTLCD显示实验  
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
  
  extern void LCD_ShowHZ(u16 x,u16 y,u8 num);
  extern void LCD_ShowHZStr(u16 x,u16 y,u8* pstr);       

  
int main(void)
{         
        u8 x=0;
        u8 lcd_id[12];                        //存放LCD ID字符串
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                             //LED端口初始化
        LCD_Init();
        POINT_COLOR=RED;
        POINT_COLOR=BLUE;   
        LCD_ShowHZ(48,300,1);

        sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
        while(1)
        {                 
            x++;
                if(x==12)x=0;
                LED0=!LED0;                                                    
                delay_ms(1000);       

        }
}       
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-1-12
在线时间
1 小时
发表于 2020-1-12 17:06:24 | 显示全部楼层
for(t=0;t<csize;t++)
        {   
                if(size==12)temp=asc2_1206[num][t];                  //调用1206字体
                else if(size==16)temp=asc2_1608[num][t];        //调用1608字体
                else if(size==24)temp=asc2_2412[num][t];        //调用2412字体
                else if(size==16)temp=asc2_1612[num][t];        //调用1612字体
                else return;                                                                //没有的字库
想问下楼主asc2_1612[num][t];中的数字1612是随便设置还是有所要求?
还有我也是自己加了汉字的库,编译通过了,但是下载到单片机后就显示不出来,这是什么原因啊?
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-5-22
在线时间
14 小时
发表于 2020-4-22 15:10:58 | 显示全部楼层
u8 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数     

这句话是因为原子的是16*8  或者32*16才让(size/2),你60*60这么写就不对了
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2021-7-3
在线时间
30 小时
发表于 2021-7-8 15:31:53 | 显示全部楼层
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
{         
        u8 x0=x;
        width+=x;
        height+=y;
    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!(很重要,只有在ASCII字符集点阵中,在这个范围内才能,对照一下2412,你就知道了)
    {      
        if(x>=width){x=x0;y+=size;}
        if(y>=height)break;//退出
        LCD_ShowChar(x,y,*p,size,1);//0,非叠加显示;1,叠加显示.
        x+=size/2;
        p++;
    }  
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-7-9 02:13:43 | 显示全部楼层
在旷野流浪1 发表于 2019-4-9 15:20
JLINK进行仿真吗?我没买这个下载器
       昨天我又网上参考别人自己写的48*48的汉字,不过没有编成用 ...

JLINK ,STLINK,DAP都可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 11:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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