OpenEdv-开源电子网

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

关于PC2LCD2002取摸的问题

[复制链接]

6

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-12-14
在线时间
4 小时
发表于 2015-3-9 11:07:30 | 显示全部楼层 |阅读模式
5金钱
您好,原子哥,在用你的例程显示字体的时候没问题,但是我自己去摸显示0却有问题,取模软件为PC2LCD2002,设置按照你例程的要求设置的//PC2LCD2002取模方式设置:阴码+逐列式+顺向+C51格式我只取了一个0的字母,点阵大小为32*32的,取得的数据如下:
const unsigned char asc2_3216[1][64]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x00,0x00,0x7F,0xFF,0x00,0x00,0xF0,0x07,0x80,0x01,0x80,0x00,0xC0,0x03,0x00,0x00,0x60,0x02,0x00,0x00,0x20,0x02,0x00,
0x00,0x20,0x02,0x00,0x00,0x20,0x03,0x00,0x00,0x60,0x01,0x80,0x00,0xC0,0x00,0xE0,0x03,0x80,0x00,0x7F,0xFF,0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00},/*"0",0*/};
显示的程序如下:LCD_ShowChar(60,300,0,32,0);(main函数调用的)
LCD_ShowChar的定义如下:
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{    
    u8 temp,t1,t;
u16 y0=y;
  u16 colortemp=POINT_COLOR;
  u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数 
printf("\r\n The current size is %2d \r\n",size);
printf("\r\n The current size is %2d \r\n",csize);
//设置窗口   
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
   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==32)temp=asc2_3216[num][t]; //调用3216字体 
 else return; //没有的字库
       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;
}
}    
   }    
}
请原子哥解惑,谢谢

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

使用道具 举报

6

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-12-14
在线时间
4 小时
 楼主| 发表于 2015-3-9 12:00:59 | 显示全部楼层
怎么还是没有人回答我的问题啊?
回复

使用道具 举报

6

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-12-14
在线时间
4 小时
 楼主| 发表于 2015-3-9 12:01:31 | 显示全部楼层
在线坐等大神出没
回复

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-3-9 20:15:45 | 显示全部楼层
你这函数有问题

以3216字符显示的具体循环代码为例

for(行数 = 0u; 行数 < 32; 行数++)
{
    for(每行字节个数=0; 每行字节个数<2; 每行字节个数++)
    {
        for (bit = 0; bit < 8; bit++)
       {
       }
    }


具体每个循环还有其他的什么代码就不说了,你自己想下,具体的3个循环就是这样,当然你不这样做也可以,反正思路是这样的
回复

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-3-9 20:19:33 | 显示全部楼层
你这里面,首先是第一个大循环,判断行数的循环都没有,
回复

使用道具 举报

6

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-12-14
在线时间
4 小时
 楼主| 发表于 2015-3-10 09:33:53 | 显示全部楼层
回复【5楼】bj2008wyou:
---------------------------------
多谢解答,但是我的思路和你不一样,我用的是原子的例程,num=num-' ';//得到偏移后的值,这个已经得到要显示的是哪个值,
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==32)temp=asc2_3216[num][t]; //调用3216字体 
 else return;  //没有的字库
       for(t1=0;t1<8;t1++)
{     
       if(temp&0x80)POINT_COLOR=colortemp;
else OINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y); 
temp><<=1;
y++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
if((y-y0)==size)
{每行的数据都显示出来
回复

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-3-10 22:38:39 | 显示全部楼层
回复【6楼】664653162:
---------------------------------
你是列扫描而已,变换这里而已。我说的思路是指 “行 + 每行字节数 + 8bit” 或者 “列 + 每列字节数 + 8bit 总共3个循环”,你用的是后一种

至于你的问题,还是具体以32*16字符显示为例

首先,对于32*16字符显示,按你的计算csize=(size/8+((size%8)?1:0))*(size/2) = 4,显然就不对了,你是按列扫描,你看要扫描多少列,是不是szie/2=16 列?

其次,每列是有有32/8 = 4个字节的, 到了这步你有没有这个循环,我就没看见有

最后一个循环就是8个位的判断了,你是有了。

你的行数据显示出来,其实有错误,一是没有32*16那么大的框,二来也肯定是显示乱七八糟的东西,否则你也不用到这来提问了。

至于原子的程序,你说的应该是第15章的那个TFT_LCD显示实验。他那是只显示1206和1608的字符,而且是按行扫描,每行才一个字节,就不用判断每行的字节数了。

但你这里是还想要显示更大字号的字符,就应该加加多每行字节数
回复

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-3-10 22:39:47 | 显示全部楼层
LCD_ShowChar的定义如下:
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{    
    u8 temp,t1,t;
    u16 y0=y;
    u16 colortemp=POINT_COLOR;
    u8 csize=(size/8+((size%8)?1:0))*(size/2); //这里应该是 csize = size/2. 
   // u8 nbyte=(size/8+((size%8)?0:1));    //每列字节数

    printf("\r\n The current size is %2d \r\n",size);
    printf("\r\n The current size is %2d \r\n",csize);

    //设置窗口   
    num=num-' ';//得到偏移后的值
    if(!mode) //非叠加方式
    {
        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==32)temp=asc2_3216[num][t]; //调用3216字体 
            else return;                        //没有的字库
            
           //while(nbyte > 0u)         //这里应该是放多一个每列字节数判断的循环吧

            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)            //y自增判断x没有用
                {
                    POINT_COLOR=colortemp;     //看你的程序,显示超出范围就直接跳出不再显示,还不如在程序开头就直接先
                    return;                    //判断是否会超出,超出就直接不显示。你这样处理每次画点后都判断,
                }//超区域了                    //会浪费很多时间的
                **************************/
                    
                if (y >= lcddev.height)        //应该是这个吧
                {
                    POINT_COLOR=colortemp;
                    return;
                }

                if((y-y0)==size)               //当显示1206字符时,每列2个字节,每列的第二个字节
                {                              //只扫描6个bit,就满足这里的if条件,但你上面for循环还继续扫描
                    y=y0;                      //完8个bit,又多画了2个点
                    x++;

                    if(x>=lcddev.width)  
                    {       
                         OINT_COLOR=colortemp;
                         return;
                     }
                     break; 
               }
        }    
    }    
}


上面是个人的部分看法,没改完,不想改了。
其实你可以初步验证,对于字号为mxn的字符,总共需要画m*n个点,也就有m*n次判断
你算下你所有的循环,有没有这么多次循环。我看你的程序没有这么多次。


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 09:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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