TA的每日心情 | 擦汗 2024-9-30 02:33 |
---|
签到天数: 444 天 连续签到: 1 天 [LV.9]以坛为家II
|
本帖最后由 独活草 于 2020-8-27 10:59 编辑
今天先拿小龟的OLED显示屏来练手,参照钛极官网的教程,自己搭建工程,简单敲了几行代码:显示屏出字啦!so easy !
附上我的代码:
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模块的核心控制器为SSD1306 芯片,其工作在IIC模式下, 端口”D/C#“ 作为SA0,用于从地址选择;
参看上面电路图,”D/C#“ 接到了低电平; R/W#=0,为写入模式。
可以看出 SSD1306的从机地址为:(7个Bit) 011 1100 ,换成十六进制就是 ox3C
***************************************************************************************************
小龟电路板上有两处用到了IIC通讯,一处是光照强度传感器BH1750,另一处就是OLED;
说说 IIC 总线:
IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
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/
好吧,今晚先研究到这,改天再研究下支持中文显示的方法。
|
|