STM32——OLED库讲解(2/2)

事接上一集,没看过的直接点击——>CSDN

目录

OLED显示

OLED画一个点

获取OLED点的位置

OLED由点——>画图

 点堆成了图——>变成了有序符号

大概讲述

字符数据获取:

显示字符:

注意事项:

扩展性:

字符——>字符串

 显示数字


OLED显示

OLED画一个点

void OLED_DrawPoint(uint8_t X, uint8_t Y)
{
	/*参数检查,保证指定位置不会超出屏幕范围*/
	if (X > 127) {return;}
	if (Y > 63) {return;}
	
	/*将显存数组指定位置的一个Bit数据置1*/
	OLED_DisplayBuf[Y / 8][X] |= 0x01 << (Y % 8);
}

两个if函数将我们的输入位置确定在屏幕内,这个昨天才说过。

而我们的OLED缓冲序列在门拉出来好好讲讲!

  • Y / 8计算了Y坐标对应的显存数组的行号。因为每一行代表8个像素,所以我们用Y除以8来得到正确的行号。
  • X是显存数组的列号,直接表示了点的水平位置。
  • Y % 8计算了Y坐标在该行中的具体位位置(0到7)。因为我们要在一个字节中设置特定位,所以我们需要知道要设置的是哪一位。
  • 0x01 << (Y % 8)是一个位操作。它将数字1(在二进制中表示为0000 0001)左移(Y % 8)位。这样,我们就得到了一个只有一位是1的字节,其他位都是0。就是选定我们需要的点进行置一!!!
  • |=是位或赋值运算符。它将左边的表达式的结果与右边的表达式进行位或操作,并将结果存回左边的变量。在这里,它将OLED_DisplayBuf[Y / 8][X]的当前值与0x01 << (Y % 8)进行位或操作,以确保OLED_DisplayBuf[Y / 8][X]中对应的位置被设置为1(如果它之前已经是1,则保持不变)。

总的来说,这个函数允许你在OLED屏幕上绘制一个点,通过修改显存数组中的相应位置的值来实现。在实际应用中,还需要一个函数来将显存数组的内容刷新到实际的OLED屏幕上。

获取OLED点的位置

uint8_t OLED_GetPoint(uint8_t X, uint8_t Y)
{
	/*参数检查,保证指定位置不会超出屏幕范围*/
	if (X > 127) {return 0;}
	if (Y > 63) {return 0;}
	
	/*判断指定位置的数据*/
	if (OLED_DisplayBuf[Y / 8][X] & 0x01 << (Y % 8))
	{
		return 1;	//为1,返回1
	}
	
	return 0;		//否则,返回0
}

好了,举一反三,如果检测到我们需要的点已经置一则返回1否则返回零!

OLED由点——>画图

void OLED_ShowImage(uint8_t X, uint8_t Y, uint8_t Width, uint8_t Height, const uint8_t *Image)
{
	uint8_t i, j;
	
	/*参数检查,保证指定图像不会超出屏幕范围*/
	if (X > 127) {return;}
	if (Y > 63) {return;}
	
	/*将图像所在区域清空*/
	OLED_ClearArea(X, Y, Width, Height);
	
	/*遍历指定图像涉及的相关页*/
	/*(Height - 1) / 8 + 1的目的是Height / 8并向上取整*/
	for (j = 0; j < (Height - 1) / 8 + 1; j ++)
	{
		/*遍历指定图像涉及的相关列*/
		for (i = 0; i < Width; i ++)
		{
			/*超出边界,则跳过显示*/
			if (X + i > 127) {break;}
			if (Y / 8 + j > 7) {return;}
			
			/*显示图像在当前页的内容*/
			OLED_DisplayBuf[Y / 8 + j][X + i] |= Image[j * Width + i] << (Y % 8);
			
			/*超出边界,则跳过显示*/
			/*使用continue的目的是,下一页超出边界时,上一页的后续内容还需要继续显示*/
			if (Y / 8 + j + 1 > 7) {continue;}
			
			/*显示图像在下一页的内容*/
			OLED_DisplayBuf[Y / 8 + j + 1][X + i] |= Image[j * Width + i] >> (8 - Y % 8);
		}
	}
}

参数中我们需要知道,const uint8_t *Image是一个指针哦!

这里面所有的if都是用来保证我们的图像不会超出屏幕。

我们来说说,这个操控缓冲序列的函数。

  • 对于当前页,函数将图像数据中对应位置的值(Image[j * Width + i])左移 (Y % 8) 位,然后使用位或赋值运算符 |= 将其与显存中对应位置的值合并。这确保了图像数据的正确位被设置到显存中。
  • 如果图像的一个像素跨越了两个页(即该像素在 OLED 显示屏上的 Y 坐标是 8 的倍数加某个值),则需要将该像素的数据也设置到下一页。这通过右移 (8 - Y % 8) 位并将结果合并到下一页的显存中来实现。但是,注意这个操作是在内部循环之后进行的(使用 continue 跳过),以确保在当前页没有超出屏幕高度时才进行。

 点堆成了图——>变成了有序符号

void OLED_ShowChar(uint8_t X, uint8_t Y, char Char, uint8_t FontSize)
{
	if (FontSize == OLED_8X16)		//字体为宽8像素,高16像素
	{
		/*将ASCII字模库OLED_F8x16的指定数据以8*16的图像格式显示*/
		OLED_ShowImage(X, Y, 8, 16, OLED_F8x16[Char - ' ']);
	}
	else if(FontSize == OLED_6X8)	//字体为宽6像素,高8像素
	{
		/*将ASCII字模库OLED_F6x8的指定数据以6*8的图像格式显示*/
		OLED_ShowImage(X, Y, 6, 8, OLED_F6x8[Char - ' ']);
	}
}

 

  1. 大概讲述

    • Char:要显示的字符,通常是一个 ASCII 字符。
    • FontSize:指定字符的字体大小。从代码中可以看出,支持两种字体大小:OLED_8X16(宽度为 8 像素,高度为 16 像素)和 OLED_6X8(宽度为 6 像素,高度为 8 像素)。函数首先检查 FontSize 参数的值来确定要使用的字体大小。如果 FontSize 等于 OLED_8X16,则函数将从 OLED_F8x16 字模库中选择相应的字符数据,如果 FontSize 等于 OLED_6X8,则函数将从 OLED_F6x8 字模库中选择相应的字符数据。
  2. 字符数据获取

    • 字符数据在字模库中的索引是通过 Char - ' ' 得到的。这是因为字模库通常是从空格字符(ASCII 值 32)开始存储的,所以通过减去空格字符的 ASCII 值,可以得到字符在字模库中的相对位置。(超级重要)让我来引申一下我们的固有字模库!每一位其实都对应一个点。点与点的组合才构成了我的字符。
      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,0x16,0x0E,0x00,0x16,0x0E,0x00,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
      	0x00,0x00,0x00,0x16,0x0E,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,
      	0x00,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,0xC0,0xC0,0x00,0x00,0x00,
      	0x00,0x00,0x80,0xB0,0x70,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,0x20,0x10,0x08,0x04,0x08,0x10,0x20,
      	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,0x04,0x08,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
      	0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x00,
      	0x00,0x20,0x3F,0x21,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,0x80,0x40,0x40,0x80,0x00,0x00,0x80,
      	0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,// ~ 94
      };
      
      /*宽6像素,高8像素*/
      const uint8_t OLED_F6x8[][6] = 
      {
      	0x00,0x00,0x00,0x00,0x00,0x00,//   0
      	0x00,0x00,0x00,0x2F,0x00,0x00,// ! 1
      	0x00,0x00,0x07,0x00,0x07,0x00,// " 2
      	0x00,0x14,0x7F,0x14,0x7F,0x14,// # 3
      	0x00,0x24,0x2A,0x7F,0x2A,0x12,// $ 4
      	0x00,0x23,0x13,0x08,0x64,0x62,// % 5
      	0x00,0x36,0x49,0x55,0x22,0x50,// & 6
      	0x00,0x00,0x00,0x07,0x00,0x00,// ' 7
      	0x00,0x00,0x1C,0x22,0x41,0x00,// ( 8
      	0x00,0x00,0x41,0x22,0x1C,0x00,// ) 9
      	0x00,0x14,0x08,0x3E,0x08,0x14,// * 10
      	0x00,0x08,0x08,0x3E,0x08,0x08,// + 11
      	0x00,0x00,0x00,0xA0,0x60,0x00,// , 12
      	0x00,0x08,0x08,0x08,0x08,0x08,// - 13
      	0x00,0x00,0x60,0x60,0x00,0x00,// . 14
      	0x00,0x20,0x10,0x08,0x04,0x02,// / 15
      	0x00,0x3E,0x51,0x49,0x45,0x3E,// 0 16
      	0x00,0x00,0x42,0x7F,0x40,0x00,// 1 17
      	0x00,0x42,0x61,0x51,0x49,0x46,// 2 18
      	0x00,0x21,0x41,0x45,0x4B,0x31,// 3 19
      	0x00,0x18,0x14,0x12,0x7F,0x10,// 4 20
      	0x00,0x27,0x45,0x45,0x45,0x39,// 5 21
      	0x00,0x3C,0x4A,0x49,0x49,0x30,// 6 22
      	0x00,0x01,0x71,0x09,0x05,0x03,// 7 23
      	0x00,0x36,0x49,0x49,0x49,0x36,// 8 24
      	0x00,0x06,0x49,0x49,0x29,0x1E,// 9 25
      	0x00,0x00,0x36,0x36,0x00,0x00,// : 26
      	0x00,0x00,0x56,0x36,0x00,0x00,// ; 27
      	0x00,0x08,0x14,0x22,0x41,0x00,// < 28
      	0x00,0x14,0x14,0x14,0x14,0x14,// = 29
      	0x00,0x00,0x41,0x22,0x14,0x08,// > 30
      	0x00,0x02,0x01,0x51,0x09,0x06,// ? 31
      	0x00,0x3E,0x49,0x55,0x59,0x2E,// @ 32
      	0x00,0x7C,0x12,0x11,0x12,0x7C,// A 33
      	0x00,0x7F,0x49,0x49,0x49,0x36,// B 34
      	0x00,0x3E,0x41,0x41,0x41,0x22,// C 35
      	0x00,0x7F,0x41,0x41,0x22,0x1C,// D 36
      	0x00,0x7F,0x49,0x49,0x49,0x41,// E 37
      	0x00,0x7F,0x09,0x09,0x09,0x01,// F 38
      	0x00,0x3E,0x41,0x49,0x49,0x7A,// G 39
      	0x00,0x7F,0x08,0x08,0x08,0x7F,// H 40
      	0x00,0x00,0x41,0x7F,0x41,0x00,// I 41
      	0x00,0x20,0x40,0x41,0x3F,0x01,// J 42
      	0x00,0x7F,0x08,0x14,0x22,0x41,// K 43
      	0x00,0x7F,0x40,0x40,0x40,0x40,// L 44
      	0x00,0x7F,0x02,0x0C,0x02,0x7F,// M 45
      	0x00,0x7F,0x04,0x08,0x10,0x7F,// N 46
      	0x00,0x3E,0x41,0x41,0x41,0x3E,// O 47
      	0x00,0x7F,0x09,0x09,0x09,0x06,// P 48
      	0x00,0x3E,0x41,0x51,0x21,0x5E,// Q 49
      	0x00,0x7F,0x09,0x19,0x29,0x46,// R 50
      	0x00,0x46,0x49,0x49,0x49,0x31,// S 51
      	0x00,0x01,0x01,0x7F,0x01,0x01,// T 52
      	0x00,0x3F,0x40,0x40,0x40,0x3F,// U 53
      	0x00,0x1F,0x20,0x40,0x20,0x1F,// V 54
      	0x00,0x3F,0x40,0x38,0x40,0x3F,// W 55
      	0x00,0x63,0x14,0x08,0x14,0x63,// X 56
      	0x00,0x07,0x08,0x70,0x08,0x07,// Y 57
      	0x00,0x61,0x51,0x49,0x45,0x43,// Z 58
      	0x00,0x00,0x7F,0x41,0x41,0x00,// [ 59
      	0x00,0x02,0x04,0x08,0x10,0x20,// \ 60
      	0x00,0x00,0x41,0x41,0x7F,0x00,// ] 61
      	0x00,0x04,0x02,0x01,0x02,0x04,// ^ 62
      	0x00,0x40,0x40,0x40,0x40,0x40,// _ 63
      	0x00,0x00,0x01,0x02,0x04,0x00,// ` 64
      	0x00,0x20,0x54,0x54,0x54,0x78,// a 65
      	0x00,0x7F,0x48,0x44,0x44,0x38,// b 66
      	0x00,0x38,0x44,0x44,0x44,0x20,// c 67
      	0x00,0x38,0x44,0x44,0x48,0x7F,// d 68
      	0x00,0x38,0x54,0x54,0x54,0x18,// e 69
      	0x00,0x08,0x7E,0x09,0x01,0x02,// f 70
      	0x00,0x18,0xA4,0xA4,0xA4,0x7C,// g 71
      	0x00,0x7F,0x08,0x04,0x04,0x78,// h 72
      	0x00,0x00,0x44,0x7D,0x40,0x00,// i 73
      	0x00,0x40,0x80,0x84,0x7D,0x00,// j 74
      	0x00,0x7F,0x10,0x28,0x44,0x00,// k 75
      	0x00,0x00,0x41,0x7F,0x40,0x00,// l 76
      	0x00,0x7C,0x04,0x18,0x04,0x78,// m 77
      	0x00,0x7C,0x08,0x04,0x04,0x78,// n 78
      	0x00,0x38,0x44,0x44,0x44,0x38,// o 79
      	0x00,0xFC,0x24,0x24,0x24,0x18,// p 80
      	0x00,0x18,0x24,0x24,0x18,0xFC,// q 81
      	0x00,0x7C,0x08,0x04,0x04,0x08,// r 82
      	0x00,0x48,0x54,0x54,0x54,0x20,// s 83
      	0x00,0x04,0x3F,0x44,0x40,0x20,// t 84
      	0x00,0x3C,0x40,0x40,0x20,0x7C,// u 85
      	0x00,0x1C,0x20,0x40,0x20,0x1C,// v 86
      	0x00,0x3C,0x40,0x30,0x40,0x3C,// w 87
      	0x00,0x44,0x28,0x10,0x28,0x44,// x 88
      	0x00,0x1C,0xA0,0xA0,0xA0,0x7C,// y 89
      	0x00,0x44,0x64,0x54,0x4C,0x44,// z 90
      	0x00,0x00,0x08,0x7F,0x41,0x00,// { 91
      	0x00,0x00,0x00,0x7F,0x00,0x00,// | 92
      	0x00,0x00,0x41,0x7F,0x08,0x00,// } 93
      	0x00,0x08,0x04,0x08,0x10,0x08,// ~ 94
      };
  3. 显示字符

    • 一旦确定了字符数据和字体大小,函数就调用 OLED_ShowImage 函数来在 OLED 屏幕上显示字符。OLED_ShowImage 函数接受字符的起始坐标、宽度、高度和字符数据作为参数,并将字符绘制到 OLED 屏幕上。
  4. 注意事项

    • 字体库(OLED_F8x16 和 OLED_F6x8)需要预先定义,并且包含所有需要显示的字符的字模数据。这些数据通常以二维数组的形式存储,每个字符占据一个子数组,子数组的大小取决于字体大小(即宽度和高度)。
    • 字体库中的数据通常是按照 ASCII 码的顺序排列的,从空格字符(ASCII 值 32)开始,直到其他字符。因此,通过减去空格字符的 ASCII 值,可以得到字符在字体库中的索引。
  5. 扩展性

    • 函数的设计使得它可以很容易地支持其他字体大小和字体库。只需添加新的字体大小判断和相应的字体库,并在函数中添加相应的处理逻辑即可。

虽然代码量少,但浓缩的都是精华!

字符——>字符串

void OLED_ShowString(uint8_t X, uint8_t Y, char *String, uint8_t FontSize)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i++)		//遍历字符串的每个字符
	{
		/*调用OLED_ShowChar函数,依次显示每个字符*/
		OLED_ShowChar(X + i * FontSize, Y, String[i], FontSize);
	}
}
  • String:指向要显示的字符串的指针。

 函数使用一个 for 循环来遍历字符串中的每个字符。循环的终止条件是遇到字符串的结束符(即空字符 '\0')。在每次循环中,都会处理字符串中的一个字符。

在循环体内,函数调用 OLED_ShowChar 函数来显示当前字符。OLED_ShowChar 函数需要四个参数:字符的起始坐标(X 和 Y),要显示的字符(String[i]),以及字体大小(FontSize)。

但是,请注意在 OLED_ShowString 函数中,X 坐标需要根据已经显示的字符数量进行更新。这是因为每个字符都会占用一定的屏幕空间(具体取决于字体大小),所以下一个字符应该显示在前一个字符之后的位置。因此,这里使用 X + i * FontSize 来计算每个字符的起始 X 坐标。这里假设字体大小(FontSize)是字符宽度的度量,即每个字符的宽度都等于字体大小的值。这可能在某些情况下是合理的,但也可能需要根据具体的字体库进行调整。

不会自动换行,你需要自己换。但是举一反三一下,我相信你会写的!

算了吧,我给你写吧。

#define OLED_SCREEN_WIDTH 128 // 假设 OLED 屏幕宽度为 128 像素  
  
// 假设 OLED_CharWidth 根据字体大小返回字符的宽度(像素)  
uint8_t OLED_CharWidth(uint8_t FontSize) {  
    if (FontSize == OLED_8X16) {  
        return 8; // 假设 8x16 字体每个字符宽度为 8 像素  
    } else if (FontSize == OLED_6X8) {  
        return 6; // 假设 6x8 字体每个字符宽度为 6 像素  
    }  
    // 默认或错误处理  
    return 0;  
}  
  
void OLED_ShowString(uint8_t X, uint8_t Y, char *String, uint8_t FontSize) {  
    uint8_t i = 0;  
    uint8_t charWidth = OLED_CharWidth(FontSize);  
    uint8_t currentX = X; // 当前字符的 X 坐标  
    uint8_t lineHeight = (FontSize == OLED_8X16) ? 16 : 8; // 根据字体大小确定行高  
  
    while (String[i] != '\0') {  
        // 如果当前字符会导致超出屏幕宽度,则换行  
        if ((currentX + charWidth) > OLED_SCREEN_WIDTH) {  
            currentX = X; // 重置 X 坐标到行首  
            Y += lineHeight; // 移动到下一行  
              
            // 检查是否超出了 OLED 屏幕的高度(如果需要的话)  
            if (Y + lineHeight > OLED_SCREEN_HEIGHT) {  
                // 处理超出屏幕高度的情况,例如滚动、截断或返回错误  
                // 这里只是简单地返回,不再显示剩余的字符串  
                return;  
            }  
        }  
  
        // 显示当前字符  
        OLED_ShowChar(currentX, Y, String[i], FontSize);  
  
        // 更新当前字符的 X 坐标  
        currentX += charWidth;  
  
        // 移动到下一个字符  
        i++;  
    }  
}

 显示数字

void OLED_ShowNum(uint8_t X, uint8_t Y, uint32_t Number, uint8_t Length, uint8_t FontSize)
{
	uint8_t i;
	for (i = 0; i < Length; i++)		//遍历数字的每一位							
	{
		/*调用OLED_ShowChar函数,依次显示每个数字*/
		/*Number / OLED_Pow(10, Length - i - 1) % 10 可以十进制提取数字的每一位*/
		/*+ '0' 可将数字转换为字符格式*/
		OLED_ShowChar(X + i * FontSize, Y, Number / OLED_Pow(10, Length - i - 1) % 10 + '0', FontSize);
	}
}
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;	//结果默认为1
	while (Y --)			//累乘Y次
	{
		Result *= X;		//每次把X累乘到结果上
	}
	return Result;
}

 下面超级重要!!!!!!!

 

  1. 提取数字的每一位:

    • Number / OLED_Pow(10, Length - i - 1) % 10 这部分代码用于提取 Number 的每一位数字。 OLED_Pow 函数,它返回 10 的某个整数次幂。例如,当 i = 0 时,OLED_Pow(10, Length - 1) 会返回 10 的 (Length-1) 次幂,用于提取 Number 的最低位。
    • % 10 操作符用于取得除法运算的余数,即当前位的数字。
  2. 将数字转换为字符:

    • 提取出来的数字(0-9)是一个整数,但 OLED_ShowChar 函数需要一个字符作为参数。因此,通过加上字符 '0'(ASCII 码为 48),可以将整数转换为对应的字符。例如,数字 5 会被转换为字符 '5'

会显示无符号整数后,那么你也一定会看显示有符号小数了!

void OLED_ShowFloatNum(uint8_t X, uint8_t Y, double Number, uint8_t IntLength, uint8_t FraLength, uint8_t FontSize)
{
	uint32_t PowNum, IntNum, FraNum;
	
	if (Number >= 0)						//数字大于等于0
	{
		OLED_ShowChar(X, Y, '+', FontSize);	//显示+号
	}
	else									//数字小于0
	{
		OLED_ShowChar(X, Y, '-', FontSize);	//显示-号
		Number = -Number;					//Number取负
	}
	
	/*提取整数部分和小数部分*/
	IntNum = Number;						//直接赋值给整型变量,提取整数
	Number -= IntNum;						//将Number的整数减掉,防止之后将小数乘到整数时因数过大造成错误
	PowNum = OLED_Pow(10, FraLength);		//根据指定小数的位数,确定乘数
	FraNum = round(Number * PowNum);		//将小数乘到整数,同时四舍五入,避免显示误差
	IntNum += FraNum / PowNum;				//若四舍五入造成了进位,则需要再加给整数
	
	/*显示整数部分*/
	OLED_ShowNum(X + FontSize, Y, IntNum, IntLength, FontSize);
	
	/*显示小数点*/
	OLED_ShowChar(X + (IntLength + 1) * FontSize, Y, '.', FontSize);
	
	/*显示小数部分*/
	OLED_ShowNum(X + (IntLength + 2) * FontSize, Y, FraNum, FraLength, FontSize);
}
  1. IntNum = Number;

    • 这行代码将浮点数 Number 直接赋值给整型变量 IntNum。在C语言中,当浮点数赋值给整型变量时,小数部分会被丢弃,只保留整数部分。因此,IntNum 现在包含了 Number 的整数部分。
  2. Number -= IntNum;

    • 这行代码从原始的 Number 中减去其整数部分(即 IntNum 的值)。这样,Number 现在只包含小数部分。这个步骤是为了防止在后续处理小数部分时,由于整数部分的存在而导致计算错误或溢出。
  3. PowNum = OLED_Pow(10, FraLength);

    • 这行代码调用了一个名为 OLED_Pow 的函数(这个函数应该返回10的FraLength次幂)。FraLength 是指定的小数位数。例如,如果 FraLength 是 2,那么 PowNum 将是 100。这个值将用于将小数部分转换为整数,以便进行四舍五入和格式化。
  4. FraNum = round(Number * PowNum);

    • 这行代码首先将 Number(现在只包含小数部分)乘以 PowNum,从而将小数部分转换为整数。然后,使用 round 函数对结果进行四舍五入。四舍五入是一种常用的数值处理方式,用于确保数值在指定的小数位数内具有最佳的精度。FraNum 现在包含了四舍五入后的整数结果。
  5. IntNum += FraNum / PowNum;

    • 这行代码首先通过 FraNum / PowNum 将四舍五入后的整数结果转换回小数形式。然后,将这个小数加到原始的整数部分 IntNum 上。这个步骤是为了处理四舍五入时可能产生的进位。例如,如果原始数字是 3.995 并且 FraLength 是 2,那么四舍五入后的小数部分将是 100(即 1.00 的整数形式)。将这个值除以 100(即 PowNum)得到 1.00,然后加到整数部分 3 上,得到最终的结果 4.00。

好好理解,在所有数字问题中均会出现这几个算法的身影! 

明天我将讲解如何构建中文库。其实更加简单!!!

明天见。

 

 

 

 

  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stm32f103oled是一种基于Cortex-M3内核的微控制器,它配备了一个128x64个像素的OLED显示屏,可以通过标准进行编程。 使用stm32f103oled标准程序,我们可以通过简单的API函数来控制OLED显示屏的各个方面。例如,我们可以使用中的函数来初始化OLED屏幕,设置像素点的颜色和位置,绘制基本的图形和文本,滚动显示内容等。 要开始编写stm32f103oled标准程序,我们首先需要在开发环境中安装相关的文件和工具链。然后,我们可以使用C语言来编写代码,通过调用标准函数来实现所需的功能。 在程序中,我们可以使用函数来设置OLED屏幕的引脚和通信方式。接下来,我们可以初始化OLED屏幕并设置各种参数,如显示亮度和对比度。 然后,我们可以使用函数来绘制图形和文本。例如,我们可以使用函数来绘制线条、矩形、圆形以及各种几何图形。同时,我们还可以使用函数来显示文本,并可以选择文字的字体和大小。 最后,我们可以使用函数来控制OLED屏幕的刷新和滚动。通过调用相应的函数,我们可以更新显示内容,并且可以设置滚动方向和速度。 总的来说,stm32f103oled标准程序可以提供一套简单而强大的API函数,用于控制OLED显示屏。通过编写合适的代码,我们可以实现各种各样的功能,并能够灵活地显示图形和文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值