STM32f103+protues仿真(二) OLED显示

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由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。

    ![在这里插入图片描述](https://i3.wp.com/img-blog.csdnimg.cn/2e3f0aa98d61474daa3b2f0f43ef9203.jpeg#pic_center
    关于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

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32f103+protues仿真(二) OLED显示

    发表评论