OpenEdv-开源电子网

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

LED显示字符函数新手分享+问题求解

[复制链接]

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-2-10
在线时间
6 小时
发表于 2015-4-24 09:22:51 | 显示全部楼层 |阅读模式
LCD_ShowChar函数问题一折腾两天了啊,分享,另求各位哥指点一下啊,不胜感激。
《问题一》
按我理解应该函数中第一个判断应该是是y>=lcddev.heigh,第二个是x>=lcddev.width
但是程序源码中非叠加方式两句是这样:两个都是x>=lcddev.width
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
咋回事??
而叠加方式程序源码中两句是这样:两个一个是x>=lcddev.heigh,一个是x>=lcddev.width。
(而书中或PDF的LCD_ShowChar函数中非叠加和叠加两个 if 判断都是这个,迷糊啊。感觉应该是哪里写错了吧)
if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
这是咋回事??、

《分享二》
这个我也是搞了半天才明白,对新手来说应该非常有助于理解两个FOR循环吧!
还有库函数版中讲的取模方式图解,从上到下,从左到右,高位在前,我以为看懂了。
但是当我我看完LCD_ShowChar函数,就又有点迷糊了。又太纠结问题一,就导致一直看不明白,一直看。
因为LCD_ShowChar函数没看太明白,只好看视频教程了,看到原子哥视频中的asc_1608字符集受启发了,暂停,看着视频用死方法,从视频上的字符集asc_1608取出“!”和“2”的点阵数据在16X8的格子中画点的时候又迷糊了。

我按取模方向画不出来“!”啊。
观察“!”点阵数据,重新试了两次。又用“2”点阵数据验证,我按顺序取“2”对应的点阵数据中16个8位数,按顺序的16个数从上到下对应16X8的16行,每个8位数从左到右,由低到高排列才画出“2”啊,这怎么回事啊?和取模方向都不同了啊,感觉和程序中的X++、Y++也不对应了。尼玛,这不是坑爹嘛!
解决方法见下一楼!


void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{    
    u8 temp,t1,t;
u16 y0=y;
u16 colortemp=POINT_COLOR;           
//设置窗口   
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
   for(t=0;t<size;t++)
   {   
if(size==12)temp=asc2_1206[num][t];  //调用1206字体
else temp=asc2_1608[num][t]; //调用1608字体                          
       for(t1=0;t1<8;t1++)
{    
       if(temp&0x80)POINT_COLOR=colortemp;
else POINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y);
temp<<=1;
y++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}    
   }    
}else//叠加方式
{
   for(t=0;t<size;t++)
   {   
if(size==12)temp=asc2_1206[num][t];  //调用1206字体
else temp=asc2_1608[num][t]; //调用1608字体                          
       for(t1=0;t1<8;t1++)
{    
       if(temp&0x80)LCD_DrawPoint(x,y); 
temp<<=1;
y++;
if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}    
   }     
}
POINT_COLOR=colortemp;        
}   



大湿,你好,我还在学习中!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-2-10
在线时间
6 小时
 楼主| 发表于 2015-4-24 10:00:50 | 显示全部楼层
尼玛,今天看明白后感觉被原子哥坑惨了!今天我没看视频了,不相信画不出来字符了,打开程序源码,右键找到字符集定义!取出“2”的点阵数据。12X6我画,16X8我也画。
我勒个擦,居然画出“2”了,昨天见鬼了吗!!找到视频上的字符集一看,我擦卧槽我日我顶,大坑!居然不一样。(理解应该是取模方向不一样导致的。)上一楼的红字部分表示我被坑了
ASC2_1206字符集中{0x18,0xC0,0x21,0x40,0x22,0x40,0x24,0x40,0x18,0x40,0x00,0x00},/*"2",18*/这个按取模方向画点是对的,可以画出“2” 。
 ASC2_1608字符集中{0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*"2",18*/按取模方向也可以画出“2”。
 从上到下,从左到右,高位在前,每一列画点到y-y0=SIZE时,break跳出FOR循环到下一列重新开始。

总结:大家动手实际画一画,你肯定会看懂字符显示函数的。还是要多看啊,大胆猜测并验证,尤其初学。有些东西它不是错的,只是不匹配,也不能说是原子哥坑人。哈哈,解决了!
原子哥求解问题一啊,不要说是BUG,我想知道具体为什么要那样写,有没有哪里是笔误,还是说必须那样写,具体也不知道为什么??
大湿,你好,我还在学习中!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 07:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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