OpenEdv-开源电子网

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

LCD 显示一个字符程序求答疑

[复制链接]

23

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-12-8
在线时间
0 小时
发表于 2014-4-8 22:34:22 | 显示全部楼层 |阅读模式
            

我的LCD驱动芯片是SSD1289,这个不重要,关键现在看原子的写一个字符的程序有点不懂,请大虾指点:

程序如下:

 

void LCD_DrawPoint(u16 x,u16 y)
{
     LCD_SetCursor(x,y);//设置光标位置
     LCD_WR_REG(0x22);//开始写入GRAM
     LCD_WR_DATA(POINT_COLOR);
}

void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
    u8 temp;
    u8 pos,t;
    u16 x0=x;
   u16 colortemp=POINT_COLOR;
   if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
   //设置窗口
   num=num-' ';//得到偏移后的值
   if(!mode) //非叠加方式
  {
      for(pos=0;pos<size;pos++)
     {
         if(size==12)
         temp=asc2_1206[num][pos];//调用1206字体
        else
        temp=asc2_1608[num][pos]; //调用1608字体
        for(t=0;t<size/2;t++)
        {
            if(temp&0x01) POINT_COLOR=colortemp;
            else POINT_COLOR=BACK_COLOR;
            LCD_DrawPoint(x,y);
            temp>>=1;
           x++;
       }
          x=x0;
          y++;
     }
  }else//叠加方式
    {
       for(pos=0;pos<size;pos++)
      {
           if(size==12)
           temp=asc2_1206[num][pos];//调用1206字体
          else
         temp=asc2_1608[num][pos]; //调用1608字体
         for(t=0;t<size/2;t++)
        {
          if(temp&0x01)
           LCD_DrawPoint(x+t,y+pos);//画一个点
           temp>>=1;
        }
     }
   }
     POINT_COLOR=colortemp;
}

void LCD_ShowString(u16 x,u16 y,const u8 *p)
{
      while(*p!='\0')
     {
        if(x>MAX_CHAR_POSX)
       {
           x=0;
          y+=16;
       }
      if(y>MAX_CHAR_POSY)
      {
           y=x=0;
           LCD_Clear(WHITE);
       }
     LCD_ShowChar(x,y,*p,16,0);
     x+=8;
     p++;
   }
}

以上是显示一个字符串的完整程序,假设我现在调用LCD_ShowString(30,30,“we”);就用来显示 字符串we,那么到最终会调用 LCD_ShowChar(30,u16 y,30,16,0);就是这个函数我不太懂,首先显示 'w’是,该函数里的num是多少??为什么要减去' ' (空格字符)??这个显示一个字符的函数 LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)是怎么扫描预先定义的字符串字库的??

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-8 22:41:43 | 显示全部楼层
num=’w‘
也就是w字符的ASCII内码。
因为我们的ASCII内码,从空格开始存储,之前的没有。
所以必须减去空格,这个偏移。
这是显示一个字符的函数。。。不是显示字符串的。。。
你知道了字符的宽度和高度,自然扫描就很简单了,显示第一个以后,往后偏移这么多宽度,显示下一个,显示了以后,再偏移,再显示...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 13:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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