回复【18楼】正点原子:
---------------------------------
原子哥,我想问一下,你那个oled显示ASCII码字符的例程是怎么实现 OLED_ShowString(0,0, "0.96' OLED TEST");
像这样就能在屏幕上面显示这个字符串的?
我看了你的例程,你是直接用这个
void OLED_ShowString(u8 x,u8 y,const u8 *p)
{
#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58
while(*p!='\0')
{
if(x>MAX_CHAR_POSX){x=0;y+=16;}
if(y>MAX_CHAR_POSY){y=x=0;OLED_Clear();}
OLED_ShowChar(x,y,*p,16,1);
x+=8;
p++;
}
}
来从ShowChar里面抽取对应的点阵字符显示,我知道*p储存的是地址,
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{
u8 temp,t,t1;
u8 y0=y;
chr=chr-' ';//得到偏移后的值
for(t=0;t<size;t++)
{
if(size==12)temp=asc2_1206[chr][t]; //调用1206字体
else temp=asc2_1608[chr][t]; //调用1608字体
for(t1=0;t1<8;t1++)
{
if(temp&0x80)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp><<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}
}
}
根据ShowChar里面调用字库里的点阵进行显示,根据*p所指向的地址,到了temp=asc2_1608[chr][t];这里是不是就直接把*p里的值赋值给chr了?例如*p=8,那么执行后chr是不是=8?根据程序的运行结果,应该是直接等于8吧?
我根据你的程序,我自己也写了一些,我写的程序如下:
//显示一个数字函数
//x:x坐标
//y:有坐标
//num:要显示的数字
//t:是否显示
//dis:正反显示,1为正,0为反
void display_num(u8 x,u8 y,u8 num,u8 t,u8 dis)
{
u8 i,j,temp,xt=x,yt=y;
for(i=0;i<16;i++)
{
if(dis)
{
temp=font[num];
}
else
{
temp=~font[num];
}
for(j=0;j<8;j++)
{
if(temp&0x01)
{
dot(xt,yt+j,t);
}
else
{
dot(xt,yt+j,!t);
}
temp=temp>>1;
}
xt++;
if(xt==x+8)
{
yt+=8;
xt=x;
}
}
}
//显示数字串
void show_nums(u8 x,u8 y,u8 t,u8 dis,const u8 *p)
{
while(*p!='\0')
{
display_num(x,y,*p,dis,t);
x+=8;
p++;
}
}
在主函数里面这样调用:
show_nums(0,0,1,1,"0123456789");
而我的font数组如下:
const unsigned char font[12][16]=
{
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",0*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",1*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",2*/
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",3*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",4*/
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",5*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",6*/
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",7*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",8*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",9*/
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*":",10*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*"-",11*/
};
程序运行结果是:
一串白的,也就是上面10个字符,在oled顶上得到的是x=10*8=80个像素的一条白色的东西,并得不到相应的数字,不知道问题在哪里,还有哦,(*p!='\0'这句是什么意思?
\0代表什么?是不是字符串的末尾? |