OLED的学习
来源:互联网 发布:股票软件mac版 编辑:程序博客网 时间:2024/05/21 18:47
//////////////////////////////////////////////////////////////////////////////////
// GND 电源地
// VCC 接5V或3.3v电源
// D0 P1^0(SCL)
// D1 P1^1(SDA)
// RES 接P12
// DC 接P13(数据/命令引脚)
// CS 接P14(片选)
//********************************************************************/
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 … 127
//[1]0 1 2 3 … 127
//[2]0 1 2 3 … 127
//[3]0 1 2 3 … 127
//[4]0 1 2 3 … 127
//[5]0 1 2 3 … 127
//[6]0 1 2 3 … 127
//[7]0 1 2 3 … 127
OLED.c文件如下
////////////////////////////////////////////////////////////////////////////////// // GND 电源地// VCC 接5V或3.3v电源// D0 P1^0(SCL)// D1 P1^1(SDA)// RES 接P12// DC 接P13(数据/命令引脚)// CS 接P14(片选) //******************************************************************************/#include "oled.h"//#include "stdlib.h"#include "oledfont.h" //#include "delay.h"//OLED的显存//存放格式如下.//[0]0 1 2 3 ... 127 //[1]0 1 2 3 ... 127 //[2]0 1 2 3 ... 127 //[3]0 1 2 3 ... 127 //[4]0 1 2 3 ... 127 //[5]0 1 2 3 ... 127 //[6]0 1 2 3 ... 127 //[7]0 1 2 3 ... 127 void delay_ms(unsigned int ms){ unsigned int a; while(ms) { a=1800; while(a--); ms--; } return;}#if OLED_MODE==1//向SSD1106写入一个字节。//dat:要写入的数据/命令//cmd:数据/命令标志 0表示命令; 1表示数据;void OLED_WR_Byte(u8 dat,u8 cmd){ DATAOUT(dat); if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); OLED_WR_Clr(); OLED_WR_Set(); OLED_CS_Set(); OLED_DC_Set(); } #else//向SSD1306写入一个字节。//dat:要写入的数据/命令//cmd:数据/命令标志 0表示命令; 1表示数据;void OLED_WR_Byte(u8 dat,u8 cmd){ u8 i; if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); for(i=0;i<8;i++) { OLED_SCLK_Clr(); if(dat&0x80) { OLED_SDIN_Set(); } else OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1; } OLED_CS_Set(); OLED_DC_Set(); } #endif//x:0~127//y:0~63void OLED_Set_Pos(unsigned char x, unsigned char y) { OLED_WR_Byte(0xb0+y,OLED_CMD); OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); } //开启OLED显示 void OLED_Display_On(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_Display_Off(void){ OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF} //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址 OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示}//在指定位置显示一个字符,包括部分字符//x:0~127//y:0~63//mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr){ unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值 if(x>Max_Column-1) { x=0; y=y+2; } if(SIZE ==16) { OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } else { OLED_Set_Pos(x,y+1); for(i=0;i<6;i++) OLED_WR_Byte(F6x8[c][i],OLED_DATA); }}//m^n函数u32 OLED_Pow(u8 m,u8 n)//为了ShowNum使用{ u32 result=1; while(n--)result*=m; return result;} //显示2个数字//x,y :起点坐标 x:0~127 y:0~7 //len :数字的位数//size:字体大小//mode:模式 0,填充模式;1,叠加模式//num:数值(0~4294967295); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2){ u8 t,temp; u8 enshow=0; for(t=0;t<len;t++) { temp=(num/OLED_Pow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar(x+(size2/2)*t,y,' '); continue; } else enshow=1; } OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); }} //显示一个字符号串//x:0~127 y:0~7 void OLED_ShowString(u8 x,u8 y,u8 *chr){ unsigned char j=0; while (chr[j]!='\0') { OLED_ShowChar(x,y,chr[j]); x+=8; if(x>120) { x=0; y+=2; } j++; }}//显示汉字//x:0~127 y:0~7 void OLED_ShowChinese(u8 x,u8 y,u8 no){ u8 t,adder=0; OLED_Set_Pos(x,y); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); adder+=1; } OLED_Set_Pos(x,y+1); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); adder+=1; } }/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************///x:0~127 y:0~7 void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]){ unsigned int j=0; unsigned char x,y; if(y1%8==0) y=y1/8; else y=y1/8+1; for(y=y0;y<y1;y++) { OLED_Set_Pos(x0,y); for(x=x0;x<x1;x++) { OLED_WR_Byte(BMP[j++],OLED_DATA); } }} //初始化SSD1306 void OLED_Init(void){ OLED_RST_Set(); delay_ms(100); OLED_RST_Clr(); delay_ms(100); OLED_RST_Set(); /* OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) OLED_WR_Byte(0x00,OLED_CMD);//-not offset OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) OLED_WR_Byte(0x02,OLED_CMD);// OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5) OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel */ OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) OLED_WR_Byte(0x00,OLED_CMD);//-not offset OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) OLED_WR_Byte(0x02,OLED_CMD);// OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5) OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear(); OLED_Set_Pos(0,0); }
oled.h的文件如下
////////////////////////////////////////////////////////////////////////////////// // GND 电源地// VCC 接5V或3.3v电源// D0 P1^0(SCL)// D1 P1^1(SDA)// RES 接P12// DC 接P13// CS 接P14 //注: 只有此函数的 OLED_ShowChar 以及 OLED_ShowString 的x:0~127 y:0~7;//******************************************************************************/#include "REG51.h"#ifndef __OLED_H#define __OLED_H #define u8 unsigned char #define u32 unsigned int #define OLED_CMD 0 //写命令#define OLED_DATA 1 //写数据#define OLED_MODE 0 //对应SSD1106sbit OLED_CS=P1^4; //片选sbit OLED_RST =P1^2;//复位sbit OLED_DC =P1^3;//数据/命令控制sbit OLED_SCL=P1^0;//时钟 D0(SCLK)sbit OLED_SDIN=P1^1;//D1(MOSI) 数据#define OLED_CS_Clr() OLED_CS=0#define OLED_CS_Set() OLED_CS=1#define OLED_RST_Clr() OLED_RST=0#define OLED_RST_Set() OLED_RST=1#define OLED_DC_Clr() OLED_DC=0#define OLED_DC_Set() OLED_DC=1#define OLED_SCLK_Clr() OLED_SCL=0#define OLED_SCLK_Set() OLED_SCL=1#define OLED_SDIN_Clr() OLED_SDIN=0#define OLED_SDIN_Set() OLED_SDIN=1;//OLED模式设置//0:4线串行模式//1:并行8080模式#define SIZE 12 //可以改12或16 12对应字符为F6X8 16对应字符为F8X16#define XLevelL 0x02#define XLevelH 0x10#define Max_Column 128#define Max_Row 64#define Brightness 0xFF #define X_WIDTH 128#define Y_WIDTH 64 //-----------------OLED端口定义---------------- void delay_ms(unsigned int ms);//OLED控制用函数void OLED_WR_Byte(u8 dat,u8 cmd); void OLED_Display_On(void);void OLED_Display_Off(void); void OLED_Init(void);void OLED_Clear(void);void OLED_DrawPoint(u8 x,u8 y,u8 t);void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);void OLED_ShowChar(u8 x,u8 y,u8 chr);//x:0~127 y:0~63void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);void OLED_ShowString(u8 x,u8 y, u8 *p);void OLED_Set_Pos(unsigned char x, unsigned char y);void OLED_ShowChinese(u8 x,u8 y,u8 no);//x:0~127 y:0~63 void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);//x的范围0~127,y为页的范围0~7#endif
阅读全文
0 0
- OLED的学习
- 关于SSD1305这类OLED屏的学习
- zigbee学习之OLED
- STM32学习--OLED
- OLED指令学习笔记
- OLED的驱动程序
- OLED
- OLED
- OLED
- STM32 的OLED的使用
- 基于51的OLED驱动
- LED与OLED的区别:
- STM32学习笔记之OLED屏
- 基于linux的OLED移植过程
- 树莓派3做的OLED小时钟
- ESP8266基于microPython的OLED(SSD1306)驱动程序
- OLED(128*64)SSD1306驱动学习总结
- I2C接口的OLED在树莓派3上的应用
- tar.xz文件如何解压
- java架构Dubbo,redis,netty,activemq,spring,jvm,nginx整合实战
- LaTex排版技巧:[15]公式太长如何换行?
- java爬取页面
- 卡特兰数及其应用场景
- OLED的学习
- 齐次坐标&&四元数:
- java设计模式之 单例 模式
- One-Way Reform(欧拉回路)
- VirtualBox 下CentOS6.5 网络配置
- strstr(), strcasestr()
- koa2 中间件里面的next到底是什么
- 进程线程互斥锁实验总结
- HDU6073Matching In Multiplication