OpenEdv-开源电子网

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

求oled显示SPI四线显示汉字的程序

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-9-24
在线时间
1 小时
发表于 2014-11-12 14:53:49 | 显示全部楼层 |阅读模式
5金钱
弄了两天怎么改都改不正确,想找一个来参考参考,望各位大神给助攻!!!!!不胜感激!!!!!
 显示汉字,画点函数需要改吗 ?个人认为不改不知道对吗?
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
u8 pos,bx,temp=0;
if(x>127||y>63)return;//????·??§??.
pos=7-y/8;
bx=y%8;
temp=1<<(7-bx);
if(t)OLED_GRAM[x][pos]|=temp;
else OLED_GRAM[x][pos]&=~temp;    



字符显示部分  
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{          
u8 temp,t,t1;
u8 y0=y;
chr=chr-' ';//?????????ó????   
    for(t=0;t<size;t++)
    {   
if(size==12)temp=oled_asc2_1206[chr][t];  //?÷??1206×???
else temp=oled_asc2_1608[chr][t]; //?÷??1608×???                          
        for(t1=0;t1<8;t1++)
{
if(temp&0x80)OLED_DrawPoint(x,y,mode);        这一句的if里面为什么要和0x80按位与呢?
else OLED_DrawPoint(x,y,!mode);
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}    
    }          
}





















最佳答案

查看完整内容[请看2#楼]

这是根据字模取模方式确定的。 你可以自己写一个函数,能用就行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-11-12 14:53:50 | 显示全部楼层
这是根据字模取模方式确定的。
你可以自己写一个函数,能用就行。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-12 14:53:50 | 显示全部楼层
[mw_shl_code=c,true]/** ***************************************************************************** * 汉字显示 * * (C) Copyright 2000-2020, *** * All Rights Reserved ***************************************************************************** * * @File : GBKtest.c * @By : Sam Chan * @Version : V1.0 * @Date : 2014 / 09 / 23 * ***************************************************************************** * Update * @Version : V1.* * @By : *** * @Date : 20** / ** / ** * @Brief : *** * ***************************************************************************** **/ #include "gbktest.h" #include "ff.h" #include "oled.h" /****************************************************************************** 文件系统路径定义 ******************************************************************************/ const u8 *GBK_FontPath[FatPath][FontSize] = { /* SD卡路径 */ { "0:/SYSTEM/FONT/GBK12.FON", "0:/SYSTEM/FONT/GBK16.FON", "0:/SYSTEM/FONT/GBK24.FON", "0:/SYSTEM/FONT/GBK32.FON", }, /* flash路径 */ { "1:/SYSTEM/FONT/GBK12.FON", "1:/SYSTEM/FONT/GBK16.FON", "1:/SYSTEM/FONT/GBK24.FON", "1:/SYSTEM/FONT/GBK32.FON", }, }; static u8 GBK_Buffer[128]; //一个汉字数据大小 /** ***************************************************************************** * @Name : 读取字库中汉字的数据 * * @Brief : none * * @Input : *GBK: 输入的汉字 * path: 字库路径 * Size: 汉字大小 * * @Output : GBK_OutBuf: 数据输出缓存 * * @Return : none ***************************************************************************** **/ static void Get_GBKData(const u8 *GBK, u8 path, u8 Size, u8 *GBK_OutBuf) { FIL filefont; //文件指针 UINT brf; //读取变量 FRESULT res; //函数操作应答 unsigned char g_size=0; unsigned char GBKH,GBKL; unsigned char csize=0; unsigned long foffset=0; //汉字首地址 csize = (Size/8 + ((Size%8)?1:0)) * Size; //得到一个字符占用集的字节大小 GBKH = *GBK; //高8位 GBKL = *(++GBK); //低8位 if(GBKL < 0x7f) foffset = ((GBKH - 0x81) * 190 + GBKL - 0x40) * csize;//(Size * 2); if(GBKL > 0x80) foffset = ((GBKH - 0x81) * 190 + GBKL - 0x41) * csize;//(Size * 2); switch(Size) { case 12: g_size = GBK12; break; case 16: g_size = GBK16; break; case 24: g_size = GBK24; break; case 32: g_size = GBK32; break; default: break; } res = f_open(&filefont, (const TCHAR*)GBK_FontPath[path][g_size], FA_READ); //只读 if(res != FR_OK) //打开失败 { printf("The GBK Open File Res:%d\r\n", (u8)res); f_close(&filefont); //关闭文件 return; //结束访问 } else { res = f_lseek(&filefont, foffset); //偏移指针 res = f_read(&filefont, GBK_OutBuf, csize, &brf); //读取数据 res = f_close(&filefont); //关闭文件 } } /** ***************************************************************************** * @Name : 指定位置显示一个中文字符 * * @Brief : none * * @Input : (x, y): 起点坐标 * width: 宽度 * height: 高度 * *GBK: 要显示中文字符 * size: 字体大小 * mode: 显示模式。0: 不叠加显示;1: 叠加显示。 * * @Output : none * * @Return : none ***************************************************************************** **/ /* 解码模式 +------------> | | \|/ */ void Draw_GBK(u16 x, u16 y, u16 width, u16 height, u8 *GBK, u8 size, u8 mode) { static u8 *GBKBUF; u8 GBKtemp=0; u8 csize=0; u16 i=0,j=0; u16 x0=x; GBKBUF = GBK_Buffer; if((*GBK == 0) || (x > 127) || (y > 63) || \ ((size != 12) && (size != 16) && (size != 24) && (size != 32))) { return; } csize = (size/8 + ((size%8)?1:0)) * size; //得到一个字符占用集的字节大小 Get_GBKData(GBK, SDPath, size, GBKBUF); //读取数据 for(i = 0;i < csize;i++) { GBKtemp = GBKBUF; //得到汉字点阵数据 for(j = 0;j < 8;j++) { if(GBKtemp & 0x80) OLED_DrawPoint(x, y, mode); //LCD_FastDrawPoint(x, y, lcd_dev._lcdobj.textcol); else if(mode == 0) OLED_DrawPoint(x, y, !mode); //LCD_FastDrawPoint(x, y, lcd_dev._lcdobj.backcol); GBKtemp <<= 1; x++; if(x - x0 == size) //显示完一行了 { x = x0; //恢复x坐标 y++; //显示下一行 break; } } //end for j } //end for i } /** ***************************************************************************** * @Name : 指定位置显示一个中文字符串 * * @Brief : none * * @Input : (x, y): 起点坐标 * width: 宽度 * height: 高度 * *str: 要显示中文字符 * size: 字体大小 * mode: 显示模式。0: 不叠加显示;1: 叠加显示。 * * @Output : none * * @Return : none ***************************************************************************** **/ void Show_GBKString(u16 x, u16 y, u16 width, u16 height, u8 *str, u8 size, u8 mode) { u8 x0=x; while(*str != '\0') //直到遇到结束符 { if((x + size) > width) //换行 { x = x0; y += size; } if((y + size) > height) break; //越界,返回 Draw_GBK(x, y, width, height, str, size, mode); //显示这个汉字 str += 2; x += size; //偏移到下一个汉字 } } [/mw_shl_code]

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
发表于 2014-11-12 22:34:59 | 显示全部楼层
和0X80与运算的意思是1&1=1则画点,1&0=0则不画点。
有的地方画点,有的地方不画点,你要显示的字符就出来了。
水的比较多。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-12 22:59:33 | 显示全部楼层
明天给你整一个
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-7-20
在线时间
0 小时
发表于 2017-7-20 21:51:09 | 显示全部楼层
画点的函数能用么,,,为什么我不能显示啊
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-4-24
在线时间
8 小时
发表于 2018-4-28 14:25:51 | 显示全部楼层

大神,我现在有一个把LED映射成按TFT屏的方法来显示的程序,英文字母和数字都可以显示,就是中文搞不出来,求大神帮忙
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-4-24
在线时间
8 小时
发表于 2018-4-28 14:26:44 | 显示全部楼层
萨克斯 发表于 2018-4-28 14:25
大神,我现在有一个把LED映射成按TFT屏的方法来显示的程序,英文字母和数字都可以显示,就是中文搞不出来 ...

/**************************************************************************************/
///////////////////////////oo×&#214;&#207;&#212;ê&#190;///////////////////////////
/*******************************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////////
//&#212;ú&#214;&#184;&#182;¨&#206;&#187;&#214;&#195;&#207;&#212;ê&#190;ò&#187;&#184;&#246;oo×&#214;
//x,y:&#198;eê&#188;×&#248;±ê
//num:òa&#207;&#212;ê&#190;μ&#196;×&#214;·&#251;:" "--->"~"
//size:×&#214;ì&#229;′óD&#161;
//mode:μt&#188;ó·&#189;ê&#189;(1)&#187;1ê&#199;·&#199;μt&#188;ó·&#189;ê&#189;(0)
void led_showcharH(u16 x,u16 y,u8 num,u8 size,u8 mode,u8 color)
{                                                            
  u8 temp,t1,t;
        u16 y0=y;
        u8 csize=(size/16+((size%8)?1:0))*(size/2);                //μ&#195;μ&#189;×&#214;ì&#229;ò&#187;&#184;&#246;×&#214;·&#251;&#182;&#212;ó|μ&#227;&#213;ó&#188;ˉ&#203;ù&#213;&#188;μ&#196;×&#214;&#189;úêy       
        num=num-' ';//μ&#195;μ&#189;&#198;&#171;ò&#198;oóμ&#196;&#214;죨ASCII×&#214;&#191;aê&#199;′ó&#191;&#213;&#184;&#241;&#191;aê&#188;è&#161;&#196;££&#172;&#203;ùò&#212;-' '&#190;íê&#199;&#182;&#212;ó|×&#214;·&#251;μ&#196;×&#214;&#191;a£&#169;
        for(t=0;t<csize;t++)
        {   
                if(size==16)temp=Code16x16[num][t];             //μ÷ó&#195;×&#214;ì&#229;×&#214;&#196;£
               
                else return;                                                                //&#195;&#187;óDμ&#196;×&#214;&#191;a
                for(t1=0;t1<16;t1++)
                {                            
                        if(temp&0x80)set_pixel(y,x,color);
                        else if(mode==0)set_pixel(y,x,BLACK);
                        temp<<=1;
                        y++;
                        if(y>=32)return;                //3&#172;&#199;&#248;óòá&#203;
                        if((y-y0)==size)
                        {
                                y=y0;
                                x++;
                                if(x>=64)return;        //3&#172;&#199;&#248;óòá&#203;
                                break;
                        }
                }  
   
        }               
}
  
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//&#207;&#212;ê&#190;&#182;à&#184;&#246;oo×&#214;
//x,y:&#198;eμ&#227;×&#248;±ê
//width,height:&#199;&#248;óò′óD&#161;  
//size:×&#214;ì&#229;′óD&#161;
//*p:×&#214;·&#251;′&#174;&#198;eê&#188;μ&#216;&#214;·                  
void led_showstringH(u16 x,u16 y ,u8 size,u8 *p,u8 color)
{         
  while( *p!='\0'){  //&#197;D&#182;&#207;ê&#199;2&#187;ê&#199;·&#199;·¨×&#214;·&#251;!
                led_showcharH(x,y,*p,size,0,color);
                x+=size/2;
                p++;
  }  
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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