查看: 5913|回复: 3

TFT显示字符函数解析

  [复制链接]
  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2013-1-5 15:12:02 | 显示全部楼层 |阅读模式
    分享到:
    显示字符函数,该函数代码如下:
    1. /**********************************************/
    2. /* 函数功能:显示8*16点阵英文字符 */
    3. /* 入口参数:x,y :起点坐标 */
    4. /* num:字母或符号 */
    5. /* 注 意:x,y的取值要在240到320范围内 */
    6. /**********************************************/
    7. void LCD_ShowChar(uint16_t x,uint16_t y,uint16_t num)
    8. {
    9. uint8_t temp;
    10. uint8_t pos,t;

    11. LCD_WR_REG_DATA(0x0020,x);//设置X坐标位置
    12. LCD_WR_REG_DATA(0x0021,y);//设置Y坐标位置
    13. /*开辟显存区域*/
    14. LCD_XYRAM(x,y,x+7,y+15); // 设置GRAM坐标
    15. LCD_WR_REG(0x0022); //指向RAM寄存器,准备写数据到RAM

    16. num=num-' ';//得到偏移后的值
    17. for(pos=0;pos<16;pos++)
    18. {
    19. temp=ascii_16[num][pos];
    20. for(t=0;t<8;t++)
    21. {
    22. if(temp&0x80) LCD_WR_DATA(POINT_COLOR);
    23. else LCD_WR_DATA(BACK_COLOR);
    24. temp<<=1;
    25. }
    26. }
    27. /* 恢复显存显示区域240*320 */
    28. LCD_XYRAM(0x0000 ,0x0000 ,0x00EF ,0X013F); // 恢复GRAM整屏显示
    29. return;
    30. }
    复制代码
    该函数的参数有3xynum。其中sy用于定义起始点坐标,numascii表的对应序号。例如我们将参数取为(100,100,100),则会以(100,100)为起始点(左上定点)开辟一个8*16的矩形,在此矩形的区域中显示出ascii码为100的字符’d’。
    下面来看是如何实现的。首先:
    1. uint8_t temp;
    2. uint8_t pos,t;

    3. LCD_WR_REG_DATA(0x0020,x);//设置X坐标位置
    4. LCD_WR_REG_DATA(0x0021,y);//设置Y坐标位置
    5. /*开辟显存区域*/
    6. LCD_XYRAM(x,y,x+7,y+15); // 设置GRAM坐标
    7. LCD_WR_REG(0x0022); //指向RAM寄存器,准备写数据到RAM
    复制代码
    这一部分比较简单,就是根据读/写函数确定起始点坐标并开辟矩形显示区域。
    然后要注意以下这行代码:
    1.   num=num-' ';//得到偏移后的值
    复制代码
    这行代码的意思是这样的。因为在完整的ascii码中,序号为0~31的字符都是些控制字符,这些在液晶屏上都是无法显示的,因此我们要将其剔除。而序号为32的字符时space,也就是’ ’(空字符)。所以用num减去空字符的ascii码序号得到实际程序中使用的查表序号(见ili9328.c文件)。
    接下来是两个for循环,代码如下:
    1. for(pos=0;pos<16;pos++)
    2. {
    3. temp=ascii_16[num][pos];
    4. for(t=0;t<8;t++)
    5. {
    6. if(temp&0x80) LCD_WR_DATA(POINT_COLOR);
    7. else LCD_WR_DATA(BACK_COLOR);
    8. temp<<=1;
    9. }
    10. }
    复制代码
    这里还是拿ascii码序号为100的字符’d’来做例子加以说明。该字符的实际显示如下图:
    图片1.jpg
    它对应的取模数组(高位在前)为:
    {0x00,0x00,0x00,0x06,0x02,0x02,0x02,0x1E,0x22,0x42,0x42,0x42,0x26,0x1B,0x00,0x00}
    由于矩形显示区域尺寸为8*16,因此上面数组中每一个元素都代表着一行,再因为高位在前的设置关系,因此第0个元素代表第0行,第1个元素代表第1行,……第15个元素代表第15行。两个for循环分别对应了16行和8列的逐个扫描。
    另外需要说明的是:
    1. if(temp&0x80) LCD_WR_DATA(POINT_COLOR);
    2. else LCD_WR_DATA(BACK_COLOR);
    3. temp<<=1;
    复制代码
    temp&0x80因为显示设置为高位在前,像其他人编写的程序中有些是使用低位在前的,那么这里就需要temp&0x01了。通过移位将行中的每一个像素进行扫描,if部分判断当前像素需要被点亮,满足则填入POINT_COLOR的颜色(此处设置为黑);else部分则判断当前像素不需要被点亮,满足则填入BACK_COLOR的颜色(此处设置为白)。


    这个函数就是这样了!






    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-7 21:35
  • 签到天数: 340 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-1-5 15:16:30 | 显示全部楼层
    貌似噶了吧……
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2013-1-5 15:23:22 | 显示全部楼层
    kk5290122 发表于 2013-1-5 15:16
    貌似噶了吧……

    ??没明白您说啥?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-7 21:35
  • 签到天数: 340 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-1-5 15:25:08 | 显示全部楼层
    littleway 发表于 2013-1-5 15:23
    ??没明白您说啥?

    没事……………………呵呵……
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 22:33 , Processed in 0.139680 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.