303 lines
8.4 KiB
C
303 lines
8.4 KiB
C
|
///******************** (C) COPYRIGHT 2023 GeekRebot *****************************
|
|||
|
//* File Name : oled.c
|
|||
|
//* Current Version : V1.0 & ST 3.5.0
|
|||
|
//* Author : zhanli 719901725@qq.com
|
|||
|
//* Date of Issued : 2024.01.09
|
|||
|
//* Comments : oled的iic方式驱动
|
|||
|
// SCL -> PA10,SDA -> PA11
|
|||
|
//********************************************************************************/
|
|||
|
//#include "oled.h"
|
|||
|
//#include "stdlib.h"
|
|||
|
//#include "oledfont.h"
|
|||
|
//#include "delay.h"
|
|||
|
//#include "bsp_iic.h"
|
|||
|
//// OLED的显存
|
|||
|
//// 存放格式如下.
|
|||
|
////[0]0 1 2 3 ... 127
|
|||
|
////[1]0 1 2 3 ... 127
|
|||
|
////[2]0 1 2 3 ... 127
|
|||
|
////[3]0 1 2 3 ... 127
|
|||
|
////[4]0 1 2 3 ... 127
|
|||
|
////[5]0 1 2 3 ... 127
|
|||
|
////[6]0 1 2 3 ... 127
|
|||
|
////[7]0 1 2 3 ... 127
|
|||
|
|
|||
|
//void Write_IIC_Command(unsigned char IIC_Command)
|
|||
|
//{
|
|||
|
// IIC_Start();
|
|||
|
// IIC_Send_Byte(0x78); // Slave address,SA0=0
|
|||
|
// IIC_Wait_Ack();
|
|||
|
// IIC_Send_Byte(0x00); // write command
|
|||
|
// IIC_Wait_Ack();
|
|||
|
// IIC_Send_Byte(IIC_Command);
|
|||
|
// IIC_Wait_Ack();
|
|||
|
// IIC_Stop();
|
|||
|
//}
|
|||
|
///**********************************************
|
|||
|
//// IIC Write Data
|
|||
|
//**********************************************/
|
|||
|
//void Write_IIC_Data(unsigned char IIC_Data)
|
|||
|
//{
|
|||
|
// IIC_Start();
|
|||
|
// IIC_Send_Byte(0x78); // D/C#=0; R/W#=0
|
|||
|
// IIC_Wait_Ack();
|
|||
|
// IIC_Send_Byte(0x40); // write data
|
|||
|
// IIC_Wait_Ack();
|
|||
|
// IIC_Send_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++);
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//// 坐标设置
|
|||
|
|
|||
|
//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);
|
|||
|
//}
|
|||
|
//// 开启OLED显示
|
|||
|
//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
|
|||
|
//}
|
|||
|
//// 关闭OLED显示
|
|||
|
//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
|
|||
|
//}
|
|||
|
|
|||
|
//// 清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
|
|||
|
//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);
|
|||
|
// } // 更新显示
|
|||
|
//}
|
|||
|
|
|||
|
//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);
|
|||
|
// } // 更新显示
|
|||
|
//}
|
|||
|
//// 在指定位置显示一个字符,包括部分字符
|
|||
|
//// x:0~127
|
|||
|
//// y:0~63
|
|||
|
//// mode:0,反白显示;1,正常显示
|
|||
|
//// size:选择字体 16/12
|
|||
|
//void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 Char_Size)
|
|||
|
//{
|
|||
|
// unsigned char c = 0, i = 0;
|
|||
|
// c = chr - ' '; // 得到偏移后的值
|
|||
|
// 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函数
|
|||
|
//u32 oled_pow(u8 m, u8 n)
|
|||
|
//{
|
|||
|
// u32 result = 1;
|
|||
|
// while (n--)
|
|||
|
// result *= m;
|
|||
|
// return result;
|
|||
|
//}
|
|||
|
//// 显示2个数字
|
|||
|
//// x,y :起点坐标
|
|||
|
//// len :数字的位数
|
|||
|
//// size:字体大小
|
|||
|
//// mode:模式 0,填充模式;1,叠加模式
|
|||
|
//// num:数值(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);
|
|||
|
// }
|
|||
|
//}
|
|||
|
//// 显示一个字符号串
|
|||
|
//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++;
|
|||
|
// }
|
|||
|
//}
|
|||
|
//// 显示汉字
|
|||
|
//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;
|
|||
|
// }
|
|||
|
//}
|
|||
|
///***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
|
|||
|
//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);
|
|||
|
// }
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//// 初始化SSD1306
|
|||
|
//void OLED_Init(void)
|
|||
|
//{
|
|||
|
// IIC_Init();
|
|||
|
// Delay_ms(800);
|
|||
|
// 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
|
|||
|
//}
|