本文章将BS1接VCC,BS2接GND,即用IIC通信方式来驱动显示OLED液晶屏。在上文中我们将IIC部分重点的函数已经进行解释,现在主要讲解OLED的驱动方式,6乘8点阵、8乘16点阵这两组字模如何运用,如何向OLED写入字符、数字、字符串并显示,如何设置初始的显示坐标等。
/* 坐标设置,定义OLED的页地址
00—0F是列地址的低四位,10—1F是高四位。
x&0xf0,保留列的高四位,>>4,将高四位的地址移到低四位,|0x10,表示的是列的高四位地址。
x&0x0f,表示的是列的低四位地址。*/
/* 通过下面这个函数我们可以设置OLED的页数和列数*/
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD); //输入命令,设置第几页,若y = 2,则0xb0+2 = 176+2 = 178 = 0xb2,即选择的是第三页
/*列的高四位和低四位可以相加,所得到的数就是选择的列数*/
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); // 例如 x = 2,0000 0010 & 1111 0000 = 0000 0000 | 0001 0000 = 0001 0000 = 0x10;
OLED_WR_Byte((x&0x0f),OLED_CMD); // 0000 0010 & 0000 1111 = 0000 0010 = 0x02;
// 将列的高四位和低四位相加,即可得到所画的列数,高四位中的第五位为1,不理,
// 所以当x = 2 , y = 2时, 0x00 + 0x02 = 0x02 = 0000 0010,即选中的为第三列
/*综上所述,输入的参数,设置的是对应的是(y)页数和(x)列数*/
}
/* 在指定位置显示一个字符,包括部分字符
x:0~127
y:0~63
size:选择字体 16/12*/
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{
unsigned char c=0,i=0;
c=chr-' ';//得到偏移后的值 可从字模中得到,第一个为' ',减去即可得到相应的字符
if(x>Max_Column-1){x=0;y=y+2;} //Max_Column:最大列:128; x:设置列数; y:设置页数
if(Char_Size ==16) //此时需要两页的同一列,8*16的点阵
{
OLED_Set_Pos(x,y); //若 x = y = 2,则设置的为第3页的第3列, 注意:每一页只有八行
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); //通过i的递增,循环画点,此时将第2页第2列的8行都写入了数据
OLED_Set_Pos(x,y+1); //由于画点的数目行数不够,此时需要第3页的第2列来续画点
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); //接着画完,直到第16个点结束
}
else
{
OLED_Set_Pos(x,y); //6*8的点阵,不需要其他的页来续画
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA); //二维数组,c控制第几行,i控制第几列,故不需要其他的操作即可画完
}
}
/* 显示2个数字
x,y :起点坐标
len :数字的位数
size:字体大小
num:数值(0~4294967295)*/
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{
unsigned char j=0;
while (chr[j]!='\0') //判断字符串是否结束
{
OLED_ShowChar(x,y,chr[j],Char_Size); // 一个一个画字符
x+=8; //x 设置的是列,一个字符的大小为8*16,即行16列8,每次显示为一个后,都需要向高列移8列
if(x>120){x=0;y+=2;} // 最高为128列,超过的话则需要重新从零列开始,由于此时需要别的页数来续画,避免重叠,需要 y += 2。
j++; //循环画字符串
}
}