












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);
}
}


&spm=1001.2101.3001.5002&articleId=146322775&d=1&t=3&u=18d04cc9634746989b69732f94037c12)
920

被折叠的 条评论
为什么被折叠?



