OpenEdv-开源电子网

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

请教原子哥

[复制链接]

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
发表于 2013-7-8 20:39:30 | 显示全部楼层 |阅读模式
我把战舰板的程序移植到7寸屏,还做了点点修改:
//画圆角矩形/填充圆角矩形按钮
//sx,sy,ex,ey:圆角矩形的位置和尺寸
//r:圆角的半径.
//mode:0,画矩形框;1,填充矩形.
//upcolor:上半部分颜色
//downcolor:下半部分颜色
void gui_draw_arcrectangle(u16 sx,u16 sy,u16 ex,u16 ey,u16 r,u8 mode,u16 upcolor,u16 downcolor,u8 *str,u8 size)
{
u16 height=ey-sy+1;
u16 btnxh=0;
if(height%2)btnxh=height+1;//基偶数处理
else btnxh=height;
if(mode)//填充
{
  LCD_Fill(sx+r,sy,ex-r,sy+btnxh/2,upcolor);  //中上
  LCD_Fill(sx+r,sy+btnxh/2,ex-r,ey,downcolor);          //中下
LCD_Fill(sx,sy+r,sx+r,sy+btnxh/2,upcolor);  //左上
LCD_Fill(sx,sy+btnxh/2,sx+r,ey-r,downcolor);  //左下
LCD_Fill(ex-r,sy+r,ex,sy+btnxh/2,upcolor);      //右上
LCD_Fill(ex-r,sy+btnxh/2,ex,ey-r,downcolor);            //右下
}else
{
LCD_DrawLine(sx+r,sy,ex-r,sy+btnxh/2,upcolor);  //上   
LCD_DrawLine(sx+r,sy+btnxh/2,ex-r,ey,downcolor);  //下   
LCD_DrawLine(sx,sy+r,sx+r,sy+btnxh/2,upcolor);  //左上   
LCD_DrawLine(sx,sy+btnxh/2,sx+r,ey-r,downcolor);  //左下   
LCD_DrawLine(ex-r,sy+r,ex,sy+btnxh/2,upcolor);  //右上
LCD_DrawLine(ex-r,sy+btnxh/2,ex,ey-r,downcolor);      //右下   
}
gui_fill_circle(sx+r,sy+r,r,upcolor);    //左上
gui_fill_circle(sx+r,ey-r,r,downcolor);  //左下
gui_fill_circle(ex-r,sy+r,r,upcolor); //右上
gui_fill_circle(ex-r,ey-r,r,downcolor);  //右下
Show_Str_Mid(sx,sy,ex,ey,str,size);     //显示按钮上的文字
}
然后在主程序里显示: gui_draw_arcrectangle(728,180,788,210,4,1,LIGHTBLUE,LIGHTBLUE,"恢复状态",12);
这些都没问题的,能够显示出来,可是当初始坐标SX取值比较大的时候,要显示的字符串u8 *st里只要是数字或字母的就无法显示出来。
比如: gui_draw_arcrectangle(515,300,595,330,4,1,LIGHTBLUE,LIGHTBLUE,"精度为5mm",12);
                这个时候只能显示出“精度为   ”,而“5MM”是空白的,不能显示出来。但是当:
                gui_draw_arcrectangle(215,300,295,330,4,1,LIGHTBLUE,LIGHTBLUE,"精度为5mm",12);时,就都能显示出来。
请问原子哥我这是哪里出了问题呢?












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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-9 00:14:39 | 显示全部楼层
检查是不是某个子函数的数据溢出了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-7-9 09:26:52 | 显示全部楼层
回复【2楼】正点原子:
----------------------------
可是只是数字和字母显示不出来,把“5MM”改为“五毫米”就没问题。如果是数据溢出的话会这样么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-9 10:14:26 | 显示全部楼层
检查数字字母显示的子函数部分.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-7-9 11:58:37 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
其实最终的显示汉字和字母的函数是LCD_ShowChar,我直接把LCD_ShowChar(315,300,"精度为",12,1);放到主函数看看能不能显示,但是编译的时候却出现了这样的错误:test.c(470): error:  #167: argument of type "char *" is incompatible with parameter of type "u8"。为什么会这样呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-9 16:43:39 | 显示全部楼层
回复【5楼】648342243:
---------------------------------
参数不匹配.
show char是显示一个字符,不是一个字符串.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-7-9 21:41:04 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,我按着战舰板的汉字显示上的更新字库,我用字库软件制作了20和24的字库,然后按着指南上的方法把字库更新进去了,然后我修改了下一些程序://在sd卡中的路径
const u8 *GBK24_SDPATH="0:/SYSTEM/FONT/GBK24.FON"; //GBK24的存放位置
const u8 *GBK20_SDPATH="0:/SYSTEM/FONT/GBK20.FON"; //GBK20的存放位謈
const u8 *GBK16_SDPATH="0:/SYSTEM/FONT/GBK16.FON"; //GBK16的存放位謈
const u8 *GBK12_SDPATH="0:/SYSTEM/FONT/GBK12.FON"; //GBK12的存放位置
const u8 *UNIGBK_SDPATH="0:/SYSTEM/FONT/UNIGBK.BIN"; //UNIGBK.BIN的存放位置
//在25Qxx中的路径
const u8 *GBK24_25QPATH="1:/SYSTEM/FONT/GBK24.FON"; //GBK24的存放位置
const u8 *GBK20_25QPATH="1:/SYSTEM/FONT/GBK20.FON"; //GBK20的存放位置
const u8 *GBK16_25QPATH="1:/SYSTEM/FONT/GBK16.FON"; //GBK16的存放位置
const u8 *GBK12_25QPATH="1:/SYSTEM/FONT/GBK12.FON"; //GBK12的存放位置
const u8 *UNIGBK_25QPATH="1:/SYSTEM/FONT/UNIGBK.BIN"; //UNIGBK.BIN的存放位置


else if(fx==3) //GBK20
{
ftinfo.f20addr=ftinfo.f16addr+ftinfo.gbk16size; //GBK16之后,紧跟GBK20字库
ftinfo.gbk20size=fftemp->fsize; //GBK20字库大小
flashaddr=ftinfo.f20addr; //GBK20的起始地址
}
else  //GBK24
{
ftinfo.f24addr=ftinfo.f20addr+ftinfo.gbk20size; //GBK20之后,紧跟GBK24字库
ftinfo.gbk24size=fftemp->fsize; //GBK24字库大小
flashaddr=ftinfo.f24addr; //GBK24的起始地址
}

在其他一些需要更改的地方也做了更改,可是就是不能显示出20和24的字体,这是什么原因呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-10 00:12:03 | 显示全部楼层
回复【7楼】648342243:
---------------------------------
关键要改底层显示汉字的函数,我们底层显示汉字的函数,没有座20*20和24*24汉字的支持。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-7-10 11:20:19 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
指的是这个函数么?void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)。那具体要怎么改才能实现呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-10 11:25:01 | 显示全部楼层
具体你先学会汉字显示.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-7-10 16:04:54 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥,我有看汉字显示的例程。也看了自定义汉字显示的例程。大概知道是怎么一回事。我觉得我不能成功把24*24的字模显示出来在于取模那个地方。例程里取模函数里面有一段看不懂的:
qh=*code;
ql=*(++code);
if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字
{        
    for(i=0;i<(size*2);i++)*mat++=0x00;//填充满格
    return; //结束访问
}          
if(ql<0x7f)ql-=0x40;//注意!
else ql-=0x41;
qh-=0x81;   
foffset=((unsigned long)190*qh+ql)*(size*2);//得到字库中的字节偏移量  
这一段程序不是很明白0x81,0x40等的这些值是怎么确定的?这个程序是不是对所有大小的字体通用?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-10 21:12:31 | 显示全部楼层
回复【11楼】648342243:
---------------------------------
看汉字显示实验.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2013-7-11 16:40:03 | 显示全部楼层
回复【12楼】正点原子:
-----------------------------
嗯嗯,解决了问题,就是这部分没修改好,所以一直不行
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-17 22:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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