找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1762|回复: 0
收起左侧

单片机LCD12864缓存绘制字体的简单程序

[复制链接]
ID:525244 发表于 2023-7-19 09:49 | 显示全部楼层 |阅读模式
看了示波器的字体绘制程序,用了标志位,觉得有点麻烦,自己写了个程序,一两个函数,最大汉子32*32,可以覆盖,叠加,反显等操作。第一次51hei论坛上发资料,勿喷!!!谢谢!

void OLED_Draw_Number(unsigned char _x,unsigned char _y,unsigned char *chr,unsigned char wordsize , unsigned char kind)//要写入字符串,字号wordsize,写入方式kind:0叠加  1覆盖 2叠加取反 3覆盖取反
{
        uchar WIDTH,HEIGHT;//字符宽度
        uchar c;//字符宽度
        uchar i;
        uint  y=_y<<4;
        uchar left_num;//字符在16位中左移的位置
        uint  x_Byte,x_bit;//X写入的字节位置
        unsigned long  Uint_Buf;//要写入时用的缓存
        unsigned long qk;//对应缓存时的位,对应字符宽度
        unsigned long qk1;//对应缓存时的位,对应字符宽度
        switch(wordsize)//转换字符宽度
        {
                case F6_8: WIDTH=6;//保存字符宽度
                        HEIGHT=8;//保存字符高度
                  qk=0x003f;//B 0000 0000 0011 1111//用于擦除需要覆盖的位置
                        break;
                case F6_12: WIDTH=6;//保存字符宽度
                        HEIGHT=12;//保存字符高度
                  qk=0x003f;//B 0000 0000 0011 1111//用于擦除需要覆盖的位置
                        break;
                case F8_16: WIDTH=8;//保存字符宽度
                        HEIGHT=16;//保存字符高度
                  qk=0x00ff;//B 0000 0000 0011 1111//用于擦除需要覆盖的位置
                        break;
                case F12_24: WIDTH=12;//保存字符宽度
                        HEIGHT=24;//保存字符高度
                  qk=0x0fff;//B 0000 0000 0011 1111//用于擦除需要覆盖的位置
                        break;
                case HZ16_16: WIDTH=16;//保存字符宽度
                        HEIGHT=16;//保存字符高度
                  qk=0x0fff;//B 0000 0000 0011 1111//用于擦除需要覆盖的位置
                        break;
                default:break;
        }
        
               

           //汉字16*16
        while (*chr)//循环写入字符
        {
          c = *chr - ' ';//将ASSIC码转换成表格位置
                x_Byte=_x>>3;//根据写入像素位置计算写入的字节位置
                x_bit=_x&7;//根据写入像素位置计算写入的字节位置
                left_num=32-WIDTH-x_bit;//计算字符左移数量
                for (i = 0; i < HEIGHT; i++)
                {

                        
                        switch(wordsize)//转换字符宽度
                        {
                                case F6_8: Uint_Buf=F6x8[c][ i];//取出对应位置的字符表信息
                                                                break;
                                case F6_12: Uint_Buf=F6x12[c][ i];//取出对应位置的字符表信息
                                                                break;
                                case F8_16: Uint_Buf=F8x16[c][ i];//取出对应位置的字符表信息
                                                                break;
                                case F12_24: Uint_Buf=F12x24[c][i*2]<<8|F12x24[c][i*2+1];//取出对应位置的字符表信息
                                                                break;
                                case HZ16_16: Uint_Buf=F12x24[c][i*2]<<8|F12x24[c][i*2+1];//取出对应位置的字符表信息
                                                                break;
                                default:break;
                        }
                        Uint_Buf<<=left_num;//将字符行信息左移到待写入位置
                        qk1=qk<<left_num;//将字符行信息左移到待写入位置
                        if((kind==2)||(kind==3))Uint_Buf=~Uint_Buf&qk1;//是否反显
                        
                        if((kind==1)||(kind==3))*((unsigned long *)(&Main_BUFF1+y+x_Byte))&=~qk1;//是否覆盖掉原来的数据  写入方式kind: 0叠加  1覆盖 2叠加取反 3覆盖取反
                        *((unsigned long *)(&Main_BUFF1+y+x_Byte))|=Uint_Buf;//将字符行信息写入到缓存区
                        x_Byte+=OLED_WIDTH>>3;
                        
                }        
                _x+=WIDTH;
                chr++;
        }        
}

屏幕截图 2023-07-19 094641.png

12864_OLED缓存程序1.1 添加两个主缓存.7z

43.17 KB, 下载次数: 6, 下载积分: 黑币 -5

Keil代码下载

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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