查看: 2621|回复: 1

[原创] 【 钛极小龟】---II2C通讯(OLED屏)

[复制链接]
  • TA的每日心情
    无聊
    2022-4-28 09:50
  • 签到天数: 443 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2019-1-18 00:11:52 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 独活草 于 2020-8-27 10:59 编辑

       今天先拿小龟的OLED显示屏来练手,参照钛极官网的教程,自己搭建工程,简单敲了几行代码:显示屏出字啦!so easy !
    1.jpg 2.jpg 3.jpg

    附上我的代码:
    import java.io.IOException;
    import tijos.framework.devicecenter.TiI2CMaster;
    import tijos.framework.transducer.oled.TiOLED_UG2864;
    import tijos.framework.util.Delay;

    public class TiOLED_IIC_Test {
            public static void main(String[] args) {               
          String screen1 = "Hi, I am Mrs.Wang ";
          String screen2 = "I am a programmer of java";
          String screen3 = "I like TiJOS so much!";   
          try {
              // I2C主机总线资源分配,I2C PORT0
              TiI2CMaster i2cm0 = TiI2CMaster.open(0);
              // I2C主机总线资源与屏幕对象绑定,屏幕地址:0x3C
              TiOLED_UG2864 oled = new TiOLED_UG2864(i2cm0, 0x3C);   
              // 屏幕开启并清屏
              oled.turnOn();        
              oled.clear();
              // 通过屏幕循环打印
              while (true) {
                  // 显示第1屏内容,等待2秒后清屏
                  oled.output(screen1);
                  Delay.msDelay(2000);
                  oled.clear();
                  // 显示第2屏内容,等待2秒后清屏
                  oled.output(screen2);
                  Delay.msDelay(2000);
                  oled.clear();
                  // 显示第3屏内容,等待2秒后清屏
                  oled.output(screen3);
                  Delay.msDelay(2000);
                  oled.clear();
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
            }
    }
    ************************************************************************************************
    不得不说,有了钛极详细的教程,应用起来很快。耐不住寂寞的我扒了下代码发现以下几点:
    1:OLED 的IIC接口硬件电路:
    OLED.JPG

    OLED模块的核心控制器为SSD1306 芯片,其工作在IIC模式下, 端口”D/C#“ 作SA0,用于从地址选择;
    参看上面电路图,”D/C#“ 接到了低电平; R/W#=0,为写入模式。
    微信截图_20200827105519.png


    可以看出 SSD1306的从机地址为:(7个Bit) 011 1100 ,换成十六进制就是 ox3C
    ***************************************************************************************************

    小龟电路板上有两处用到了IIC通讯,一处是光照强度传感器BH1750,另一处就是OLED;

    说说 IIC 总线:
    IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。
    IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

    iic总线.JPG


    2:OLED屏的地址官方直接给出了是 0x3C , (应该是链接到IIC总线上的OLED设备地址;这个地址就固定了? 能否修改?)
    3:若要OELD 显示中文,在小龟的代码里是否方便处理?
    4:官方在 package tijos.framework.transducer.oled 包的 TiOLED_UG2864.java  OLED对象类中封装了两个方法用于显示 String 内容:     output(String text)  和   print(int lineId, int columnId, String text)
         
    oled.output( ) 这个函数:默认屏显示的起始行号、列号都是0;
    如果想自己定制显示内容的起始行号、列号,可以使用 oled.print( )这个函数。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
             * Output string text, <br>
             * position automatic movement
             *
             * @param text
             *            string text[IN]
             * @throws IOException
             */
            public void output(String text) throws IOException {        
                    int matrixTotal = text.length();
                    if (matrixTotal <= 0)
                            return;        
                    int matrixIndex = 0;
                    byte[][] dotMatrix = dotMatrixObj.convert(text);
                    synchronized (i2cmObj) {
                            int lineId = currentLineId;
                            int columnId = currentColumnId;
                            while (matrixTotal-- > 0) {
                                    oledWriteAsc16(lineId, columnId, dotMatrix[matrixIndex++]);
                                    currentColumnId = columnId;
                                    columnId++;
                                    if (columnId >= 16) {
                                            columnId = 0;
                                            currentLineId = lineId;
                                            lineId++;
                                            if (lineId >= 4)
                                                    lineId = 0;
                                    }
                            }
                    }
            }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
             * Print string text,<br>
             * position automatic movement,<br>
             * data that exceeds the length will be automatically deleted
             *
             * @param lineId
             *            line index[IN],range:0-3
             * @param columnId
             *            column index[IN],range:0-15
             * @param text
             *            string text[IN]
             * @throws IOException
             */
            public void print(int lineId, int columnId, String text) throws IOException {
                    if (lineId < 0 || lineId > 3)
                            lineId = 3;
                    if (columnId < 0 || columnId > 15)
                            columnId = 15;
                    if (text.length() <= 0) {
                            synchronized (i2cmObj) {
                                    currentColumnId = columnId;
                                    currentLineId = lineId;
                            }
                            return;
                    }
                    int matrixLeft = 64 - (lineId * 16 + columnId);
                    if (matrixLeft > text.length())
                            matrixLeft = text.length();
                    int matrixIndex = 0;
                    byte[][] dotMatrix = dotMatrixObj.convert(text);
                    synchronized (i2cmObj) {
                            while (matrixLeft-- > 0) {
                                    oledWriteAsc16(lineId, columnId, dotMatrix[matrixIndex++]);
                                    currentColumnId = columnId;
                                    columnId++;
                                    if (columnId >= 16) {
                                            columnId = 0;
                                            currentLineId = lineId;
                                            lineId++;
                                            if (lineId >= 4)
                                                    lineId = 0;
                                    }
                            }
                    }
            }

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    看样子想让屏显示汉字,就要改写这个 byte[][] convert( String text) 方法了,该方法在 tijos.framework.util.text.TiDotMatrix 这个类中定义,貌似官方未公布这个类的源码。。。。

    顺便看下OLED类定义
    public TiOLED_UG2864(TiI2CMaster i2c, int address) throws IOException {
                    dotMatrixObj = new TiDotMatrix(TiDotMatrix.ASC16);
                    oledAddress = address;
                    currentLineId = 0;
                    currentColumnId = 0;
                    i2c.setWorkBaudrate(400);
                    i2cmObj = i2c;
            }

    官网在这个类中,写死了 IIC 通讯的波特率是400kbit/s默认屏显示的起开始行号、列号都是0。更多关于钛极IIC总线的使用可查参看 http://dev.tijos.net/docstore/tijos-development-guide/tijos.framework.devicecenter.TiI2CMaster/

    好吧,今晚先研究到这,改天再研究下支持中文显示的方法。




















    回复

    使用道具 举报

    该用户从未签到

    发表于 2021-1-24 13:57:44 | 显示全部楼层
    BUWPMYB5`4~IYWR8{FI`8IU.png 楼主你好,我在使用钛极小龟的时候,连接设备显示连接不上,我按照图片里的提示操作也是连接不上,能否有办法解决?

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 11:34 , Processed in 0.118513 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.