> 技术文档 > OLED基本操作(根据江科大的OLED视频)_oled怎么显示中文

OLED基本操作(根据江科大的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:2void 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; elsey = y1/8 + 1; //上面代码根据结束点的纵坐标 y1 计算了需要循环的次数 yfor(y=y0;y<y1;y++){OLED_SetCursor(y,x0); for(x=x0;x127||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和Δxint8_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(;y1y2){for(;y2<=y1;y2++){OLED_DrawPoint(x1,y2,light);}}}else if(DeltaY == 0)//斜率k为0时的画法{for(;x1-1&k<1)){for(;x1=1)|(k<=-1)){if(y1<=y2){for(;y1y2){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;xa){OLED_DrawPoint(x+a,y-b,1);//0~1OLED_DrawPoint(x-a,y-b,1);//0~7OLED_DrawPoint(x-a,y+b,1);//4~5OLED_DrawPoint(x+a,y+b,1);//4~3OLED_DrawPoint(x+b,y+a,1);//2~3OLED_DrawPoint(x+b,y-a,1);//2~1OLED_DrawPoint(x-b,y-a,1);//6~7OLED_DrawPoint(x-b,y+a,1);//6~5a++;num=(a*a+b*b)-r*r;//计算画的点离圆心的距离if(num>0){b--;a--;}//OLED_DrawLine(x,y,x+a,y-b,0);}}