OLED基本操作(根据江科大的OLED视频)

OLED显示中文

要在OLED上显示中文汉字,你需要确保OLED屏幕支持中文字符显示,并且使用相应的库来实现中文字符的显示功能。一般来说,你需要按照以下步骤操作:

1.选择支持中文字符显示的OLED屏幕:确保你使用的OLED屏幕支持中文字符显示,并且具有足够的分辨率来显示清晰的汉字。

2.导入相应的字库:你需要将中文字符的字库导入到你的项目中。这些字库通常是一些特定格式的文件,包含了每个汉字的点阵信息。

3.使用相应的库函数:根据你使用的OLED屏幕和字库格式,调用相应的库函数来在屏幕上显示中文汉字。这可能涉及到将汉字的点阵数据发送到OLED屏幕的指定位置。

4.编写显示代码:编写代码来调用相应的库函数,在OLED屏幕上显示你想要的中文汉字。

/**
  * @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位
}

oid OLED_WriteData(uint8_t Data)
{
	OLED_I2C_Start();
	OLED_I2C_SendByte(0x78);		//从机地址
	OLED_I2C_SendByte(0x40);		//写数据
	OLED_I2C_SendByte(Data);
	OLED_I2C_Stop();
}
const uint8_t F16x16[]=
	
{0x10,0x10,0x10,0xFF,0x90,0x20,0x98,0x88,0x88,0xE9,0x8E,0x88,0x88,0xA8,0x98,0x00,
0x02,0x42,0x81,0x7F,0x00,0x00,0x80,0x84,0x4B,0x28,0x10,0x28,0x47,0x80,0x00,0x00,/*"按",0*/

0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x42,0x82,0x02,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,/*"下",1*/

0x10,0x10,0x10,0xFF,0x90,0x20,0x98,0x88,0x88,0xE9,0x8E,0x88,0x88,0xA8,0x98,0x00,
0x02,0x42,0x81,0x7F,0x00,0x00,0x80,0x84,0x4B,0x28,0x10,0x28,0x47,0x80,0x00,0x00,/*"按",2*/

0x40,0x30,0xEF,0x24,0x24,0x80,0xE4,0x9C,0x10,0x54,0x54,0xFF,0x54,0x7C,0x10,0x00,
0x01,0x01,0x7F,0x21,0x51,0x26,0x18,0x27,0x44,0x45,0x45,0x5F,0x45,0x45,0x44,0x00,/*"键",3*/

0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,/*"开",4*/

0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x40,0xE0,0x58,0x47,0x40,0x50,0x60,0xC0,0x00,
0x40,0x22,0x15,0x08,0x16,0x21,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,/*"始",5*/

0x10,0x60,0x02,0x8C,0x00,0x08,0xF9,0x4E,0xC8,0x20,0x58,0x4F,0x48,0xC8,0x08,0x00,
0x04,0x04,0x7E,0x81,0x40,0x30,0x0F,0x40,0x7F,0x00,0x44,0x84,0x7F,0x04,0x04,0x00,/*"游",6*/

0x00,0x08,0x48,0x88,0x08,0xC8,0x38,0x40,0x40,0x40,0xFF,0x20,0x22,0xAC,0x20,0x00,
0x00,0x20,0x10,0x0C,0x03,0x04,0x18,0x80,0x40,0x20,0x17,0x18,0x26,0x41,0xF0,0x00};/*"戏",7*/
// Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); N:汉字在.h中的索引
// Description    : 显示ASCII_8x16.h中的汉字,16*16点阵
void OLED_ShowCN(uint8_t y, uint8_t x, uint8_t N)
{
    uint8_t wm=0;	//用于循环计数
    uint16_t  adder=32*N;	//计算了汉字在点阵数组中的起始地址。点阵数组 F16x16 中每个汉字占用32个字节,因此乘以32即为汉字在数组中的起始地址
    OLED_SetCursor(y , x);	// 设置光标位置,以便开始在屏幕上显示汉字。参数 (y, x) 表示起始点的坐标

    //汉字的点阵数据是按照16行16列的格式排列的,因此需要逐行显示
    //第一次循环显示汉字的上半部分(16行),第二次循环显示汉字的下半部分(再16行)
    //这样分两次循环显示,可以确保在屏幕上正确显示整个汉字的16×16点阵数据	
    for(wm = 0;wm < 16;wm++)	
    {
        OLED_WriteData(F16x16[adder]);	//OLED_WriteData(F16x16[adder]) 将数组 F16x16 中指定索引处的数据写入 OLED 显示屏。这样的操作可能是用于显示特定的字体或图像
        adder += 1;	//adder 是一个用于指示汉字在点阵数组中起始地址的变量,每次循环结束后,通过自增操作将其递增,以便按行读取汉字的点阵数据
    }
    OLED_SetCursor(y+1,x);	//y+1 表示将光标向下移动一行,x 保持不变,以便开始显示下半部分的汉字点阵数据
    for(wm = 0;wm < 16;wm++)
    {
        OLED_WriteData(F16x16[adder]);
        adder += 1;
    }
}
// 这是自己写的显示中文字符串的函数,要先把中文字符串“共阴——列行式——逆向输出”取字模后存入asc.h相应的位置(连续存入)
//传入参数分别为:x:起始横坐标  
//								y:纵坐标(填入0-7)  
//								begin:填入的中文字符串的第一个字在我们asc.c字库里面的序号  
//                num:我们要填写几个字
//                比如要填“测试”,取完字模存入后这两个字在字库中序号为0,1,横坐标0,纵坐标第二行,就填:x:0,y:2,begin:0,num:2
void OLED_ShowCN_STR(uint8_t y , uint8_t x , uint8_t begin , uint8_t num)
{
	uint8_t i;
	for(i=0;i<num;i++){OLED_ShowCN(y,i*16+x,i+begin);}    //OLED显示标题
}
//这个函数用于显示中文字符串。它接受四个参数:起始横坐标 x、纵坐标 y、
//中文字符串的第一个字在字库中的序号 begin、要显示的字数 num。
//函数内部通过循环调用 OLED_ShowCN 函数来显示每个中文字符。

OLED显示位图

// Parameters     : x0,y0 -- 起始点坐标(x0:0~127, y0:0~7); x1,y1 -- 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
// Description    : 显示BMP位图(图像表示方法,它将图像分解为一组像素阵列,每个像素都由一系列位(或像素)来表示)
void OLED_DrawBMP(uint8_t y0,uint8_t x0,uint8_t y1,uint8_t x1,uint8_t N)
{
	uint16_t j=0;
	uint8_t x,y;
 
  if(y1%8==0)
		y = y1/8;
  else
		y = y1/8 + 1;
  //上面代码根据结束点的纵坐标 y1 计算了需要循环的次数 y
	for(y=y0;y<y1;y++)
	{
		OLED_SetCursor(y,x0);
    for(x=x0;x<x1;x++)
		{
			OLED_WriteData(BMP[N][j++]);  //函数 OLED_WriteData 将位图数据从数组 BMP[N] 中读取并写入 OLED 显示屏
		//变量 j 用于在位图数组中指示当前要读取的数据。每次内部循环结束后,j 自增,以便在数组中读取下一个数据
		}
	}
	//上面代码使用嵌套的循环来逐行逐列地在 OLED 显示屏上显示位图数据。外部循环按行进行迭代,内部循环按列进行迭代
}

//用于在指定坐标 (x, y) 处显示点,参数 t 用于指定点的颜色或状态
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t)
{
	uint8_t pos,bx,temp=0;
	if(x>127||y>63)return;//超出范围了.
	pos=7-(63-y)/8;
	bx=(63-y)%8;
	temp|=1<<(7-bx);
//	if(t){OLED_SetCursor(pos,x);OLED_WriteData(temp);}
//	else{OLED_SetCursor(pos,x);OLED_WriteData(~temp);}
	if(t)OLED_GRAM[x][pos]|=temp;
	else OLED_GRAM[x][pos]&=~temp;
	OLED_SetCursor(pos,x);OLED_WriteData(OLED_GRAM[x][pos]);
}
//上面这个函数,
//它根据传入的坐标 (x, y)计算出在 OLED_GRAM 数组中的位置 pos,然后计算出在字节中的偏移量 bx。
//接着,根据状态 t 来确定点的颜色,并将其写入 OLED_GRAM 数组中对应的位置。
//最后,使用 OLED_SetCursor 和 OLED_WriteData 函数将更新后的数据写入 OLED 显示屏

在OLED上划线

/*========================================================
*功能描述:	在0.96Oled中画线
*参数说明:	x1 -> 绝对x1坐标		y1 -> 绝对y1坐标
*			x2 -> 绝对x1坐标		y2 -> 绝对y1坐标
*			light -> 画线/清除线
*附加说明:	无
*========================================================*/
void OLED_DrawLine(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t light)
{
	uint8_t i = 0;
	//先计算增量Δy和Δx
	int8_t DeltaY = 0,DeltaX = 0;
	float k = 0,b = 0;									//考虑到斜率有小数的情况,所以b也写成浮点型
	if(x1>x2)														//保持Δx为正,方便后面使用
	{
		i = x2;x2 = x1;x1 = i;
		i = y2;y2 = y1;y1 = i;
		i = 0;
	}
	DeltaY = y2 - y1;
	DeltaX = x2 - x1;
	//上面定义了一些局部变量并计算了两点之间的横纵坐标增量
	if(DeltaX == 0)											//斜率k不存在时的画法
	{
		if(y1<=y2)
			{
				for(;y1<=y2;y1++)
				{
					OLED_DrawPoint(x1,y1,light);
				}
			}else if(y1>y2)
			{
				for(;y2<=y1;y2++)
				{
					OLED_DrawPoint(x1,y2,light);
				}
			}
	}else if(DeltaY == 0)								//斜率k为0时的画法
	{
		for(;x1<=x2;x1++)
		{
			OLED_DrawPoint(x1,y1,light);
		}	
	}else																//斜率正常存在时的画法
	{
		k = ((float)DeltaY)/((float)DeltaX);		//计算斜率
		b = y2 - k * x2;							//计算截距
		//下面的代码
		//根据斜率的不同情况,分别进行了处理:
		//当斜率在 -1 到 1 之间时,沿 x 方向逐点画线;
		//当斜率大于等于 1 或小于等于 -1 时,沿 y 方向逐点画线
		if((k>-1&k<1))
		{
			for(;x1<=x2;x1++)
			{
				OLED_DrawPoint(x1,(int)(k * x1 + b),light);
			}
		}
		else if((k>=1)|(k<=-1))
		{
			if(y1<=y2)
			{
				for(;y1<=y2;y1++)
				{
					OLED_DrawPoint((int)((y1 - b) / k),y1,light);
				}
			}else if(y1>y2)
			{
				for(;y2<=y1;y2++)
				{
					OLED_DrawPoint((int)((y2 - b) / k),y2,light);
				}
			}
		}
	}
}

在OLED上画圆

//这个函数使用了中点画圆算法来画圆
//这个算法的思路是以圆的中心为原点,从圆的右上角(第一象限)开始逐渐扩展画圆
//在代码中,x 和 y 是圆的中心坐标,r 是圆的半径。
//函数通过循环来画出圆周上的像素点,以呈现出一个完整的圆形。
//在循环中,使用 OLED_DrawPoint 函数来绘制每个像素点。
//在画圆的过程中,会同时画出圆的对称点,以确保圆的形状完整
void OLED_DrawCircle(uint8_t x,uint8_t y,uint8_t r) //圆心(x0,y0),半径r
{
//	uint8_t x,y;
//	for (x=x0-r;x<=x0+r;x++)
//	{
//		y=y0+sqrt(OLED_Pow(r,2)-OLED_Pow(x-x0,2));
//	
//		OLED_DrawPoint(x,y,1);
//		OLED_DrawLine(x0,y0,x,y);
//		OLED_DrawPoint(x,63-y,1);
//	}
	int8_t a,b,num;
	a=0;
	b=r;
	while(2*b>a)
	{
		OLED_DrawPoint(x+a,y-b,1);//0~1
		OLED_DrawPoint(x-a,y-b,1);//0~7
		OLED_DrawPoint(x-a,y+b,1);//4~5
		OLED_DrawPoint(x+a,y+b,1);//4~3
		OLED_DrawPoint(x+b,y+a,1);//2~3
		OLED_DrawPoint(x+b,y-a,1);//2~1
		OLED_DrawPoint(x-b,y-a,1);//6~7
		OLED_DrawPoint(x-b,y+a,1);//6~5
		a++;
		num=(a*a+b*b)-r*r;//计算画的点离圆心的距离
		if(num>0)
		{
			b--;
			a--;
		}
//		OLED_DrawLine(x,y,x+a,y-b,0);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值