OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7057|回复: 12

关于原子的源码OLED ,有几句不太懂,大神给解释一下。。。。。。

[复制链接]

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2013-11-20
在线时间
7 小时
发表于 2015-12-1 21:19:09 | 显示全部楼层 |阅读模式
5金钱

关于OLED的画点函数;
    
1       void OLED_DrawPoint(u8 x,u8 y,u8 t)
2     {
3     u8 pos,bx,temp=0;
4    if(x>127||y>63)return;//????·??§??.
5    pos=7-y/8;
6    bx=y%8;
7  temp=1<<(7-bx);
8   if(t)OLED_GRAM[x][pos]|=temp;
9    else OLED_GRAM[x][pos]&=~temp;    
}

我的控制器是1305,驱动是自己写的没有问题,应用程序按照原子的思想写,用

原子的源码,但是字符显示出来是镜像的,这个画点函数有点不太明白:

假如我在 (100,3)这点 点亮,本应该操作的数据元素是OLED_GRAM[100][0]

按照源码,操作的缓存数组元素是 OLED_[100][7]   

我把源码的第5行 和 第 7行 做如下的修改,

5    pos=y/8;
7  temp=1<<bx;

然后字符可以正常的显示出来,但是在屏幕上显示一堆字符的时候,有时候会出现乱码

大神给讲讲原子的这段代码把。。。。。。。。。





最佳答案

查看完整内容[请看2#楼]

如果你屏幕是以左上角为原点,按物理层面,你想要在屏幕的中间位置画一个点坐标应该是(0,-32)没错吧,Y轴已经处在负半轴了,如果你是以左下角为准,那中间位置坐标就是(0,32),处在Y的正半轴,但是OLED屏原子哥代码扫描方式是从上到下扫的不符合物理层面,为了实现这个转换,便有了“pos=7-y/8;”同时数据的传送方式又是"先送高位",所以有了“temp=1<<(7-bx);”如果你的扫描方式改了,代码也应该有相应的更改,如果你没改扫描 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-1 21:19:10 | 显示全部楼层
如果你屏幕是以左上角为原点,按物理层面,你想要在屏幕的中间位置画一个点坐标应该是(0,-32)没错吧,Y轴已经处在负半轴了,如果你是以左下角为准,那中间位置坐标就是(0,32),处在Y的正半轴,但是OLED屏原子哥代码扫描方式是从上到下扫的不符合物理层面,为了实现这个转换,便有了“pos=7-y/8;”同时数据的传送方式又是"先送高位",所以有了“temp=1<<(7-bx);”如果你的扫描方式改了,代码也应该有相应的更改,如果你没改扫描方式,那上面那样写肯定出错的,而且会出现你说的镜像,因为是“先送高位”,如果你一个字符在两页中间的话就会出现被镜像的字符底下的部分显示到了下一行导致错乱,你可以再仔细看下原子哥的教程,下面给你副图和代码参考
void OLED_DrawPoint(u8 x,u8 y,u8 t)
06 {
07     u8 pos,bx,temp=0;
08     if(x>127||y>63)return;//超出范围了.
09     pos=7-y/8;            //计算得出在第几页,page0~7
10     bx=y%8;               //得出在page里面的具体位置
11     temp=1<<(7-bx);       //由于x,y是以左下角为准,这里要转为以page的左上角为准
12     if(t)OLED_GRAM[x][pos]|=temp; //相应位置1
13     else OLED_GRAM[x][pos]&=~temp;//相应位置0
14 }


我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-1 21:32:03 | 显示全部楼层
首先你的100,3这个坐标基于哪个点的?屏幕的左下角?如果是的话照理说y=3就是在屏幕的底下了对吧?有看手册嘛,屏幕是分页的,刚好最底下就是第7页,最上面是是第0页
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2013-11-20
在线时间
7 小时
 楼主| 发表于 2015-12-2 21:33:44 | 显示全部楼层
回复【2楼】229382777@qq.com:
---------------------------------
我把屏幕的左上角定为原点,整个屏幕的分布如下  ,以下是我的理解。
                       
                         原点 。--------------------------------------------------  x轴(  0 ,127)
                 (0  page)  |                                      
                (1  page)|
                                |
                                |
                                |
                                |
                                |
                 (7 page)|
                             y轴( 0,63)


               我们定义的 OLED_GRAM[128][7]缓冲,根据原子的OLED_Refresh_Gram函数,我得出,数据元素 OLED_GRAM[0][0]将会写到
               第0页的第0列,并且数据的高位写到了 y坐标的高位(0,7)点,比如OLED_GRAM[0][0] = 0x80 ; 那么坐标(0,7)会被点亮,
               这也是我看了数据手册以后得到的;
                       假如我要点亮(0,3)按照原子的代码,将会点亮第7页的(0,61)点,
               我这样理解对吗?
                               ssd1305 和ssd306 我看了数据手册,好像区别不是太大,我按照我的理解,修改了这两句  pos=y/8;
 temp=1<<bx;    
                 其他代码都按原子的,点亮任意屏幕上一点,都没有问题,而且坐标也对的
                现在的问题是:
                   显示1608的字符,假如我案如下坐标显示没有问题,显示正常
             
        OLED_ShowString(0,16,"ATOM@ALIENTEK");  
        OLED_ShowString(0,32,"ATOM@ALIENTEK");  

               但是当Y坐标是按照整页 ,就会有字符显示不正常  比如

               OLED_ShowString(0,17,"ATOM@ALIENTEK");  
       OLED_ShowString(0,37,"ATOM@ALIENTEK");  

               这是啥问题了,。。。>
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2013-11-20
在线时间
7 小时
 楼主| 发表于 2015-12-2 21:38:12 | 显示全部楼层
回复【3楼】力志强:
---------------------------------
Y坐标发现乱了,不好意思,回复只能是纯文本,不能画图,


   最闹心的是,y坐标要是按照 0,16,32,48 等这些整页显示就没有问题,一旦不是这些整页,就会有字符的点错乱,
  
  我用画点函数,点亮任何一个我想点亮的点,发现没有问题,一显示字符就会有问题
  
   弄了好几天了,我实在是晕了。。。
回复

使用道具 举报

7

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2013-11-20
在线时间
7 小时
 楼主| 发表于 2015-12-2 21:44:13 | 显示全部楼层
回复【2楼】229382777@qq.com:
---------------------------------
您的QQ 是229382777 吗?我加您QQ需要验证码 ,方便告我一下吗?
回复

使用道具 举报

0

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-5-9
在线时间
18 小时
发表于 2017-5-25 14:08:55 | 显示全部楼层
oled 很多程序看不懂
回复

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2013-4-5
在线时间
82 小时
发表于 2017-6-19 10:34:52 | 显示全部楼层
讲的太粗糙了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-3-17
在线时间
3 小时
发表于 2017-7-3 13:20:15 | 显示全部楼层

是啊,感觉这章讲的很糙,一下子就过去了,不知道是不是不重要、
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-7-8
在线时间
13 小时
发表于 2017-7-14 19:02:16 | 显示全部楼层
OLED那段视频我看不懂,OLED_GRAM[128][8]为什么不是[8][128],这样对应来才是8行128列赛,还有就LZ贴的那段代码也看不懂,,大佬们求教教啊
回复

使用道具 举报

5

主题

115

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2014-9-29
在线时间
276 小时
发表于 2017-7-27 20:14:26 | 显示全部楼层
我看了也是一脸懵逼,感觉教程说得太让人疑惑了,应该是高低位设置问题,不过注释没写清楚,以为是程序出错
回复

使用道具 举报

2

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-11-19
在线时间
48 小时
发表于 2017-8-4 21:42:06 | 显示全部楼层
这个画点的我没法清屏,怎么说,我用OLED_Clear();都不行,一直会显示以前,我想显示实时轨迹,最后显示了一条线
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-8-10
在线时间
5 小时
发表于 2018-12-5 00:14:49 | 显示全部楼层
Passenger123 发表于 2017-7-14 19:02
OLED那段视频我看不懂,OLED_GRAM[128][8]为什么不是[8][128],这样对应来才是8行128列赛,还有就LZ贴的那段 ...

对,我也有这样的疑惑。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 08:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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