做oa好 还是做网站好,广州谷歌seo,哎吆嗨网站建设,网站建设的技术支持论文STM 32 OLED 显示原理的讲解以及OLED显示汉字与图片的代码 本文主要涉及OLED显示原理的讲解以及OLED显示汉字与图片的代码。 文章目录 STM 32 OLED 显示原理的讲解以及OLED显示汉字与图片的代码一、 OLED简介1.1 OLED 的特点1.2 OLED 8080并行接口信号线说明1.3 OLED控制器SSD1…STM 32 OLED 显示原理的讲解以及OLED显示汉字与图片的代码 本文主要涉及OLED显示原理的讲解以及OLED显示汉字与图片的代码。 文章目录 STM 32 OLED 显示原理的讲解以及OLED显示汉字与图片的代码一、 OLED简介1.1 OLED 的特点1.2 OLED 8080并行接口信号线说明1.3 OLED控制器SSD13061.4 程序显存原理1.5 OLED 初始化过程 二、OLED 初始化代码2.1 显示汉字与ASCII2.2 显示一个图片   一、 OLED简介 OLED即有机发光二极管(Organic Light-Emitting Diode)又称为有机电激光显示(Organic Electroluminesence DisplayOELD) 。 OLED由于同时具备自发光不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性被认为是下一代的平面显示器新兴应用技术。OLED显示技术具有自发光的特性采用非常薄的有机材料涂层和玻璃基板当有电流通过时这些有机材料就会发光而且OLED显示屏幕可视角度大并且能够节省电能从2003年开始这种显示设备在MP3播放器上得到了应用。 LCD都需要背光而OLED不需要因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术 OLED的尺寸还难以大型化但是分辨率确可以做到很高。 1.1 OLED 的特点 1、0.96 寸OLED 有黄蓝白蓝三种颜色可选其中黄蓝是屏上1/4部分为黄光下3/4 为蓝而且是固定区域显示固定颜色颜色和显示区域均不能修改白光则为纯白也就是黑底白字蓝色则为纯蓝也就是黑底蓝字。  2、分辨率为128*64。  3、多种接口方式OLED 裸屏总共种接口包括6800、8080 两种并行接口方式、4线串行SPI 接口方式、IIC 接口方式只需要2根线就可以控制 OLED 了这五种接口是通过屏上的BS0~BS2 来配置的。  
1.2 OLED 8080并行接口信号线说明 
CSOLED片选信号。WR向OLED写入数据。RD从OLED读取数据。D[7:0]8位双向数据线。RST(RES):硬复位 OLED。 DC 命令/数据标志0读写命令;1,读写数据  
模块的8080并口读/写的过程为: 先根据要写入/读取的数据的类型设置DC为高(数据)/低(命令)然后拉低片选选中SSD1306接着我们根据是读数据还是要写数据置RD/WR为低然后: 1、读数据在RD的上升沿使数据锁存到数据线D[7:0]上; 2、写数据在WR的上升沿使数据写入到SSD1306里面 
并口写时序图  
并口读时序图  
1.3 OLED控制器SSD1306 
OLED 模块显存 SSD1306的显存总共为 12864bit 大小SSD1306将这些显存分为8页 。每页包含了128个字节总共8页这样刚好是12804的点阵大小。  
1.4 程序显存原理 
在STM32的内部建立一个 缓存 (共128*8个字节)在每次修改的时候只是修改STM32上的缓存 (实际上就是SRAM,在修改完了之后一次性把STM32上的缓存数据写入到OLED的GRAM。 该方法也有坏处就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。 SSD1306 的命令  1、命令0X81设置对比度。包含两个字节第一个0X81为命令随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。 2、命令0XAE/0XAF:0XAE为关闭显示命令0XAF为开启显示命令。 3、命令0X8D包含2个字节第一个为命令字,第二个为设置值第二个字节的BIT2表示电荷泵的开关状态该位为1则开启电荷泵为0则关闭、在模块初始化的时候这个必须要开启否则是看不到屏幕显示的。 4、命令0XBO~B7:用于设置贡地址其低三位的值对应着GRAM的页地址。 5、命令0X00~0X0F:用于设置显示时的起始列地址低四位。 6、命令0×10~0X1F:用于设置显示时的起始列地址高四位。 1.5 OLED 初始化过程 二、OLED 初始化代码 
/********通过IIC向OLED发送一个字节命令*********/
//参数cmd 需要发送的命令
//返回值 0 发送成功 非0发送失败
uint8_t Oled_Send_One_Byte_Cmd(uint8_t cmd)
{//1、发送起始信号Software_IIC_Start();//2、发送设备地址Software_IIC_Send_One_Byte_Data(OLED_SLAVE_ADDR); //设备地址最低位是0 表示写操作//3、等待从机响应  读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 1;}//4、指令模式Software_IIC_Send_One_Byte_Data(OLED_SLAVE_CMD);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 2;}//6、发送指令模式Software_IIC_Send_One_Byte_Data(cmd);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 3;}//8、发送停止信号  结束通信Software_IIC_Stop(); return 0;//成功  
}/********通过IIC向OLED发送一个字节数据*********/
//参数Dat 需要发送的数据
//返回值 0 发送成功 非0发送失败
uint8_t Oled_Send_One_Byte_DATA(uint8_t Dat)
{//1、发送起始信号Software_IIC_Start();//2、发送设备地址Software_IIC_Send_One_Byte_Data(OLED_SLAVE_ADDR); //设备地址最低位是0 表示写操作//3、等待从机响应  读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 1;}//4、数据模式Software_IIC_Send_One_Byte_Data(OLED_SLAVE_DATA);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 2;}//6、发送数据Software_IIC_Send_One_Byte_Data(Dat);//5、读应答if(Software_IIC_Read_ACK())  //如果从机没有应答 直接退出{Software_IIC_Stop();//退出之前 发送停止信号  结束总线占用return 3;}//8、发送停止信号  结束通信Software_IIC_Stop(); return 0;//成功  
}//填充缓存区中的数据
void OLed_Fill(unsigned char bmp_data)
{unsigned char y,x;for(y0;y8;y)  {//设置PAGE地址 //b0 ~ b7Oled_Send_One_Byte_Cmd(0xb0y); //页寻址只有最低三位有效 因为只有8页//然后就是B开头 多以第一页起始地址为b0//设置列地址Oled_Send_One_Byte_Cmd(0x00);  //列地址低位Oled_Send_One_Byte_Cmd(0x10); //列地址高位for(x0;x128;x){Oled_Send_One_Byte_DATA(bmp_data);                               }} 
}//给OLED发送命令 初始化
void Oled_Init(void)
{Oled_Send_One_Byte_Cmd(0xAE);//--turn off oled panelOled_Send_One_Byte_Cmd(0x00);//---set low column addressOled_Send_One_Byte_Cmd(0x10);//---set high column addressOled_Send_One_Byte_Cmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x81);//--set contrast control registerOled_Send_One_Byte_Cmd(0xCF); // Set SEG Output Current BrightnessOled_Send_One_Byte_Cmd(0xA1);//--Set SEG/Column Mapping     0xa0???? 0xa1??Oled_Send_One_Byte_Cmd(0xC8);//Set COM/Row Scan Direction   0xc0???? 0xc8??Oled_Send_One_Byte_Cmd(0xA6);//--set normal displayOled_Send_One_Byte_Cmd(0xA8);//--set multiplex ratio(1 to 64)Oled_Send_One_Byte_Cmd(0x3f);//--1/64 dutyOled_Send_One_Byte_Cmd(0xD3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x00);//-not offsetOled_Send_One_Byte_Cmd(0xd5);//--set display clock divide ratio/oscillator frequencyOled_Send_One_Byte_Cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/SecOled_Send_One_Byte_Cmd(0xD9);//--set pre-charge periodOled_Send_One_Byte_Cmd(0xF1);//Set Pre-Charge as 15 Clocks  Discharge as 1 ClockOled_Send_One_Byte_Cmd(0xDA);//--set com pins hardware configurationOled_Send_One_Byte_Cmd(0x12);Oled_Send_One_Byte_Cmd(0xDB);//--set vcomhOled_Send_One_Byte_Cmd(0x40);//Set VCOM Deselect LevelOled_Send_One_Byte_Cmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)Oled_Send_One_Byte_Cmd(0x02);//Oled_Send_One_Byte_Cmd(0x8D);//--set Charge Pump enable/disableOled_Send_One_Byte_Cmd(0x14);//--set(0x10) disableOled_Send_One_Byte_Cmd(0xA4);// Disable Entire Display On (0xa4/0xa5)Oled_Send_One_Byte_Cmd(0xA6);// Disable Inverse Display On (0xa6/a7) Oled_Send_One_Byte_Cmd(0xAF);//--turn on oled panelOled_Send_One_Byte_Cmd(0xAF); /*display ON*/ OLed_Fill(0x00);//缓存区数据全为0
}//取消OLED初始化
void off_Init_OLed(void)
{Oled_Send_One_Byte_Cmd(0xAE);//--turn off oled panelOled_Send_One_Byte_Cmd(0x00);//---set low column addressOled_Send_One_Byte_Cmd(0x10);//---set high column addressOled_Send_One_Byte_Cmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x81);//--set contrast control registerOled_Send_One_Byte_Cmd(0xCF); // Set SEG Output Current BrightnessOled_Send_One_Byte_Cmd(0xA1);//--Set SEG/Column Mapping     0xa0???? 0xa1??Oled_Send_One_Byte_Cmd(0xC8);//Set COM/Row Scan Direction   0xc0???? 0xc8??Oled_Send_One_Byte_Cmd(0xA6);//--set normal displayOled_Send_One_Byte_Cmd(0xA8);//--set multiplex ratio(1 to 64)Oled_Send_One_Byte_Cmd(0x3f);//--1/64 dutyOled_Send_One_Byte_Cmd(0xD3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)Oled_Send_One_Byte_Cmd(0x00);//-not offsetOled_Send_One_Byte_Cmd(0xd5);//--set display clock divide ratio/oscillator frequencyOled_Send_One_Byte_Cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/SecOled_Send_One_Byte_Cmd(0xD9);//--set pre-charge periodOled_Send_One_Byte_Cmd(0xF1);//Set Pre-Charge as 15 Clocks  Discharge as 1 ClockOled_Send_One_Byte_Cmd(0xDA);//--set com pins hardware configurationOled_Send_One_Byte_Cmd(0x12);Oled_Send_One_Byte_Cmd(0xDB);//--set vcomhOled_Send_One_Byte_Cmd(0x40);//Set VCOM Deselect LevelOled_Send_One_Byte_Cmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)Oled_Send_One_Byte_Cmd(0x02);//Oled_Send_One_Byte_Cmd(0x8D);//--set Charge Pump enable/disableOled_Send_One_Byte_Cmd(0x14);//--set(0x10) disableOled_Send_One_Byte_Cmd(0xA4);// Disable Entire Display On (0xa4/0xa5)Oled_Send_One_Byte_Cmd(0xA6);// Disable Inverse Display On (0xa6/a7) Oled_Send_One_Byte_Cmd(0xAF);//--turn on oled panel 
} 
2.1 显示汉字与ASCII /***********
设置显示字符位置的函数
参数x-- 列地址y-- 页地址 相当于行的(0-7)
返回值无
************/
void OLed_SetPos(unsigned char x, unsigned char y)
{ Oled_Send_One_Byte_Cmd((0xb0y));  //页的首地址  y 偏移单位Oled_Send_One_Byte_Cmd(((x0xf0)4)|0x10);  //列地址高位 Oled_Send_One_Byte_Cmd((x0x0f)|0x00);   //列地址低位
}/****************
在指定位置显示一个汉字显示一个汉字时,
参数: x 显示位置每次递增16个bity 显示位置每次递增2页 16bitbuf 需要显示的字符字模
返回值无
****************/
void OLed_ShowChina(uint8_t x,uint8_t y,uint8_t *buf)
{uint8_t i  0;OLed_SetPos(x,y);for(i0;i16;i)  { Oled_Send_One_Byte_DATA(buf[i]);}OLed_SetPos(x,(y1));for(i0;i16;i)  { Oled_Send_One_Byte_DATA(buf[i16]);}
}//在指定位置显示ASCLL字符
void OLed_ShowASCII(uint8_t x, uint8_t y,char *str)
{uint8_t i  0;char *pstr  str;while(*pstr){OLed_SetPos(x,y);for(i0;i8;i)  { Oled_Send_One_Byte_DATA(F8X16[((*pstr)-32)*16i]);}OLed_SetPos(x,y1);for(i0;i8;i)  { Oled_Send_One_Byte_DATA(F8X16[((*pstr)-32)*168i]);}pstr;x 8;} 
}/*******
在指定的位置显示连续的文字 中国
*******/
void OLed_ShowTest(unsigned char x,unsigned char y)
{uint8_t i  0;OLed_SetPos(x,y);for(i0;i16;i)  { Oled_Send_One_Byte_DATA(fbuf1[i]);}OLed_SetPos(x,(y1));for(i0;i16;i)  { Oled_Send_One_Byte_DATA(fbuf2[i]);}OLed_SetPos((x16),y);for(i0;i16;i)  { Oled_Send_One_Byte_DATA(fbuf3[i]);}OLed_SetPos((x16),(y1));for(i0;i16;i)  { Oled_Send_One_Byte_DATA(fbuf4[i]);} 
}//显示温度和 湿度
void OLed_ShowTemp(void)
{//第1行显示温度OLed_ShowChina(0,0,HZ1);OLed_ShowChina(16,0,HZ2);//第2行显示湿度OLed_ShowChina(0,2,HZ3);OLed_ShowChina(16,2,HZ2);
}//显示 距离
void OLed_ShowDist(void)
{//第二行显示距离OLed_ShowChina(0,4,HZ4);OLed_ShowChina(16,4,HZ5);
}//显示 关照
void OLed_ShowLight(void)
{//第二行显示光照OLed_ShowChina(0,6,HZ6);OLed_ShowChina(16,6,HZ7);
} 
2.2 显示一个图片 
//显示一张图片 HQYJ
void Oled_Show_BGM_HQYJ(void)
{unsigned char y,x;unsigned char *str  HQYJ;for(y0;y8;y)  {//设置PAGE地址 //b0 ~ b7Oled_Send_One_Byte_Cmd(0xb0y); //页寻址只有最低三位有效 因为只有8页//然后就是B开头 多以第一页起始地址为b0//设置列地址Oled_Send_One_Byte_Cmd(0x00);  //列地址低位Oled_Send_One_Byte_Cmd(0x10); //列地址高位for(x0;x128;x){Oled_Send_One_Byte_DATA(*str);str;}} 
}关于上面的工程大家可以在我的gitee上面去拉在master分支下的单片机课设工程中04-OLED显示DHT11的数据,工程下载地址 工程实现效果图