找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2944|回复: 5
打印 上一主题 下一主题
收起左侧

单片机+oled显示程序问题

[复制链接]
跳转到指定楼层
楼主
楼主用的i2c oled,也就是四脚oled,原来一直用的128x64图片显示来做东西玩,最近想做的东西用到的图片是85x64格式,结果发现oled显示出现问题,自己改了很多地方都没法解决
右边出现了乱码,程序如下,是商家给的例程,请问哪个地方的问题,列地址这方面吗?


  1. #include "oled.h"
  2. #include "picture.h"


  3. /**********************************************
  4. //IIC Start
  5. **********************************************/
  6. void IIC_Start()
  7. {
  8.    SCL = high;               
  9.    SDA = high;
  10.    SDA = low;
  11.    SCL = low;
  12. }

  13. /**********************************************
  14. //IIC Stop
  15. **********************************************/
  16. void IIC_Stop()
  17. {
  18.    SCL = low;
  19.    SDA = low;
  20.    SCL = high;
  21.    SDA = high;
  22. }
  23. /**********************************************
  24. // IIC Write byte
  25. **********************************************/
  26. void Write_IIC_Byte(unsigned char IIC_Byte)
  27. {
  28.         unsigned char i;
  29.         for(i=0;i<8;i++)               
  30.         {
  31.                 if(IIC_Byte & 0x80)
  32.                 SDA=high;
  33.                 else
  34.                 SDA=low;
  35.                 SCL=high;
  36.                 SCL=low;
  37.                 IIC_Byte<<=1;
  38.         }
  39.         SDA=1;
  40.         SCL=1;
  41.         SCL=0;
  42. }
  43. /**********************************************
  44. // IIC Write Command
  45. **********************************************/
  46. void Write_IIC_Command(unsigned char IIC_Command)
  47. {
  48.    IIC_Start();
  49.    Write_IIC_Byte(0x78);            //Slave address,SA0=0
  50.    Write_IIC_Byte(0x00);                        //write command
  51.    Write_IIC_Byte(IIC_Command);
  52.    IIC_Stop();
  53. }
  54. /**********************************************
  55. // IIC Write Data
  56. **********************************************/
  57. void Write_IIC_Data(unsigned char IIC_Data)
  58. {
  59.    IIC_Start();
  60.    Write_IIC_Byte(0x78);                        //D/C#=0; R/W#=0
  61.    Write_IIC_Byte(0x40);                        //write data
  62.    Write_IIC_Byte(IIC_Data);
  63.    IIC_Stop();
  64. }
  65. /********************************************
  66. // fill_Picture
  67. ********************************************/
  68. void fill_picture(unsigned char fill_Data)
  69. {
  70.         unsigned char m,n;
  71.         for(m=0;m<8;m++)
  72.         {
  73.                 Write_IIC_Command(0xb0+m);                //page0-page1
  74.                 Write_IIC_Command(0x00);                //low column start address
  75.                 Write_IIC_Command(0x10);                //high column start address
  76.                 for(n=0;n<132;n++)
  77.                         {
  78.                                 Write_IIC_Data(fill_Data);
  79.                         }
  80.         }
  81. }
  82. /******************************************
  83. // picture用来显示一个图片
  84. ******************************************/
  85. void Picture()
  86. {
  87.   unsigned char x,y;
  88.   unsigned int i=0;
  89.   for(y=0;y<8;y++)
  90.     {
  91.       Write_IIC_Command(0xb0+y);
  92.       Write_IIC_Command(0x0);
  93.       Write_IIC_Command(0x10);
  94.       for(x=0;x<128;x++)
  95.         {
  96.           Write_IIC_Data(show[i++]);
  97.         }
  98.     }
  99. }

  100. /***********************Delay****************************************/
  101. void Delay_50ms(unsigned int Del_50ms)
  102. {
  103.         unsigned int m;
  104.         for(;Del_50ms>0;Del_50ms--)
  105.                 for(m=6245;m>0;m--);
  106. }

  107. void Delay_1ms(unsigned int Del_1ms)
  108. {
  109.         unsigned char j;
  110.         while(Del_1ms--)
  111.         {        
  112.                 for(j=0;j<123;j++);
  113.         }
  114. }



  115. void Initial_M096128x64_ssd1306()
  116. {
  117.         Write_IIC_Command(0xAE);   //display off
  118.         Write_IIC_Command(0x20);        //Set Memory Addressing Mode        
  119.         Write_IIC_Command(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  120.         Write_IIC_Command(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
  121.         Write_IIC_Command(0xc8);        //Set COM Output Scan Direction
  122.         Write_IIC_Command(0x00);//---set low column address
  123.         Write_IIC_Command(0x10);//---set high column address
  124.         Write_IIC_Command(0x40);//--set start line address
  125.         Write_IIC_Command(0x81);//--set contrast control register
  126.         Write_IIC_Command(0xdf);
  127.         Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
  128.         Write_IIC_Command(0xa6);//--set normal display
  129.         Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
  130.         Write_IIC_Command(0x3F);//
  131.         Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  132.         Write_IIC_Command(0xd3);//-set display offset
  133.         Write_IIC_Command(0x00);//-not offset
  134.         Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
  135.         Write_IIC_Command(0xf0);//--set divide ratio
  136.         Write_IIC_Command(0xd9);//--set pre-charge period
  137.         Write_IIC_Command(0x22); //
  138.         Write_IIC_Command(0xda);//--set com pins hardware configuration
  139.         Write_IIC_Command(0x12);
  140.         Write_IIC_Command(0xdb);//--set vcomh
  141.         Write_IIC_Command(0x20);//0x20,0.77xVcc
  142.         Write_IIC_Command(0x8d);//--set DC-DC enable
  143.         Write_IIC_Command(0x14);//
  144.         Write_IIC_Command(0xaf);//--turn on oled panel
  145. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:362076 发表于 2020-1-29 15:37 | 只看该作者
你的图片绘制函数在做行填充的时候超界了。
回复

使用道具 举报

板凳
ID:608920 发表于 2020-1-29 20:08 | 只看该作者
凌净清河 发表于 2020-1-29 15:37
你的图片绘制函数在做行填充的时候超界了。

所以是我用页寻址方式不恰当,导致列上面128个点超出图片的取模范围了?
回复

使用道具 举报

地板
ID:362076 发表于 2020-1-30 08:56 | 只看该作者
callmesbplease 发表于 2020-1-29 20:08
所以是我用页寻址方式不恰当,导致列上面128个点超出图片的取模范围了?

你琢磨琢磨,你图片是85*64的,OLED是128*64的,在绘制的时候应该怎么选择范围?
OLED12864一共8个行寄存器(0~7),每个行寄存器有128列(0~127),按照你图中表现的那样进行填充,那么应该是行寄存器0~7循环,列寄存器0~84循环填充。
回复

使用道具 举报

5#
ID:608920 发表于 2020-1-30 18:27 | 只看该作者
凌净清河 发表于 2020-1-30 08:56
你琢磨琢磨,你图片是85*64的,OLED是128*64的,在绘制的时候应该怎么选择范围?
OLED12864一共8个行寄 ...

我试了一下改代码,也是图像能正常显示,但是列地址没有填充的空间发生了乱码,请问是缺少什么其他该有的东西吗?
  1. void Picture()
  2. {
  3.   unsigned char x,y;
  4.   unsigned int i=0;
  5.   for(y=0;y<8;y++)
  6.     {
  7.       Write_IIC_Command(0xb0+y);
  8.       Write_IIC_Command(0x0);
  9.       Write_IIC_Command(0x10);
  10.       for(x=0;x<84;x++)
  11.         {
  12.           Write_IIC_Data(show[i++]);
  13.         }
  14.     }
  15. }
复制代码
回复

使用道具 举报

6#
ID:362076 发表于 2020-1-31 12:25 | 只看该作者
callmesbplease 发表于 2020-1-30 18:27
我试了一下改代码,也是图像能正常显示,但是列地址没有填充的空间发生了乱码,请问是缺少什么其他该有的 ...

首先确定你的图片取模方式和存放方式,确保它是完全适配图片绘制函数的,其次,1306写入数据的时候只修改被写入的部分,所以在全部开始之前要进行至少一次清屏,以保证每个像素的值是确定的状态。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表