庆科扩展板上面有一个非常好用的显示器件——黄青双色OLED屏,与淘宝上售卖的双色OLED屏完全相同,程序兼容,第一行是黄色,后面三行是青色。本次试用帖就以OLED屏出发,通过模拟I2C总线驱动I2C器件。
OLED的硬件地址是0x78(八位地址),写入的数据由两个寄存器负责:0x40号寄存器负责接收八位指令,如收到0xae——关闭OLED面板,收到0xaf——开启OLED显示等等;0x00号寄存器负责接收八位数据。OLED的画点是按照这个顺序进行的:确定初始化坐标位置——竖向画点,0x00号寄存器每收到一个数据就往右移一竖排,一竖排八个点,从低位置开始到高位置结束。了解了这几点之后,可以先进行简单的刷屏指令:
void OLED_Fill()
{
int i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte(0xb0+i,0);
OLED_WR_Byte(0x00,0);
OLED_WR_Byte(0x10,0);
for(n=0;n<128;n++)OLED_WR_Byte(0xff,1);
}
}
8次大循环标示OLED的8行,三条命令标示每行的起始位置,128次小循环则是纵向的128竖排。刷屏搞定了,那就可以进行ASCII码字符串的显示了,我们先来排一下从0x20-0x94的ASCII码:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~
将这行乱糟糟的东西复制进取模软件中:
排列出来的字模就是按照ASCII码排序的:
结合刷屏原理,写出ASCII显示函数:
void OLED_ShowASCII(int x,int y,char n)
{
int i=0,m;
n-=0x20;
m=n*16;
OLED_Set_Pos(x,y);
for(i=m;i
{
OLED_WR_Byte(ASCIIChar,1);
}
OLED_Set_Pos(x,y+1);
for(i=m+8;i
{
OLED_WR_Byte(ASCIIChar,1);
}
}
void OLED_ShowString(int x,int y,char s)
{
int i;
for(i=0;s!='\0';i++)
OLED_ShowASCII(x+i*8,y,s);
}
这就可以完成初步的ASCII码显示了。
汉字显示同理,大家自己摸索。
庆科扩展板上面有一个非常好用的显示器件——黄青双色OLED屏,与淘宝上售卖的双色OLED屏完全相同,程序兼容,第一行是黄色,后面三行是青色。本次试用帖就以OLED屏出发,通过模拟I2C总线驱动I2C器件。
OLED的硬件地址是0x78(八位地址),写入的数据由两个寄存器负责:0x40号寄存器负责接收八位指令,如收到0xae——关闭OLED面板,收到0xaf——开启OLED显示等等;0x00号寄存器负责接收八位数据。OLED的画点是按照这个顺序进行的:确定初始化坐标位置——竖向画点,0x00号寄存器每收到一个数据就往右移一竖排,一竖排八个点,从低位置开始到高位置结束。了解了这几点之后,可以先进行简单的刷屏指令:
void OLED_Fill()
{
int i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte(0xb0+i,0);
OLED_WR_Byte(0x00,0);
OLED_WR_Byte(0x10,0);
for(n=0;n<128;n++)OLED_WR_Byte(0xff,1);
}
}
8次大循环标示OLED的8行,三条命令标示每行的起始位置,128次小循环则是纵向的128竖排。刷屏搞定了,那就可以进行ASCII码字符串的显示了,我们先来排一下从0x20-0x94的ASCII码:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~
将这行乱糟糟的东西复制进取模软件中:
排列出来的字模就是按照ASCII码排序的:
结合刷屏原理,写出ASCII显示函数:
void OLED_ShowASCII(int x,int y,char n)
{
int i=0,m;
n-=0x20;
m=n*16;
OLED_Set_Pos(x,y);
for(i=m;i
{
OLED_WR_Byte(ASCIIChar,1);
}
OLED_Set_Pos(x,y+1);
for(i=m+8;i
{
OLED_WR_Byte(ASCIIChar,1);
}
}
void OLED_ShowString(int x,int y,char s)
{
int i;
for(i=0;s!='\0';i++)
OLED_ShowASCII(x+i*8,y,s);
}
这就可以完成初步的ASCII码显示了。
汉字显示同理,大家自己摸索。