野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14376|回复: 4

stm32显示汉字 函数求解!

[复制链接]
发表于 2015-4-13 17:22:02 | 显示全部楼层 |阅读模式
这是stm32用LCD显示汉字的底层函数,对于这个函数,小弟有点迷糊,恳请大神指点(问题在注释部分)~~~
void LCD_DispCH(uint16_t x, uint16_t y, const uint8_t *pstr, uint16_t color)
{
        uint8_t page , column;
        uint8_t buffer[32];               
        uint16_t tmp_char=0;
       
        LCD_OpenWindow(x, y, CH_WIDTH, CH_HEIGHT);
        LCD_ILI9341_CMD(0X2C);
       
        GetGBKCode_from_sd(buffer,pstr);
       
        for(page=0; page<CH_HEIGHT; page++)
        {
                tmp_char=buffer[page*2];//问题1:这里直接用buffer[Page]不好吗?下面也就不需要使用buffer[Page*2+1],为什么要*2?
                tmp_char=(tmp_char<<8);
                tmp_char|=buffer[2*page+1];
               
                for (column=0; column< CH_WIDTH; column++)
                {                       
                        if ( tmp_char & (0x01<<15) //问题2:这里是操作一个像素点,从最高位开始操作,为什么只取最高位的啊?
                        {                               
                                LCD_WR_Data(color);
                        }
                        else
                        {                       
                                LCD_WR_Data(BACKGROUND);
                        }
                        tmp_char <<= 1;//问题3:这是什么意思啊?
                }
        }
}
回复

使用道具 举报

发表于 2015-4-13 18:52:30 | 显示全部楼层
问题1:我们的汉字是16*16的(一个汉字需要16*16个像素点),使用总共32个字节,一行2个字节,而page是个uint8_t类型数据,只有8位,,所以乘以2
问题2跟问题3是因为楼主不懂“<<”移位运算符的问题
"<<",">>"分别是左移位和右移位运算符,C语言的书都有讲的啊
tmp_char <<= 1;实际是: tmp_char =tmp_char  <<1;
比如tmp_char=0b0000 0001;
运行:tmp_char =tmp_char  <<1;
这时tmp_char =0b0000 0010;
回复 支持 反对

使用道具 举报

发表于 2015-4-13 19:16:10 | 显示全部楼层
本帖最后由 11kxmx 于 2015-4-13 19:55 编辑

我來給你解釋下:一個16*16的漢字,一行有16個點占兩個字節,16行就占32個字節,
CH_HEIGHT只有16,如果一次只讀寫一個字節,循環16次顯然總數是不夠32 的,乘2就 是這個道理
一行寫入時有16個點,只能一位一位寫,所以只能先取最高位,寫一次左移一次,次高位就被推到了最高位
16 次就 寫完了一行,再循環16 次,一個字就寫完了 你沒看是兩重FOR循環嗎
為什麼從高位開始寫呢,因取字模時我們約定,每一行從左至右,高位在先,寫LCD時順序還是從左至右,所以仍要先取高位

如果取字模時低位在先,我們寫入時也要先寫最低位,寫完之後右移一位
如果這樣寫不乘2也可以
for(page=0; page<32; page+=2)
        {
               tmp_char=buffer;
                tmp_char=(tmp_char<<8);
                tmp_char|=buffer[page+1];//把2个8位二进制数合成了1个16位二进制数
               
                for (column=0; column< 16; column++)
                {                        
                        if (( tmp_char &0x8000)==1) // 0x8000最高位是1
                      {                                
                                LCD_WR_Data(color);
                        }
                        else
                        {                        
                                LCD_WR_Data(BACKGROUND);
                        }
                        tmp_char <<= 1;
                }
        }
}

奇怪了tmp_char=buffer;打字时后面带大括号和page,发上去就不见了,让人越看越糊涂
回复 支持 反对

使用道具 举报

发表于 2015-4-13 19:47:47 | 显示全部楼层
11kxmx 发表于 2015-4-13 19:16
我來給你解釋下:一個16*16的漢字,一行有16個點占兩個字節,16行就占32個字節,
CH_HEIGHT只有16,如果一次只 ...

               tmp_char=buffer;
                tmp_char=(tmp_char<<8);
                tmp_char|=buffer[page+1];//把2个8位二进制数合成了1个16位二进制数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 16:09:17 | 显示全部楼层
恩,明白了,感谢
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 19:52 , Processed in 0.098600 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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