[其他ST产品] STM32驱动0.96寸OLED液晶屏

[复制链接]
 楼主| lxs0026 发表于 2023-8-25 16:16 | 显示全部楼层
例如如果页地址设为B2h,低列地址为03h,而高列地址为00h,那么也就意味着开始列是PAGE2的SEG3,而RAM的获取指针定位到下图中。而输入的数据将会被写入列3的位置。
 楼主| lxs0026 发表于 2023-8-25 16:16 | 显示全部楼层
2505264e86353b427e.png
所以确定好了显示位置,直接输出字符对应的像素数据数组就好了。
 楼主| lxs0026 发表于 2023-8-25 16:16 | 显示全部楼层
4.字幕显示原理
字幕显示原理我们用的OLED液晶屏是由12864个发光点阵组成,即分辨率是12864。 ASCII码可以68、88、816像素,汉字一般显示像素为1616。 一般为了显示效果理想,英文和数字常选用8*16像素显示。
 楼主| lxs0026 发表于 2023-8-25 16:17 | 显示全部楼层
二、 上下或左右的滑动显示长字符
1.水平左右移动
  1. OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
  2. OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27
  3. OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  4. OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
  5. OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
  6. OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
  7. OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  8. OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
  9. OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
 楼主| lxs0026 发表于 2023-8-25 16:17 | 显示全部楼层
2.垂直水平滚动
  1. OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
  2. OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27
  3. OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  4. OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
  5. OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
  6. OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
  7. OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  8. OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
  9. OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
 楼主| lxs0026 发表于 2023-8-25 16:17 | 显示全部楼层
3.汉字取模
  1.   0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x02,0x00,0xFF,0xFE,0x08,0x20,
  2.   0x10,0x10,0x2F,0xE8,0xC8,0x26,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,/*"春",0*/
  3.   0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x28,0x50,0x24,0x50,0x22,0x90,0x22,0x90,
  4.   0x21,0x10,0x21,0x10,0x22,0x90,0x22,0x92,0x24,0x4A,0x48,0x4A,0x40,0x06,0x80,0x02,/*"风",1*/
  5.   0x10,0x90,0x10,0x90,0x10,0x90,0x12,0x92,0xFD,0x94,0x10,0x98,0x30,0x90,0x39,0x98,
  6.   0x56,0x94,0x54,0x92,0x90,0x90,0x10,0x90,0x11,0x12,0x11,0x12,0x12,0x12,0x14,0x0E,/*"桃",2*/
  7.   0x01,0x00,0x01,0x00,0x7F,0xFC,0x03,0x80,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,
  8.   0x0F,0xE0,0x00,0x40,0x00,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"李",3*/
  9.   0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x00,0x00,0x08,0x88,0x08,0x90,0x10,0xA0,
  10.   0x30,0xC0,0x50,0x80,0x91,0x80,0x12,0x82,0x14,0x82,0x10,0x82,0x10,0x7E,0x10,0x00,/*"花",4*/
  11.   0x00,0x00,0x7F,0xFC,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0xFF,0xFE,
  12.   0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0x20,/*"开",5*/
  13.   0x02,0x00,0x01,0x00,0xFF,0xFE,0x08,0x80,0x08,0x80,0x10,0xF8,0x11,0x08,0x31,0x48,
  14.   0x52,0x28,0x95,0x10,0x11,0x10,0x10,0xA0,0x10,0x40,0x10,0xA0,0x11,0x18,0x16,0x06,/*"夜",6*/
 楼主| lxs0026 发表于 2023-8-25 16:17 | 显示全部楼层
4.main函数
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "oled.h"
  4. #include "gui.h"
  5. #include "test.h"
  6. int main(void)
  7. {       
  8.         delay_init();                           //延时函数初始化          
  9.         NVIC_Configuration();            //设置NVIC中断分组2:2位抢占优先级,2位响应优先级        
  10.         OLED_Init();                                 //初始化OLED  
  11.         OLED_Clear(0);             //清屏(全黑)
  12.         OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
  13.     OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27
  14.     OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  15.         OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
  16.         OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
  17.         OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
  18.         OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
  19.         OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
  20.         TEST_MainPage();
  21.         OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
  22. }

 楼主| lxs0026 发表于 2023-8-25 16:17 | 显示全部楼层
5.显示数据
  1. void TEST_MainPage(void)
  2. {       
  3.         //GUI_ShowString(28,0,"Harriet",16,1);
  4.         GUI_ShowCHinese(10,20,16,"春风桃李花开夜",1);
  5.         //GUI_ShowString(40,32,"64X128",16,1);
  6.         delay_ms(1500);               
  7.         delay_ms(1500);
  8. }
 楼主| lxs0026 发表于 2023-8-25 16:18 | 显示全部楼层
6.运行结果
2035064e863c33b586.png
 楼主| lxs0026 发表于 2023-8-25 16:18 | 显示全部楼层
三、 显示AHT20的温度和湿度
1.显示温湿度代码


  1. void read_AHT20(void)
  2. {
  3. uint8_t   i;
  4. for(i=0; i<6; i++)
  5. {
  6. readByte[i]=0;
  7. }

  8. //-------------
  9. I2C_Start();
  10. I2C_WriteByte(0x71);
  11. ack_status = Receive_ACK();
  12. readByte[0]= I2C_ReadByte();
  13. Send_ACK();
  14. readByte[1]= I2C_ReadByte();
  15. Send_ACK();

  16. readByte[2]= I2C_ReadByte();
  17. Send_ACK();

  18. readByte[3]= I2C_ReadByte();
  19. Send_ACK();

  20. readByte[4]= I2C_ReadByte();
  21. Send_ACK();
  22. readByte[5]= I2C_ReadByte();
  23. SendNot_Ack();
  24. //Send_ACK();

  25. I2C_Stop();

  26. //--------------
  27. if( (readByte[0] & 0x68) == 0x08 )
  28. {
  29. H1 = readByte[1];
  30. H1 = (H1<<8) | readByte[2];
  31. H1 = (H1<<8) | readByte[3];
  32. H1 = H1>>4;

  33. H1 = (H1*1000)/1024/1024;

  34. T1 = readByte[3];
  35. T1 = T1 & 0x0000000F;
  36. T1 = (T1<<8) | readByte[4];
  37. T1 = (T1<<8) | readByte[5];

  38. T1 = (T1*2000)/1024/1024 - 500;

  39. AHT20_OutData[0] = (H1>>8) & 0x000000FF;
  40. AHT20_OutData[1] = H1 & 0x000000FF;

  41. AHT20_OutData[2] = (T1>>8) & 0x000000FF;
  42. AHT20_OutData[3] = T1 & 0x000000FF;
  43. }
  44. else
  45. {
  46. AHT20_OutData[0] = 0xFF;
  47. AHT20_OutData[1] = 0xFF;

  48. AHT20_OutData[2] = 0xFF;
  49. AHT20_OutData[3] = 0xFF;
  50. printf("lyy");

  51. }
  52. /*通过串口显示采集得到的温湿度
  53. printf("\r\n");
  54. printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
  55. printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
  56. printf("\r\n");*/
  57. t=T1/10;
  58. t1=T1%10;
  59. a=(float)(t+t1*0.1);
  60. h=H1/10;
  61. h1=H1%10;
  62. b=(float)(h+h1*0.1);
  63. sprintf(strTemp,"%.1f",a);   //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中  
  64.     sprintf(strHumi,"%.1f",b);    //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中  
  65. GUI_ShowCHinese(16,00,16,"温湿度显示",1);
  66. GUI_ShowCHinese(16,20,16,"温度",1);
  67. GUI_ShowString(53,20,strTemp,16,1);
  68. GUI_ShowCHinese(16,38,16,"湿度",1);
  69. GUI_ShowString(53,38,strHumi,16,1);
  70. delay_ms(1500);
  71. delay_ms(1500);
  72. }
 楼主| lxs0026 发表于 2023-8-25 16:19 | 显示全部楼层
2.添加点阵字
  1. "温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
  2.   0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
  3.         "度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
  4.   0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/
  5.         "湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
  6.   0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/
  7.         "显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,
  8.   0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/
  9.         "示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,
  10.   0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",0*/
 楼主| lxs0026 发表于 2023-8-25 16:19 | 显示全部楼层
3.main函数
  1. #include "delay.h"
  2. #include "usart.h"
  3. #include "bsp_i2c.h"
  4. #include "sys.h"

  5. #include "oled.h"
  6. #include "gui.h"
  7. #include "test.h"

  8. int main(void)
  9. {       
  10.         delay_init();                           //延时函数初始化              
  11.         uart_init(115200);         
  12.         IIC_Init();
  13.                   
  14.         NVIC_Configuration();            //设置NVIC中断分组2:2位抢占优先级,2位响应优先级        
  15.         OLED_Init();                                 //初始化OLED  
  16.         OLED_Clear(0);
  17.         while(1)
  18.         {
  19.                 //printf("温度湿度显示");
  20.                 read_AHT20_once();
  21.                 OLED_Clear(0);
  22.                 delay_ms(1500);
  23.   }
  24. }



 楼主| lxs0026 发表于 2023-8-25 16:19 | 显示全部楼层
4.运行结果
3985564e864120f420.png
tian111 发表于 2023-8-25 22:00 | 显示全部楼层
先得实现一个向SSD1306写入一个字节的函数
daichaodai 发表于 2023-8-26 09:15 来自手机 | 显示全部楼层
OLED功耗低,显示效果好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部