From 867e0ed50002f55d541aea0328e8ea942f06a2f5 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Sat, 12 Apr 2025 00:25:48 +0800 Subject: [PATCH] update --- Project.uvoptx | 4 +- Src/OLED.h | 14 ++ Src/OLED_Font.h | 294 ++++++++++++++++++++++++++++++++++++++++ Src/main.cpp | 12 +- Src/ztLed.hpp | 2 +- Src/ztOLED.hpp | 351 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 670 insertions(+), 7 deletions(-) create mode 100644 Src/OLED.h create mode 100644 Src/OLED_Font.h create mode 100644 Src/ztOLED.hpp diff --git a/Project.uvoptx b/Project.uvoptx index 73ead5b..893b155 100644 --- a/Project.uvoptx +++ b/Project.uvoptx @@ -180,7 +180,7 @@ Start - 1 + 0 0 0 0 @@ -248,7 +248,7 @@ Lib - 1 + 0 0 0 0 diff --git a/Src/OLED.h b/Src/OLED.h new file mode 100644 index 0000000..9b173ee --- /dev/null +++ b/Src/OLED.h @@ -0,0 +1,14 @@ + +#ifndef __OLED_H +#define __OLED_H +#include "stm32f10x.h" +void OLED_Init(void); +void OLED_Clear(void); +void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char); +void OLED_ShowString(uint8_t Line, uint8_t Column, char *String); +void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); +void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length); +void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); +void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); + +#endif diff --git a/Src/OLED_Font.h b/Src/OLED_Font.h new file mode 100644 index 0000000..570e0a4 --- /dev/null +++ b/Src/OLED_Font.h @@ -0,0 +1,294 @@ +#include "stm32f10x.h" +#ifndef __OLED_FONT_H +#define __OLED_FONT_H + +/*OLED字模库,宽8像素,高16像素*/ +inline const uint8_t OLED_F8x16[][16]= +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0 + + 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1 + + 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2 + + 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00, + 0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3 + + 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00, + 0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4 + + 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00, + 0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5 + + 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00, + 0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6 + + 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7 + + 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00, + 0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8 + + 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00, + 0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9 + + 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00, + 0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10 + + 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00, + 0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11 + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12 + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13 + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14 + + 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04, + 0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15 + + 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, + 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16 + + 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, + 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17 + + 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, + 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18 + + 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, + 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19 + + 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, + 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20 + + 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, + 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21 + + 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, + 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22 + + 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, + 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23 + + 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, + 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24 + + 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, + 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25 + + 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26 + + 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27 + + 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00, + 0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28 + + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, + 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29 + + 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00, + 0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30 + + 0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00, + 0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31 + + 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00, + 0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32 + + 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, + 0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33 + + 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00, + 0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34 + + 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, + 0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35 + + 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00, + 0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36 + + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, + 0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37 + + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, + 0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38 + + 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00, + 0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39 + + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08, + 0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40 + + 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00, + 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41 + + 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00, + 0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42 + + 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00, + 0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43 + + 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00, + 0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44 + + 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00, + 0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45 + + 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08, + 0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46 + + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00, + 0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47 + + 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00, + 0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48 + + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00, + 0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49 + + 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00, + 0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50 + + 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00, + 0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51 + + 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00, + 0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52 + + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08, + 0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53 + + 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08, + 0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54 + + 0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00, + 0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55 + + 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08, + 0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56 + + 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00, + 0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57 + + 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00, + 0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58 + + 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00, + 0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59 + + 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60 + + 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00, + 0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61 + + 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62 + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63 + + 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64 + + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, + 0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65 + + 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00, + 0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66 + + 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, + 0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67 + + 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00, + 0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68 + + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, + 0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69 + + 0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18, + 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70 + + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00, + 0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71 + + 0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00, + 0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72 + + 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00, + 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73 + + 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00, + 0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74 + + 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00, + 0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75 + + 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00, + 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76 + + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, + 0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77 + + 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00, + 0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78 + + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, + 0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79 + + 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00, + 0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80 + + 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00, + 0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81 + + 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00, + 0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82 + + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00, + 0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83 + + 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00, + 0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84 + + 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00, + 0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85 + + 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80, + 0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86 + + 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80, + 0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87 + + 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00, + 0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88 + + 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80, + 0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89 + + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, + 0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90 + + 0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02, + 0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91 + + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92 + + 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00, + 0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93 + + 0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94 +}; + +#endif diff --git a/Src/main.cpp b/Src/main.cpp index 8e5cc05..b6abf2a 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -1,13 +1,17 @@ #include "Delay.hpp" -#include "stm32f10x_gpio.h" -#include "stm32f10x_rcc.h" -#include "stm32f10x.h" // Device header #include "ztLed.hpp" +#include "ztOLED.hpp" -int main(void){ +int main(){ zt::Led leda0(RCC_APB2Periph_GPIOA,GPIO_Pin_0,GPIOA); zt::Led ledc13(RCC_APB2Periph_GPIOC,GPIO_Pin_13,GPIOC); + zt::Oled oled(RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_8,GPIO_Pin_9); + oled.OLED_ShowString(1, 1, (char*)"Hello,world!") + .OLED_ShowString(2, 1, (char*)"by Zengtudor") + .OLED_ShowString(3, 1, (char*)"From BDFS") + .OLED_ShowString(4, 1, (char*)" EEC-RPD"); + u32 delayTime = 50; while(true){ delayTime+=1; diff --git a/Src/ztLed.hpp b/Src/ztLed.hpp index 8f5e1c8..849f5b0 100644 --- a/Src/ztLed.hpp +++ b/Src/ztLed.hpp @@ -15,7 +15,7 @@ namespace zt{ GPIO_InitTypeDef gpioInitStructure = {_GPIO_Pin,GPIO_Speed_50MHz,GPIO_Mode_Out_PP}; GPIO_Init(_GPIOx, &gpioInitStructure); } - ~Led(){ + virtual ~Led(){ GPIO_DeInit(_GPIOx); RCC_APB2PeriphClockCmd(_RCC_APB2Periph, DISABLE); } diff --git a/Src/ztOLED.hpp b/Src/ztOLED.hpp new file mode 100644 index 0000000..29064da --- /dev/null +++ b/Src/ztOLED.hpp @@ -0,0 +1,351 @@ +#pragma once + +#include "stm32f10x.h" +#include "stm32f10x_gpio.h" +#include "stm32f10x_rcc.h" +#include "OLED_Font.h" + +namespace zt{ + class Oled{ + private: + const u32 _RCC_APB2Periph; + GPIO_TypeDef *const _GPIOx; + const u16 _GPIO_PIN_SCL; + const u16 _GPIO_PIN_SDA; + + Oled&OLED_W_SCL(const u8 &bit){ + GPIO_WriteBit(_GPIOx, _GPIO_PIN_SCL, (BitAction)(bit)); + return *this; + } + + Oled&OLED_W_SDA(const u8 &bit){ + GPIO_WriteBit(_GPIOx, _GPIO_PIN_SDA, (BitAction)(bit)); + return *this; + } + + /** + * @brief I2C开始 + * @param 无 + * @retval 无 + */ + void OLED_I2C_Start() + { + OLED_W_SDA(1); + OLED_W_SCL(1); + OLED_W_SDA(0); + OLED_W_SCL(0); + } + /** + * @brief I2C停止 + * @param 无 + * @retval 无 + */ + void OLED_I2C_Stop() + { + OLED_W_SDA(0); + OLED_W_SCL(1); + OLED_W_SDA(1); + } + /** + * @brief I2C发送一个字节 + * @param Byte 要发送的一个字节 + * @retval 无 + */ + void OLED_I2C_SendByte(const uint8_t &Byte) + { + uint8_t i; + for (i = 0; i < 8; i++) + { + OLED_W_SDA(!!(Byte & (0x80 >> i))); + OLED_W_SCL(1); + OLED_W_SCL(0); + } + OLED_W_SCL(1); //额外的一个时钟,不处理应答信号 + OLED_W_SCL(0); + } + /** + * @brief OLED写命令 + * @param Command 要写入的命令 + * @retval 无 + */ + void OLED_WriteCommand(uint8_t Command) + { + OLED_I2C_Start(); + OLED_I2C_SendByte(0x78); //从机地址 + OLED_I2C_SendByte(0x00); //写命令 + OLED_I2C_SendByte(Command); + OLED_I2C_Stop(); + } + /** + * @brief OLED写数据 + * @param Data 要写入的数据 + * @retval 无 + */ + void OLED_WriteData(uint8_t Data) + { + OLED_I2C_Start(); + OLED_I2C_SendByte(0x78); //从机地址 + OLED_I2C_SendByte(0x40); //写数据 + OLED_I2C_SendByte(Data); + OLED_I2C_Stop(); + } + /** + * @brief OLED设置光标位置 + * @param Y 以左上角为原点,向下方向的坐标,范围:0~7 + * @param X 以左上角为原点,向右方向的坐标,范围:0~127 + * @retval 无 + */ + void OLED_SetCursor(uint8_t Y, uint8_t X) + { + OLED_WriteCommand(0xB0 | Y); //设置Y位置 + OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4)); //设置X位置高4位 + OLED_WriteCommand(0x00 | (X & 0x0F)); //设置X位置低4位 + } + + /** + * @brief OLED次方函数 + * @retval 返回值等于X的Y次方 + */ + uint32_t OLED_Pow(uint32_t X, uint32_t Y) + { + uint32_t Result = 1; + while (Y--) + { + Result *= X; + } + return Result; + } + + + + + /** + * @brief OLED初始化 + * @param 无 + * @retval 无 + */ + void OLED_Init() + { + uint32_t i, j; + + for (i = 0; i < 1000; i++) //上电延时 + { + for (j = 0; j < 1000; j++); + } + + // OLED_I2C_Init(); //端口初始化 + + OLED_WriteCommand(0xAE); //关闭显示 + + OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率 + OLED_WriteCommand(0x80); + + OLED_WriteCommand(0xA8); //设置多路复用率 + OLED_WriteCommand(0x3F); + + OLED_WriteCommand(0xD3); //设置显示偏移 + OLED_WriteCommand(0x00); + + OLED_WriteCommand(0x40); //设置显示开始行 + + OLED_WriteCommand(0xA1); //设置左右方向,0xA1正常 0xA0左右反置 + + OLED_WriteCommand(0xC8); //设置上下方向,0xC8正常 0xC0上下反置 + + OLED_WriteCommand(0xDA); //设置COM引脚硬件配置 + OLED_WriteCommand(0x12); + + OLED_WriteCommand(0x81); //设置对比度控制 + OLED_WriteCommand(0xCF); + + OLED_WriteCommand(0xD9); //设置预充电周期 + OLED_WriteCommand(0xF1); + + OLED_WriteCommand(0xDB); //设置VCOMH取消选择级别 + OLED_WriteCommand(0x30); + + OLED_WriteCommand(0xA4); //设置整个显示打开/关闭 + + OLED_WriteCommand(0xA6); //设置正常/倒转显示 + + OLED_WriteCommand(0x8D); //设置充电泵 + OLED_WriteCommand(0x14); + + OLED_WriteCommand(0xAF); //开启显示 + + OLED_Clear(); //OLED清屏 + } + public: + /** + * @brief OLED清屏 + * @param 无 + * @retval 无 + */ + Oled& OLED_Clear(void) + { + uint8_t i, j; + for (j = 0; j < 8; j++) + { + OLED_SetCursor(j, 0); + for(i = 0; i < 128; i++) + { + OLED_WriteData(0x00); + } + } + return *this; + } + /** + * @brief OLED显示一个字符 + * @param Line 行位置,范围:1~4 + * @param Column 列位置,范围:1~16 + * @param Char 要显示的一个字符,范围:ASCII可见字符 + * @retval 无 + */ + Oled& OLED_ShowChar(uint8_t Line, uint8_t Column, char Char) + { + uint8_t i; + OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分 + for (i = 0; i < 8; i++) + { + OLED_WriteData(OLED_F8x16[Char - ' '][i]); //显示上半部分内容 + } + OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8); //设置光标位置在下半部分 + for (i = 0; i < 8; i++) + { + OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]); //显示下半部分内容 + } + return *this; + } + + /** + * @brief OLED显示字符串 + * @param Line 起始行位置,范围:1~4 + * @param Column 起始列位置,范围:1~16 + * @param String 要显示的字符串,范围:ASCII可见字符 + * @retval 无 + */ + Oled& OLED_ShowString(uint8_t Line, uint8_t Column, char *String) + { + uint8_t i; + for (i = 0; String[i] != '\0'; i++) + { + OLED_ShowChar(Line, Column + i, String[i]); + } + return *this; + } + + /** + * @brief OLED显示数字(十进制,正数) + * @param Line 起始行位置,范围:1~4 + * @param Column 起始列位置,范围:1~16 + * @param Number 要显示的数字,范围:0~4294967295 + * @param Length 要显示数字的长度,范围:1~10 + * @retval 无 + */ + Oled& OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) + { + uint8_t i; + for (i = 0; i < Length; i++) + { + OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0'); + } + return *this; + } + + /** + * @brief OLED显示数字(十进制,带符号数) + * @param Line 起始行位置,范围:1~4 + * @param Column 起始列位置,范围:1~16 + * @param Number 要显示的数字,范围:-2147483648~2147483647 + * @param Length 要显示数字的长度,范围:1~10 + * @retval 无 + */ + Oled& OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length) + { + uint8_t i; + uint32_t Number1; + if (Number >= 0) + { + OLED_ShowChar(Line, Column, '+'); + Number1 = Number; + } + else + { + OLED_ShowChar(Line, Column, '-'); + Number1 = -Number; + } + for (i = 0; i < Length; i++) + { + OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0'); + } + return *this; + } + + /** + * @brief OLED显示数字(十六进制,正数) + * @param Line 起始行位置,范围:1~4 + * @param Column 起始列位置,范围:1~16 + * @param Number 要显示的数字,范围:0~0xFFFFFFFF + * @param Length 要显示数字的长度,范围:1~8 + * @retval 无 + */ + Oled& OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) + { + uint8_t i, SingleNumber; + for (i = 0; i < Length; i++) + { + SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16; + if (SingleNumber < 10) + { + OLED_ShowChar(Line, Column + i, SingleNumber + '0'); + } + else + { + OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A'); + } + } + return *this; + } + + /** + * @brief OLED显示数字(二进制,正数) + * @param Line 起始行位置,范围:1~4 + * @param Column 起始列位置,范围:1~16 + * @param Number 要显示的数字,范围:0~1111 1111 1111 1111 + * @param Length 要显示数字的长度,范围:1~16 + * @retval 无 + */ + Oled& OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) + { + uint8_t i; + for (i = 0; i < Length; i++) + { + OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0'); + } + return *this; + } + + + Oled(const u32 &RCC_APB2Periph,GPIO_TypeDef *const& GPIOx,const u16 &GPIO_PIN_SCL,const u16 &GPIO_PIN_SDA) + :_RCC_APB2Periph(RCC_APB2Periph),_GPIOx(GPIOx),_GPIO_PIN_SCL(GPIO_PIN_SCL),_GPIO_PIN_SDA(GPIO_PIN_SDA){ + RCC_APB2PeriphClockCmd(_RCC_APB2Periph, ENABLE); + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Pin = _GPIO_PIN_SCL; + GPIO_Init(_GPIOx, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = _GPIO_PIN_SDA; + GPIO_Init(_GPIOx, &GPIO_InitStructure); + + OLED_W_SCL(1); + OLED_W_SDA(1); + + OLED_Init(); + } + virtual ~Oled(){ + GPIO_DeInit(_GPIOx); + RCC_APB2PeriphClockCmd(_RCC_APB2Periph, DISABLE); + } + }; +} \ No newline at end of file