历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2018年09月29日 | STM32f4---OLCD显示实验代码(03)

发布者:cyzcee 来源: 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)

推荐阅读

近场通信(NFC)是一种让两个设备在几厘米的距离内通信交互、最大数据传输速率424kb / s 的近距离双向通信技术,用于在两个设备之间实现安全、简单的数据交换。作为RFID技术的一个分支,NFC有望从手机扩展到汽车应用。NFC被视为许多新车载功能的实现技术,还能简化现有车载功能的使用和操作。 当用户的手机与汽车首次连接时,蓝牙配对需要多次的用户交...
华灿光电前身是武汉华灿光电有限公司,创立于2005年,2011年整体改制为股份有限公司。华灿光电是国内领先的LED(Light Emitting Diode,发光二极管)芯片供应商。 作为“新材料、新能源”领域的高新技术企业,我们致力于研发、生产、销售以GaN基蓝、绿光系列产品为主的高质量LED外延材料与芯片。我们拥有国际领先的技术研发能力和成熟的生产工艺,基于...
  2020 X-MAN影响力峰会暨智能行业张江创新展昨天在上海张江开幕,吸引了100多位智能行业企业高管、20位产业代表企业负责人、200多位投资人参会。张江集团董事长袁涛与科沃斯集团董事长钱东奇签署战略合作协议,共同推动智能机器人产业在张江科学城的发展。   此次峰会由科沃斯蒲公英加速器联合张江Vπ孵化器主办,X-MAN是X划中学员的称号。X加速...
9月28日,据商务部网站消息称,9月24日,安全与管制局局长蒋成华带队赴中芯国际集成电路制造有限公司开展调研,宣讲有关法律和政策,听取企业的意见建议,指导企业加强出口管制内部合规机制建设。据了解,中芯国际是一家晶圆代工企业,其今年第二季度实现销售收入为13.4亿美元,同比增长43.2%。第二季度毛利为4.05亿美元,同比增长 62.9%。据中芯国际财报...

史海拾趣

问答坊 | AI 解惑

关于飞思卡尔智能车模起跑线识别方法的设计与实现

设计思想及算法实现 车模与赛道的参数如图1所示。车模运行的主要形式主要是车模的规定的赛道内行进,赛道中央有一条25mm宽的黑色引导线。 …

查看全部问答∨

fpga

大家帮帮忙多发一些关于FPGA的资料及其就业形势…

查看全部问答∨

IWebbrowser2

hr = CoCreateInstance(CLSID_WebBrowser, NULL,                  CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,                  IID ...…

查看全部问答∨

关于SD卡上移植 FAT 文件系统时的 初始化工作,遇到点问题

//读引导区信息(MASTER BOOT RECODER) MBR区   ReadBlock(0);// 读MBR结构  前446个都是0,从447开始为分区信息 (64个字节) //PartInfo = *((struct partrecord *)((struct partsector *)BUFFERtemp)->psPart);//得到分区表 ...…

查看全部问答∨

驱动程序开发网

好不容易注册了一个账号,真受容易呀,开始直接用手机注册得不到回复,只能网页注册,然后再发短信验证。现在完成了。同喜 http://www.driverdevelop.com…

查看全部问答∨

从AD9里的官方库里把LQFP48的封装找到,分N、L、M三种,咋选

                                 从ALTIUM的网站下了ST的STM32的集成库,原理图、封装库很齐,但发现STM32F101C6T6有三个LQFP48的封装,分别是LQFP4 ...…

查看全部问答∨

寻求STM32扩展以太网接口的方案

产品目前用的是STM32F103,通信方式想改成以太网,请教各位哪里有相关的方案? 谢谢!…

查看全部问答∨

有木有仪器仪表的

本帖最后由 paulhyde 于 2014-9-15 09:14 编辑 求交流啊  …

查看全部问答∨

我提问题你做实验(1)_13年1月25日

大学生入门者也许感兴趣,大学生生活丰富呀,有时候可能也有空闲时间,所以不妨做做?既然还是入门,也许可以是通过练习也是学习嘛 只能象征性的对给出实验结果和程序的给予15芯币(晕,我还要交税?),新手在网站下载中心下载资源是否用得着? ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved