OLED显示器的程序代码,作为保存

我现在也想要自己写点博客,现在是在自己琢磨的阶段,我想问问,有没有什么方法能够让我把OLED 的程序代码拷贝到这个编辑器的上面。
#首先介绍一下OLED显示器
OLED液晶显示器是一款很好用的显示模块,可以通过SPI和X8086方式进行通讯,主要用于微小屏幕的使用,对于屏幕的大小不能要求太大,否者会有很多传输过程中的问题,对于一般嵌入式设备而言,已经够用了。##核心代码程序
#include<oled.h>
#include “font.h”
volatile static u8 OLEDGram[128][8]; // OLED显存

// SSD1306写入一个字节
// dat:需要写入的数据/命令
// cmd:数据/命令标志
void OLED_WR_Byte(u8 dat,u8 cmd)
{
OLED_RS = cmd;
SPI1_ReadWriteByte(dat);
OLED_RS = 1;
}

// 更新显存到LCD
void OLED_RefreshGram(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte(0xb0+i,OLED_CMD); // 设置页地址
OLED_WR_Byte(0x00,OLED_CMD); // 设置显示位置一列低地址
OLED_WR_Byte(0x10,OLED_CMD); // 设置显示位置一列高地址
for(n=0;n<128;n++)
OLED_WR_Byte(OLEDGram[n][i],OLED_DATA);
}
}

// 清屏函数
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
for(n=0;n<128;n++)
OLEDGram[n][i] = 0x00;
OLED_RefreshGram(); // 更新显示
}

// 画点函数
// x:0~127
// y:0~63
// t:1填充 0清空
void OLED_DrawPoint(u8 x, u8 y, u8 t)
{
u8 pos,bx,temp = 0;
if(x>127||y>63) return; // 超出范围
pos = 7-y/8;
bx = y%8;
temp = 1<<(7-bx);
if(t) OLEDGram[x][pos] |= temp;
else OLEDGram[x][pos] &= ~temp;
}

// 读点函数
u8 OLED_ReadPoint(u8 x, u8 y)
{
u8 pos,bx,temp = 0x00;
y = 63 - y;
pos = y/8;
bx = y%8;
temp = 1<<bx;
if(temp&OLEDGram[x][pos]) return 1;
return 0;
}

// x1,y1,x2,y2 填充区域的对角坐标
// x1<=x2 y1<=y2 0<=x1<=127 0<=y1<=63
// dot: 0清空 1填充
void OLED_Fill(u8 x1, u8 y1, u8 x2, u8 y2, u8 dot)
{
u8 x,y;
for(x=x1;x<=x2;x++)
{
for(y=y1;y<=y2;y++)
{
OLED_DrawPoint(x,y,dot);
}
}
}

// 在指定位置显示一个字符
// f_w: 字宽
// f_h: 字高
// mode: 0:反白显示 1:正常显示
void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 f_w, u8 f_h, u8 mode)
{
u8 temp,t,t1;
u8 y0 = y;
u8 csize = (f_h/8+((f_h%8)?1:0))*f_w; // 得到自由分辨率字符所占的字节数
chr = chr - ’ '; // 得到偏移后的值
for(t=0;t<csize;t++)
{
if(f_w6&&f_h8) temp=asc2_0608[chr][t];
else if(f_w6&&f_h12) temp=asc2_0612[chr][t];
else if(f_w12&&f_h24) temp=asc2_1224[chr][t];
else return; // 没有的字库
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)==f_h)
{
y = y0;
x ++;
break;
}
}
}
}

// m^n函数
u32 mypow(u8 m, u8 n)
{
u32 result=1;
while(n–) result*=m;
return result;
}

// 显示两个数字
// x,y: 起点坐标
// len: 数字的位数
// f_w: 字宽
// f_h: 字高
// mode: 模式 0填充 1叠加
// num:数值(0~4294967295)
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 f_w, u8 f_h)
{
u8 t,temp;
u8 enshow = 0;
for(t=0;t<len;t++)
{
temp = (num/mypow(10,len-t-1))%10;
if(enshow0&&t<(len-1))
{
if(temp
0)
{
OLED_ShowChar(x+(f_w)*t,y,’ ',f_w,f_h,1);
continue;
}
else
enshow = 1;
}
OLED_ShowChar(x+(f_w)*t,y,temp+‘0’,f_w,f_h,1);
}
}

// 显示字符串
void OLED_ShowString(u8 x, u8 y, const u8 *p, u8 f_w, u8 f_h)
{
while((*p<=’~’)&&(*p>=’ ')) // 判断是否为非法字符
{
if(x>(128-(f_w))) {x=0;y+=f_h;}
if(y>(64-(f_h))) {y=x=0; OLED_Clear();}
OLED_ShowChar(x,y,*p,f_w,f_h,1);
x+=f_w;
p ++;
}
}

//开启OLED显示
void OLED_DisplayON(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON
OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
}

//关闭OLED显示
void OLED_DisplayOFF(void)
{
OLED_WR_Byte(0x8D,OLED_CMD);
OLED_WR_Byte(0x14,OLED_CMD);
OLED_WR_Byte(0XAE,OLED_CMD); // DISPLAY OFF
}

//显示填充区域
void OLED_Fill_Myself(u16 x1,u16 y1,u16 x2, u16 y2)
{

}

// 液晶IO口初始化
void OLED_Init(void)
{
RCC -> APB2ENR |= 1<<2; // 使能IOPA时钟
GPIOA -> CRL &= 0xF0F0FFFF;
GPIOA -> CRL |= 0x03030000;
GPIOA -> ODR |= 5<<4; // PA4/6上拉
SPI1_Init(); // 初始化SPI
SPI1_SetSpeed(SPI_SPEED_16); // SPI 16分频

  OLED_RS = 1;
  OLED_RST = 0;
  delay_ms(100);
  OLED_RST = 1;

    OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
	OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
	OLED_WR_Byte(0x80,OLED_CMD); //[3:0],分频因子;[7:4],震荡频率
	OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
	OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64) 
	OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
	OLED_WR_Byte(0X00,OLED_CMD); //默认为0

	OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
														
	OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
	OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
	OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
	OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
	OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
	OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
	OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
	OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
		 
	OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
	OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
	OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
	OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
	OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
	OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

	OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
	OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示	    						   
	OLED_WR_Byte(0xAF,OLED_CMD); //开启显示

    OLED_Clear();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值