[STM32]

立创商城STM32F系列——STM32f4 OLCD显示实验代码(03)

[复制链接]
786|0
手机看帖
扫描二维码
随时随地手机跟帖
小乐Tzz|  楼主 | 2018-9-7 11:47 | 显示全部楼层 |阅读模式
STM32f4————OLCD显示实验代码(03)
/*******************************************************/
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完美版。该软件可以提供各种字符,包括汉字(字体和大小都可以自己设置)阵提取,且取模方式可以设置好几种,常用的取模方式,该软件都支持。该软件还支持图形模式,也就是用户可以自己定义图片的大小,然后画图,根据所画的图形再生成点阵数据,这功能在制作图标或图片的时候很有用。
/*******************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝