STM32f103+protues仿真(二) OLED显示

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • STM32f103+protues仿真(二) OLED显示 
    前言 
    一、程序 
    1.oledfont.h 
    2.oled.c 
    3.main.c 
    二、protues 
    1.引入库 
    三、仿真效果 
    总结 

关于protues怎么用的,可以看一下第一篇 STM32f103+protues仿真(一)点亮led

前言

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

关于OLED模块的使用教程可参考这位博主讲解的非常详细:【嵌入式模块】OLED显示屏模块

本篇文章主要介绍用STM32f103+protues进行OLED仿真,使用IIC驱动,做一个简单文字和数字显示界面。


一、程序

这里主要涉及到3个程序模块,oledfont.h、oled.c和main.c

1.oledfont.h

首先打开PCtoLCD2002软件

在选项下进行相关设置,最好把自定义格式改为C51格式,然后点击确定。

下面输入我们要显示的字符,然后点击生成字模。

把生成的字模数组放到oledfont.h文件里,数组命名可以为hzk1。

const unsigned char hzk1[][32]={

{0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00},/*"我",0*/
{0x00,0x80,0x60,0xF8,0x07,0x00,0xF8,0x01,0x06,0x00,0x04,0x04,0x04,0xFC,0x00,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00},/*"们",1*/
{0x00,0x02,0xF2,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0xF2,0x02,0x00,0x00,0x00,0x02,0x82,0x92,0x9A,0x56,0x63,0x22,0x32,0x4A,0x46,0x42,0x82,0x02,0x00,0x00},/*"要",2*/
{0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*"好",3*/
{0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*"好",4*/
{0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00},/*"学",5*/
{0x00,0x02,0x02,0x02,0x12,0x22,0xC2,0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x08,0x18,0x08,0x04,0x04,0x04,0x02,0x02,0x41,0x81,0x40,0x3F,0x00,0x00,0x00},/*"习",6*/

};

2.oled.c

oled.c主要是做IIC通信的设置,OLED显示模块的初始化。IIC通信分为硬件IIC和软件IIC,这里使用可移植性更好的软件IIC。
部分代码如下:

//起始信号
void I2C_Start(void)
{
	OLED_SDA_Set();
	OLED_SCL_Set();
	IIC_delay();
	OLED_SDA_Clr();
	IIC_delay();
	OLED_SCL_Clr();
	IIC_delay();
}

//结束信号
void I2C_Stop(void)
{
	OLED_SDA_Clr();
	OLED_SCL_Set();
	IIC_delay();
	OLED_SDA_Set();
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
{
	u8 i,m,temp,size2,chr1;
	u8 x0=x,y0=y;
	if(size1==8)size2=6;
	else size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占的字节数
	chr1=chr-' ';  //计算偏移后的值
	for(i=0;i<size2;i++)
	{
		if(size1==8)
			  {temp=asc2_0806[chr1][i];} //调用0806字体
		else if(size1==12)
        {temp=asc2_1206[chr1][i];} //调用1206字体
		else if(size1==16)
        {temp=asc2_1608[chr1][i];} //调用1608字体
		else if(size1==24)
        {temp=asc2_2412[chr1][i];} //调用2412字体
		else return;
		for(m=0;m<8;m++)
		{
			if(temp&0x01)OLED_DrawPoint(x,y,mode);
			else OLED_DrawPoint(x,y,!mode);
			temp>>=1;
			y++;
		}
		x++;
		if((size1!=8)&&((x-x0)==size1/2))
		{x=x0;y0=y0+8;}
		y=y0;
  }
}


//显示字符串
//x,y:起点坐标  
//size1:字体大小 
//*chr:字符串起始地址 
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
{
	while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
	{
		OLED_ShowChar(x,y,*chr,size1,mode);
		if(size1==8)x+=6;
		else x+=size1/2;
		chr++;
  }
}
//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//mode:0,反色显示;1,正常显示
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode)
{
	u8 m,temp;
	u8 x0=x,y0=y;
	u16 i,size3=(size1/8+((size1%8)?1:0))*size1;  //得到字体一个字符对应点阵集所占的字节数
	for(i=0;i<size3;i++)
	{
		if(size1==16)
				{temp=hzk1[num][i];}//调用16*16字体
		else if(size1==24)
				{temp=Hzk2[num][i];}//调用24*24字体
		else if(size1==32)       
				{temp=Hzk3[num][i];}//调用32*32字体
		else if(size1==64)
				{temp=Hzk4[num][i];}//调用64*64字体
		else return;
		for(m=0;m<8;m++)
		{
			if(temp&0x01)OLED_DrawPoint(x,y,mode);
			else OLED_DrawPoint(x,y,!mode);
			temp>>=1;
			y++;
		}
		x++;
		if((x-x0)==size1)
		{x=x0;y0=y0+8;}
		y=y0;
	}
}

该处使用的url网络请求的数据。

3.main.c

主函数代码如下(示例):

#include "delay.h"
#include "sys.h"
#include "oled.h"
int main(void)
{
	
	delay_init();
	OLED_Init();
	OLED_ColorTurn(0);//0正常显示,1 反色显示
    OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
	while(1)
	{
		OLED_Refresh();
		OLED_ShowChinese(0,0,0,16,1);//我
		OLED_ShowChinese(18,0,1,16,1);//们
		OLED_ShowChinese(36,0,2,16,1);//要
		OLED_ShowChinese(54,0,3,16,1);//好
		OLED_ShowChinese(72,0,4,16,1);//好
		OLED_ShowChinese(90,0,5,16,1);//学
		OLED_ShowChinese(108,0,6,16,1);//习
		OLED_ShowString(8,16,"Study hard",16,1);
		OLED_ShowString(20,32,"2022/01/01",16,1);
		OLED_ShowString(0,48,"ASCII:",16,1);  
		OLED_ShowString(63,48,"CODE:",16,1);
	}
}

二、protues

1.引入库

打开protues,在元件库里搜索oled,在右侧弹出的搜索结果里选择OLED12864I2C,这款OLED对应的就是用的比较多的OLED IIC显示模块。

如下图所示连接好电路,双击芯片添加程序编译生成的hex文件。

三、仿真效果

总结

介绍了使用protues进行STM32f103的仿真,实现 OLED显示一个简单界面。
相关代码和工程放在gitee上:gitee链接
如果protues没有找到OLED iic模块,就是protues版本过低的问题,我这里用的是8.13版本
Protues8.13安装包:链接:https://pan.baidu.com/s/1XZ34XmNRREWW0e0euZB6ww?pwd=cf2l
提取码:cf2l