STM32控制0.96寸OLED(4针/4Pin)汉字以及数字,英文显示
声明:源码在中景园电子51单片机例程以及个人项目上更改而来,请勿用作商业用途,仅供学习交流使用!
前言:在网上找例程不是不符合,就是需要积分亦或会员,遂修改之前温湿度项目的51单片机程序,成功。在此供大家免费交流使用。汉字显示时需要一些时间去琢磨取模软件数值在数组中的排布。文末有工程链接。
/*------------------------------------------
接线方式:
SCL——GPIOD_6
SDA——GPIOD_7
------------------------------------------*/
1.main.c
//**主函数,显示效果大致如下:**当前湿度:%
设定:&
-------------------
#include "stm32f10x.h"
//#include "stdio.h"
//#include "usart.h"
#include "delay.h"
//#include "led.h"
#include "oled.h"int main(void)
{
// Usart1_Init(115200);
//串口1初始化,设置波特率
// delay_init();
// led_init();
OLED_GPIO_Init();
Initial_LY096BG30();
//初始化液晶模块以及IIC通信
delay_ms(5);
// printf("All init over\n");
while(1)
{
picture_2();
//显示效果如上边标题所示
delay_ms(800);
}
}
2.oled.c
#include "oled.h"
#include "stdlib.h"
#include "oledfont.h"
#include "delay.h"
#define high 1
#define low 0
//int a,b;
void OLED_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//开启GPIOD的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
//设置GPIO的基本参数
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
//推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
//输出速度50MHzGPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_SetBits(GPIOD, GPIO_Pin_6 | GPIO_Pin_7 );
}
/*************Pin Define***************/
//extern int num;
//sbit SCL=P2^2;
//sbit SDA=P2^1;
/****************************************************/
void Initial_LY096BG30();
void picture_1(int Y,int K,int S,int L);
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
/***********************Initial code*********************/
void Initial_LY096BG30()
{
Write_IIC_Command(0xAE);
//display off
Write_IIC_Command(0x20);
//Set Memory Addressing Mode
Write_IIC_Command(0x10);
//00,Horizontal Addressing Mode;
01,Vertical Addressing Mode;
10,Page Addressing Mode (RESET);
11,Invalid
Write_IIC_Command(0xb0);
//Set Page Start Address for Page Addressing Mode,0-7
Write_IIC_Command(0xc8);
//Set COM Output Scan Direction
Write_IIC_Command(0x00);
//---set low column address
Write_IIC_Command(0x10);
//---set high column address
Write_IIC_Command(0x40);
//--set start line address
Write_IIC_Command(0x81);
//--set contrast control register
Write_IIC_Command(0x7f);
Write_IIC_Command(0xa1);
//--set segment re-map 0 to 127
Write_IIC_Command(0xa6);
//--set normal display
Write_IIC_Command(0xa8);
//--set multiplex ratio(1 to 64)
Write_IIC_Command(0x3F);
//
Write_IIC_Command(0xa4);
//0xa4,Output follows RAM content;
0xa5,Output ignores RAM content
Write_IIC_Command(0xd3);
//-set display offset
Write_IIC_Command(0x00);
//-not offset
Write_IIC_Command(0xd5);
//--set display clock divide ratio/oscillator frequency
Write_IIC_Command(0xf0);
//--set divide ratio
Write_IIC_Command(0xd9);
//--set pre-charge period
Write_IIC_Command(0x22);
//
Write_IIC_Command(0xda);
//--set com pins hardware configuration
Write_IIC_Command(0x12);
Write_IIC_Command(0xdb);
//--set vcomh
Write_IIC_Command(0x20);
//0x20,0.77xVcc
Write_IIC_Command(0x8d);
//--set DC-DC enable
Write_IIC_Command(0x14);
//
Write_IIC_Command(0xaf);
//--turn on oled panel
}/************************************************Picture Code**************************************************/
unsigned char shows[]= {
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,/*"0",*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,/*"1",*///
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,/*"2",*///
0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,/*"3",*///
0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,/*"4",*///
0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,/*"5",*///
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,/*"6",*///
0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,/*"7",*///
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,/*"8",*///
0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,/*"9",*///
0x01,0x01,0x01,0x81,0x41,0x21,0x1F,0x23, 0x5F,0xA3,0x1F,0x21,0x41,0x81,0x01,0x01,/*"未命名文件",0*///768-783当开始洒水显示洒水图案 上
0x10,0x10,0x14,0xD4,0x54,0x54,0x54,0xFC, 0x52,0x52,0x52,0xD3,0x12,0x10,0x10,0x00,/*"重置*///864-895当蓝牙连接时显示Link 上
0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D, 0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,//895/*"n",2*//*"k",3*/
};
unsigned char showx[]= {
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",*/
0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",*///
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",*///
0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",*///
0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",*///
0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,/*"5",*///
0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",*///
0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,/*"7",*///
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",*///
0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",*///
0x84,0x42,0x21,0x10,0x08,0x04,0x02,0x01, 0x00,0x00,0x03,0x04,0x08,0x10,0x21,0x42,/*"未命名文件",0*///896-911当开始洒水显示洒水图案 下
0x40,0x40,0x50,0x57,0x55,0x55,0x55,0x7F, 0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,/*重置*///992-10023当蓝牙连接时显示Link 下
0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55, 0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00//1023/*"n",2*//*"k",3*/
};
unsigned char show1[]= {
/*-------------------------------------111111111111111111------------------------------------------------------------*/
//第1-1行
0x00,0x40,0x42,0x44,0x58,0x40,0x40,0x7F, 0x40,0x40,0x50,0x48,0xC6,0x00,0x00,0x00,/*"当",1-1*/
0x08,0x08,0xE8,0x29,0x2E,0x28,0xE8,0x08, 0x08,0xC8,0x0C,0x0B,0xE8,0x08,0x08,0x00,/*"前",1-1*/
0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92, 0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,/*"湿",1-1*/
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25, 0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,/*"度",1-1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",1-1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//第80-87 88-95测量湿度需要实时更新上半部
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"%",0*///127
//第1-2行
0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44, 0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,/*"当",1-2*/
0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00, 0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00,/*"前",1-2*/
0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F, 0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,/*"湿",1-2*/
0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25, 0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*"度",1-2*/
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",1-2*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//208-215 216-223测量湿度需要实时更新下半部
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"%",0*///255
/*-------------------------------------22222222222222222222------------------------------------------------------------------*/
//第2-1行
0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E, 0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,/*"设",0*/
0x10,0x0C,0x44,0x44,0x44,0x44,0x45,0xC6, 0x44,0x44,0x44,0x44,0x44,0x14,0x0C,0x00,/*"定",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",1-1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//304-311 312-319设定湿度存于EEPROM 上
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"%",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //383
//第2-2行
0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43, 0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,/*"设",0*/
0x80,0x40,0x20,0x1E,0x20,0x40,0x40,0x7F, 0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,/*"定",1*/
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",1-2*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//432-439 440-447设定湿度存于EEPROM 下
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"%",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//511
/*-------------------------------------3333333333333333------------------------------------------------------------------*/
//第3-1行
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//639
//第3-2行
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//767
/*-------------------------------------444444444444444444444------------------------------------------------------------*/
//第4-1行
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*///768-783当开始洒水显示洒水图案 上
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",1-1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*重置1*///864-895当蓝牙连接时显示Link 上
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//895/*"n",2*//*"k",3*/
//第4-2行
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*///896-911当开始洒水显示洒水图案 下
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*重置*///992-10023
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1023/*"n",2*//*"k",3*/
0x00
};
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
//SCL = high;
////Delay_us(1);
//SDA = high;
////Delay_us(1);
//SDA = low;
//// Delay_us(1);
//SCL = low;
//// Delay_us(1);
SCL_1();
SDA_1();
SDA_0();
SCL_0();
}/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
//SCL = low;
////Delay_us(1);
//SDA = low;
////Delay_us(1);
//SCL = high;
////Delay_us(1);
//SDA = high;
////Delay_us(1);
SCL_0();
SDA_0();
SCL_1();
SDA_1();
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)//i++
{
unsigned char i;
for(i=0;
i<8;
i++)
{
if(IIC_Byte & 0x80)//1?0?
//SDA=high;
//将数据转换为高低电平写入每一个循环写入一8格数列
SDA_1();
else
//SDA=low;
SDA_0();
//Delay_us(1);
//SCL=high;
SCL_1();
//Delay_us(1);
//SCL=low;
SCL_0();
//Delay_us(1);
IIC_Byte<<=1;
}
//SDA=1;
SDA_1();
//Delay_us(1);
//SCL=1;
SCL_1();
//Delay_us(1);
//SCL=0;
SCL_0();
//Delay_us(1);
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78);
//Slave address,SA0=0
Write_IIC_Byte(0x00);
//write command
Write_IIC_Byte(IIC_Command);
IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40);
//write data
Write_IIC_Byte(IIC_Data);
IIC_Stop();
}
/********************************************
// fill_Picture
********************************************/
//void fill_picture(unsigned char fill_Data)
//{
//unsigned char m,n;
//for(m=0;
m<8;
m++)
//{
//Write_IIC_Command(0xb0+m);
//page0-page1
//Write_IIC_Command(0x00);
//low column start address
//Write_IIC_Command(0x10);
//high column start address
//for(n=0;
n<128;
n++)
//{
//Write_IIC_Data(fill_Data);
//}
//}
//}void picture_2(void)
{
unsigned char x,y,i;
Write_IIC_Command(0xb0+y);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(y=0;
y<8;
y++)//屏幕分为8行
{
for(x=0;
x<128;
x++)//每行写入128*8=1024个0X??
{
Write_IIC_Data(show1[i++]);
}
}
}
3.oled.h
//主要将GPIO重定义,以及函数声明
#ifndef __OLED_H
#define __OLED_H
#include "sys.h"
#include "stdlib.h"#define SCL_0() GPIO_ResetBits(GPIOD,GPIO_Pin_6)//CLK
#define SCL_1() GPIO_SetBits(GPIOD,GPIO_Pin_6)#define SDA_0() GPIO_ResetBits(GPIOD,GPIO_Pin_7)//DIN
#define SDA_1() GPIO_SetBits(GPIOD,GPIO_Pin_7)void OLED_GPIO_Init(void);
void Initial_LY096BG30();
//void picture_1(int Y,int K,int S,int L);
void picture_2();
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
#endif
附件:百度网盘工程源码:
链接:https://pan.baidu.com/s/1_3QQyL9jqT8SRgPNHu8SoA
提取码:zzzz
结束语:
字模提取工具:PCtoLCD2002
推荐阅读
- oled模块学习|OLED_I2C_SH1106屏幕教程
- stm32|基于STM32的智能家具控制系统(ESP-01S(8266)、手机app远程控制、远程显示温度)
- 智能手环|基于STM32单片机的蓝牙智能手环系统
- Arduino|Part5 -- 如何使用Arduino的IIC总线(Wire)
- 【技术杂文】系列|嵌入式端的神经网络算法部署和实现综合
- 深度学习|【GitHub开源】BP神经网络分类C++实现
- 单片机|SWM32系列教程3-时钟配置和GPIO
- MCU51系统设计|基于单片机的GSM安防系统设计(#0432)
- 单片机|RT-Thread文件系统详细说明(FatFs+DFS)