OLED旋转显示方向,SH1107 软件实现屏幕内容旋转90度显示

因为屏幕驱动芯片自带的只能设置180度,并不带有90度旋转功能,所以自己写了一份简陋程序。

这里只以6*8和8*16的字体为例,其他大小或者中文可以自行修改。

我直接给出原版和修改后的代码

显示字符的原版程序:

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;}
		if(Char_Size ==16)
			{
			OLED_Set_Pos(x,y);	
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16s[c*16+i],OLED_DATA);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
			OLED_WR_Byte(F8X16s[c*16+i+8],OLED_DATA);
			}
			else {	
				OLED_Set_Pos(x,y);
				for(i=0;i<6;i++)
				OLED_WR_Byte(F6x8s[c][i],OLED_DATA);
				
			}
}

旋转90度的程序,这里6*8和8*16都可以,只是8*16多了一格

void OLED_ShowChar_0(u8 x,u8 y,u8 chr,u8 Char_Size){
		unsigned char c=0,i=0,disp_dat[16]={0};	
		c=chr-' ';//得到偏移后的值			
		if(x>Max_Column-1){x=0;y=y+2;}
		if(Char_Size ==16)
			{
			OLED_Set_Pos(x,y);	
			for(uint8_t id1=0;id1<8;id1++){//8x16
				for(uint8_t id2=0;id2<16;id2++){
				disp_dat[15-id2]|=((F8X16s[(c)*16+id1 + (id2>7 ? 8:0)]&(1<<(id2 - (id2>7 ? 8:0))))>>(id2- (id2>7 ? 8:0)))<<id1;
		}
	}
	
	for(i=0;i<16;i++)
		OLED_WR_Byte(disp_dat[i],OLED_DATA);
			}
			else {	
				OLED_Set_Pos(x,y);
				for(uint8_t id1=0;id1<6;id1++){//6x8/8x8
					for(uint8_t id2=0;id2<8;id2++){
						disp_dat[7-id2]|=((F6x8s[c][id1]&(1<<id2))>>id2)<<id1;
					}
				}
				for(i=0;i<8;i++)
				OLED_WR_Byte(disp_dat[i],OLED_DATA);
				
			}
}

如果显示字符串只需要吧原来的字符显示替换掉就可以了

效果如下

这里再给出测试用的C语言程序

#include "stdio.h"
#define u8 unsigned char
#include "math.h"
#define turn_deg 0
#define val 3.1415926/180
#define deg (turn_deg*val)
unsigned char src1[]={0,0xff,0x11,0x11,0x11,0x11,0x01,0},dis[8]={0};
u8 line_8_src[]={},src[]={0,0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,0},src3[]={0,0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,0},src4[]={0,0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,0};

int main(){
	printf("hello world \n");
	for(int i1=0;i1<8;i1++){
		for(int i2=0;i2<8;i2++){
			printf("%c ",(src[i2]&(1<<i1))>0 ? '*':'.');
		}
		printf("\n");
	}
	printf("\n");
	
	for(int id1=0;id1<8;id1++){
		dis[0]|=((src[id1]&(1<<7))>>7)<<id1;
		dis[1]|=((src[id1]&(1<<6))>>6)<<id1;
		dis[2]|=((src[id1]&(1<<5))>>5)<<id1;
		dis[3]|=((src[id1]&(1<<4))>>4)<<id1;
		dis[4]|=((src[id1]&(1<<3))>>3)<<id1;
		dis[5]|=((src[id1]&(1<<2))>>2)<<id1;
		dis[6]|=((src[id1]&(1<<1))>>1)<<id1;
		dis[7]|=((src[id1]&(1<<0))>>0)<<id1;
	}
	
	for(int i1=0;i1<8;i1++){
		for(int i2=0;i2<8;i2++){
			printf("%c ",(dis[i2]&(1<<i1))>0 ? '*':'.');
		}
		printf("\n");
	}
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山间朝暮-CanEve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值