STM32f4---OLCD显示实验代码(03)

发布者:cyzcee最新更新时间:2018-09-29 来源: eefocus关键字:STM32f4。OLCD。显示实验 手机看文章 扫描二维码
随时随地手机看文章

OLED_Refresh_Gram 函数先设置页地址,然后写入列地址(也就是纵坐标),然后从 0 开始写入 128 个字节,写满该页,最后循环把 8 页的内容都写入,就实现了整个从 STM32F4 显存到OLED 显存的拷贝。

OLED_Refresh_Gram 函数还用到了一个外部函数,也就是我们接着要介绍的函数:OLED_WR_Byte,该函数直接和硬件相关,函数代码如下:

#if OLED_MODE==1

//通过拼凑的方法向OLED 输出一个8位数据

//data:要输出的数据

void OLED_Data_Out(u8 data)

{

  u16 dat=data&0X0F;

  GPIOC->ODR&=~(0XF<<6);//清空 6~9

  GPIOC->ODR|=dat<<6;    //D[3:0]-->PC[9:6]

  PCout(11)=(data>>4)&0X01;  //D4

  PBout(6)=(data>>5)&0X01;  //D5

  PEout(5)=(data>>6)&0X01;  //D6

  PEout(6)=(data>>7)&0X01;  //D7  

}  

//向 SSD1306写入一个字节。

//dat:要写入的数据/命令,    cmd:数据/命令标志  0,表示命令;1,表示数据;

void OLED_WR_Byte(u8 dat,u8 cmd)

{

  OLED_Data_Out(dat);       

    OLED_RS=cmd;

  OLED_CS=0;     OLED_WR=0;    

  OLED_WR=1;    OLED_CS=1;     OLED_RS=1;    

}                

#else

//向 SSD1306写入一个字节。

//dat:要写入的数据/命令

//cmd:数据/命令标志  0,表示命令;1,表示数据;

void OLED_WR_Byte(u8 dat,u8 cmd)

{  

  u8 i;        

  OLED_RS=cmd; //写命令  

  OLED_CS=0;      

  for(i=0;i<8;i++)

  {         

    OLED_SCLK=0;

    if(dat&0x80)OLED_SDIN=1;

    else OLED_SDIN=0;

    OLED_SCLK=1;dat<<=1;    

  }          

  OLED_CS=1; OLED_RS=1;         

}  

#endif

首先,我们看OLED_Data_Out函数,这就是我们前面说的,因为OLED 的D0~D7不是接的连续 IO,所以必须将数据,拆分到各个 IO,以实现一次完整的数据传输,该函数就是根据我们 OLED_D[7:0]具体连接的IO,对数据进行拆分,然后输出给对应位的各个 IO,实现并口数据输出。这种方式会降低并口速度,但是我们OLED模块,是单色的,数据量不是很大,所以这种方式也不会造成视觉上的影响,大家可以放心使用,但是如果是TFTLCD,就不推荐了。

然后,看OLED_WR_Byte 函数,这里有2个一样的函数,通过宏定义OLED_MODE来决定使用哪一个。如果OLED_MODE=1,就定义为并口模式,选择第一个函数,而如果为0,则为 4 线串口模式,选择第二个函数。这两个函数输入参数均为2 个:dat 和 cmd,dat 为要写入的数据,cmd 则表明该数据是命令还是数据。这两个函数的时序操作就是根据上面我们对8080接口以及 4线 SPI接口的时序来编写的。

OLED_GRAM[128][8]中的 128 代表列数(x 坐标) ,而 8 代表的是页,每页又包含 8 行,总共 64 行(y坐标)。从高到低对应行数从小到大。比如,我们要在 x=100,y=29 这个点写入1,则可以用这个句子实现:

            OLED_GRAM[100][4]|=1<<2;

一个通用的在点(x,y)置 1 表达式为:

            OLED_GRAM[x][7-y/8]|=1<<(7-y%8);

其中 x的范围为:0~127;y的范围为:0~63。

因此,我们可以得出下一个将要介绍的函数: 画点函数, void OLED_DrawPoint(u8 x, u8 y,u8 t);函数代码如下:

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;       

}

该函数有 3个参数,前两个是坐标,第三个t为要写入1 还是0。该函数实现了我们在OLED模块上任意位置画点的功能。  

接下来,我们介绍一下显示字符函数,OLED_ShowChar,在介绍之前,我们来介绍一下字符(ASCII字符集)是怎么显示在OLED 模块上去的。要显示字符,我们先要有字符的点阵数据,ASCII常用的字符集总共有95个,从空格符开始,分别为:  !"#$%&'()*+,-0123456789:;<= >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.

我们先要得到这个字符集的点阵数据,这里我们介绍一个款很好的字符提取软件:PCtoLCD2002完美版。该软件可以提供各种字符,包括汉字(字体和大小都可以自己设置)阵提取,且取模方式可以设置好几种,常用的取模方式,该软件都支持。该软件还支持图形模式,也就是用户可以自己定义图片的大小,然后画图,根据所画的图形再生成点阵数据,这功能在制作图标或图片的时候很有用。


关键字:STM32f4。OLCD。显示实验 引用地址:STM32f4---OLCD显示实验代码(03)

上一篇:STM32f4---OLCD显示实验代码(04)
下一篇:STM32f4---OLCD显示实验代码(02)

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved