当前位置:网站首页>STM32F103 series controlled OLED IIC 4-pin
STM32F103 series controlled OLED IIC 4-pin
2022-06-30 05:51:00 【Wen 9】
Recently, I am studying four needle OLED Let's start with the renderings
Leave an email in the comment area of the general engineering documents and I will send it to
hardware component
If you have a development board, just use it directly If you don't have one, go to a treasure and buy one STM32F103C8T6(10 yuan )
Like this
wiring part
OLED There are four interfaces in total Not really SCL( The clock ),SDA( data ),GND( Power supply negative ),VCC3.3( Attention is connected 3.3V, 5V It will burn out )
The positive and negative of the power supply are connected randomly 3.3V Just OK SCL,SDA Connect to MCU IO mouth See the schematic diagram for the specific configuration My chip corresponds to PB6,7 Just connect it with a flat cable
The hardware part ends .
Software part
The source code is for reference Pro test energy use Have to say It's really comfortable to stand on the shoulders of giants Now share the Lord and OLED C file Leave an email in the comment area of the general engineering documents and I will send it to
// Lord c file
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
int main(void)
{ u8 t;
delay_init(); // Delay function initialization
NVIC_Configuration(); // Set up NVIC interrupt
// delay_ms(8000);
OLED_Init();
OLED_Clear() ;
t=' ';
// Show Chinese characters
OLED_ShowCHinese(18,0,0);//
OLED_ShowCHinese(36,0,1);//
OLED_ShowCHinese(72,0,2);//
OLED_ShowCHinese(90,0,3);//
while(1)
{
OLED_Clear();
OLED_ShowCHinese(18,0,0);
OLED_ShowCHinese(36,0,1);
OLED_ShowCHinese(72,0,2);
OLED_ShowCHinese(90,0,3);
OLED_ShowString(6,3,"0.96' OLED TEST",16);
OLED_ShowString(0,6,"ASCII:",16);
OLED_ShowString(63,6,"CODE:",16);
OLED_ShowChar(48,6,t,16);// Show characters
t++;
if(t>'~')t=' ';
OLED_ShowNum(103,6,t,3,16);
delay_ms(8000);
delay_ms(8000);
delay_ms(8000);
delay_ms(8000);
delay_ms(8000);
OLED_DrawBMP(0,0,128,8,BMP1); // display picture
delay_ms(8000);
delay_ms(8000);
delay_ms(8000);
delay_ms(8000);
OLED_DrawBMP(0,0,128,8,BMP1);
delay_ms(8000);
delay_ms(8000);
delay_ms(8000);
delay_ms(8000);
}
}
//oled c file
void IIC_Start()
{
OLED_SCLK_Set() ;
OLED_SDIN_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set() ;
// OLED_SCLK_Clr();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
void IIC_Wait_Ack()
{
//GPIOB->CRH &= 0XFFF0FFFF; // Set up PB12 Enter... For pull-up
//GPIOB->CRH |= 0x00080000;
// OLED_SDA = 1;
// delay_us(1);
//OLED_SCL = 1;
//delay_us(50000);
/* while(1)
{
if(!OLED_SDA) // Determine whether a response has been received
{
//GPIOB->CRH &= 0XFFF0FFFF; // Set up PB12 For push-pull output
//GPIOB->CRH |= 0x00030000;
return;
}
}
*/
OLED_SCLK_Set() ;
OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();
for(i=0;i<8;i++)
{
m=da;
// OLED_SCLK_Clr();
m=m&0x80;
if(m==0x80)
{OLED_SDIN_Set();}
else OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
}
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x00); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78); //D/C#=0; R/W#=0
IIC_Wait_Ack();
Write_IIC_Byte(0x40); //write data
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd)
{
Write_IIC_Data(dat);
}
else {
Write_IIC_Command(dat);
}
}
/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
unsigned char m,n;
for(m=0;m<8;m++)
{
OLED_WR_Byte(0xb0+m,0); //page0-page1
OLED_WR_Byte(0x00,0); //low column start address
OLED_WR_Byte(0x10,0); //high column start address
for(n=0;n<128;n++)
{
OLED_WR_Byte(fill_Data,1);
}
}
}
/***********************Delay****************************************/
void Delay_50ms(unsigned int Del_50ms)
{
unsigned int m;
for(;Del_50ms>0;Del_50ms--)
for(m=6245;m>0;m--);
}
void Delay_1ms(unsigned int Del_1ms)
{
unsigned char j;
while(Del_1ms--)
{
for(j=0;j<123;j++);
}
}
// Coordinate display
void OLED_Set_Pos(unsigned char x, unsigned char y)
{ OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f),OLED_CMD);
}
// Turn on OLED Show
void OLED_Display_On(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDCÃüÁî
OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON
OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
}
// close OLED Show
void OLED_Display_Off(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDCÃüÁî
OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF
OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
}
// Screen clearing function
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //ÉèÖÃÒ³µØÖ·£¨0~7£
OLED_WR_Byte (0x00,OLED_CMD); //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
OLED_WR_Byte (0x10,OLED_CMD); //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·
for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
} // Update display
}
void OLED_On(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //ÉèÖÃÒ³µØÖ·£¨0~7£
OLED_WR_Byte (0x00,OLED_CMD); //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
OLED_WR_Byte (0x10,OLED_CMD); //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·
for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
} // Update display
}
// Display a character at the specified position
//x:0~127
//y:0~63
//mode: 0 On the contrary 1 Normal display
//size: Select the font 16/12
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{
unsigned char c=0,i=0;
c=chr-' ';// Get the offset value
if(x>Max_Column-1){x=0;y=y+2;}
if(Char_Size ==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else {
OLED_Set_Pos(x,y);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
//m^n function
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
// Display two numbers
//x,y : Starting point coordinates
//len : The number of digits
//size: Font size
//mode:0 Fill mode 1 Superposition mode
//num: The number (0~4294967295);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/oled_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
continue;
}else enshow=1;
}
OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
}
}
// Display a character
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
unsigned char j=0;
while (chr[j]!='\0')
{ OLED_ShowChar(x,y,chr[j],Char_Size);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
// Show Chinese characters
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{
u8 t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
adder+=1;
}
}
/*********** Show BMP picture *****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
if(y1%8==0) y=y1/8;
else y=y1/8+1;
for(y=y0;y<y1;y++)
{
OLED_Set_Pos(x0,y);
for(x=x0;x<x1;x++)
{
OLED_WR_Byte(BMP[j++],OLED_DATA);
}
}
}
// initialization SSD1306
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //ʹÄÜPC,D,G¶Ë¿ÚʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8; //PD3,PD6ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // Push pull output
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Speed 50HZ
GPIO_Init(GPIOD, &GPIO_InitStructure); // initialization GPIOD3,6
GPIO_SetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8); //PD3,PD6 Êä³ö¸ß
#if OLED_MODE==1
GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 Push pull output
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,0xFF); //PC0~7 High output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PG13,14,15 OUT Push pull output
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PG13,14,15 OUT High output
#else
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PC0,1 OUT Push pull output
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1); //PC0,1 OUT High output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PG15 OUT Push pull output RST
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_15); //PG15 OUT High output
#endif
delay_ms(200);
OLED_WR_Byte(0xAE,OLED_CMD);//--display off
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
OLED_WR_Byte(0x81,OLED_CMD); // contract control
OLED_WR_Byte(0xFF,OLED_CMD);//--128
OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
OLED_WR_Byte(0x00,OLED_CMD);//
OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
OLED_WR_Byte(0x80,OLED_CMD);//
OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
OLED_WR_Byte(0x05,OLED_CMD);//
OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
OLED_WR_Byte(0xF1,OLED_CMD);//
OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
OLED_WR_Byte(0x12,OLED_CMD);//
OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
OLED_WR_Byte(0x30,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
OLED_WR_Byte(0x14,OLED_CMD);//
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}
The code section ends Leave an email in the comment area of the general engineering documents and I will send it to
2020.12.3
Some improvements have been made to the code Realized through the key to turn the page The key part is the code of the moving punctual atom The main function is now posted
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "key.h"
int main(void)
{
u8 key=0;
delay_init(); // Delay function initialization
NVIC_Configuration(); // Set up nvic interrupt
OLED_Init(); //oled initialization
OLED_Clear(); // Clear the screen
KEY_Init(); // Key initialization
OLED_ShowCHinese(18,0,0);//
OLED_ShowCHinese(36,0,1);//
OLED_ShowCHinese(72,0,0);//
OLED_ShowCHinese(90,0,1);//
while(1)
{
key=KEY_Scan(0); //µÃµ½¼üÖµ
// if(key)
// {
switch(key)
{
case WKUP_PRES:
OLED_Init();
OLED_Clear();
OLED_ShowCHinese(18,0,2);
OLED_ShowCHinese(36,0,3);
OLED_ShowCHinese(72,0,4);
OLED_ShowCHinese(90,0,5);
break;
case KEY1_PRES:
OLED_Init();
OLED_Clear();
OLED_ShowCHinese(18,0,7);
OLED_ShowCHinese(36,0,8);
OLED_ShowCHinese(72,0,9);
OLED_ShowCHinese(90,0,10);
break;
case KEY0_PRES:
break;
}
// }else delay_ms(10);
}
}
The effect is as shown in the picture
The end
边栏推荐
- Digital signature——
- What kind of answer has Inspur given in the big AI model landing test?
- 剑指 Offer 18. 删除链表的节点
- OpenCL线程代数库ViennaCL的使用
- We strongly recommend more than a dozen necessary plug-ins for idea development
- Online assignment of C language program design in the 22nd spring of Western Polytechnic University
- Lantern Festival | maoqiu technology and everyone "guess riddles and have a good night"
- C语言基础小操作
- Sound network, standing in the "soil" of the Internet of things
- Xi'an Jiaotong 21st autumn online expansion resources of online trade and marketing (II)
猜你喜欢
How to judge the quality of network transformer? What symptom is network filter transformer broken?
Today, Ali came out with 35K. It's really sandpaper that wiped my ass. it showed me my hand
C语言基础小操作
Inno setup the simplest user-defined interface effect
Vfpbs uploads excel and saves MSSQL to the database
Use the code cloud publicholiday project to determine whether a day is a working day
Leetcode search insert location
Using lazy < t > in C # to realize singleton mode in WPF
Terminal convenient SSH connection
86. separate linked list
随机推荐
Learning about functions QAQ
After getting these performance test decomposition operations, your test path will be more smooth
Turn off automatic outlining in Visual Studio - turning off automatic outlining in Visual Studio
Today, Ali came out with 35K. It's really sandpaper that wiped my ass. it showed me my hand
What kind of answer has Inspur given in the big AI model landing test?
Promise知识点拾遗
Leetcode56. consolidation interval
SSL证书续费相关问题详解
Attempt to redefine 'timeout' at line 2 solution
1380. lucky numbers in matrices
【板栗糖GIS】global mapper—如何把栅格的高程值赋予给点
Create priority queue
How to write a thesis
Uboot reads the DDR memory size by sending 'R' characters through the terminal
Rotating frame target detection mmrotate v0.3.1 training dota data set (II)
The average salary of software testing in 2022 has been released. Have you been averaged?
9. naive Bayes
2022年,谁在推动音视频产业的新拐点?
旋转框目标检测mmrotate v0.3.1 训练DOTA数据集(二)
Shopping list--