从0开始点亮OLED屏幕(三)OLED画点,显示字符、字符串

1.OLED画点&清除一个点

//画点 x:0~127 y:0~63
void OLED_DrawPoint(u8 x,u8 y)
{
	u8 i,m,n;
	i=y/8;//算出为第几页
	m=y%8;//算出点亮第几个像素点
	n=1<<m;//将此像素点转换为8位的数据
	OLED_GRAM[x][i]|=n;//将此像素点加上原来的数据
}

//清除一个点 x:0~127  y:0~63
void OLED_ClearPoint(u8 x,u8 y)
{
	u8 i,m,n;
	i=y/8;//算出为第几页
	m=y%8;//算出点亮第几个像素点
	n=1<<m;//将此像素点转换为8位的数据
	OLED_GRAM[x][i]&=~n;
}

2.OLED显示8*6字符:

void OLED_Char(u8 x,u8 y,u8 chr)
{
	u8 i,m,temp,chr1;
	u8 y0=y;//保存起始地址
	chr1=chr-' ';  //计算偏移后的值
	for(i=0;i<6;i++)
	{
		temp=asc2_0806[chr1][i];
		for(m=0;m<8;m++)
		{
			if(temp&0x01)
				OLED_DrawPoint(x,y);
			temp>>=1;
			y++;
		}
		x++;
		y=y0;		
	}
}

为什么要减去空格或32? 因为字库中0号位置为空格,而空格的ascll为32,需要减去才能得到正确的字符。字库采用的是二维数组第一个中括号相当于找出你存放的那个字符的位置,第二个括号是你那一排位置里面的每个数据。假如要显示字符A,ascll值为65,减去空格32为33;在字库表的33为可以看见就是存放的A,这一排位置有6个数据,所以用for循环去运行6次!而一个数据有8个点,我们可以利用画点函数去显示出来,即画一个点,y坐标加1,画完一个数据后便让x加1画后续一列的8个像素点,此时应该将y的值从新回到一开始的y值,也就是把y0赋过来。这样就能显示字符了。

          

       至于为什么先取出低位,我想这图应该可以表达得很明白了(有点小丑,凑合着用) 

         

 这个图是取模顺序设置。

3.OLED显示任意字符:

 前面讲了8*6的字符,那么如何显示其他大小的字符呢?其实只用加上一些代码就够了。size1/8得此字符所占页数,(size1/2)得字符在x的位数,页数乘x方向位数即得出需要写的次数size2。当然size1/8会省略余数,所以有余数得加上1,就是虽然没占一页,但是还是得让出一页数据来显示他,就好比出去玩,得安排坐得下的车,没坐满也没关系,不可能丢下不管是吧?再排除掉特殊情况为8的时候,这样就得出:

if(size1==8)size2=6;
	else size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占的字节数

if((size1!=8)&&((x-x0)==size1/2))   {x=x0;y0=y0+8;}这条语句是判断是否写完一页了,举个6*12的例子:size1=12,字宽为6,也就是当x增量为6,此时数据应该去下一页,也就是y得加上8;此时x得回到初始坐标值;

其余字体也是类似原理。 自此,显示任意字符函数也完成了。

//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1)
{
	u8 i,m,temp,size2,chr1;
	u8 x0=x,y0=y;
	if(size1==8)size2=6;
	else size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占的字节数
	chr1=chr-' ';  //计算偏移后的值
	for(i=0;i<size2;i++)
	{
		if(size1==8)
		{temp=asc2_0806[chr1][i];} //调用0806字体
		else if(size1==12)
        {temp=asc2_1206[chr1][i];} //调用1206字体
		else if(size1==16)
        {temp=asc2_1608[chr1][i];} //调用1608字体
		else if(size1==24)
        {temp=asc2_2412[chr1][i];} //调用2412字体
		else return;
		for(m=0;m<8;m++)
		{
			if(temp&0x01)
				OLED_DrawPoint(x,y);
			temp>>=1;
			y++;
		}
		x++;
		if((size1!=8)&&((x-x0)==size1/2))
		{x=x0;y0=y0+8;}
		y=y0;		
	}
}
}

4.OLED显示字符串:

前面已经会了显示字符的函数,显示字符串就很简单了,无异于就是多调用几次显示字符的函数然后x值坐标加上对应字符大小的宽度就可以完成了,代码如下:

//显示字符串
//x,y:起点坐标  
//size1:字体大小 
//*chr:字符串起始地址 
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1)
{
	while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
	{
		OLED_ShowChar(x,y,*chr,size1);
		if(size1==8)x+=6;
		else x+=size1/2;
		chr++;
  }
}

可以发现第三个形参定义的是一个指针,指向要显示的字符串地址,到时显示完一个字符,地址自增,显示下一个字符,在此之前先判断一下是不是合法的字符(是不是可打印显示字符),最小为空格32、最大为'~':126。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值