在电脑上显示Openmv查看图像信息特别麻烦,所以找了一块屏幕出来,准备用arduino接收openmv的数据,然后以坐标点的形式在LCD屏上显示出来。
工程及代码库:
-
将 Ucglib_Arduino-1.3.3 放 到 arduino 库 目 录 下 解 压
-
打开 Ucglib_Arduino-1.3.3\examples\UcgLogo\UcgLogo.ino 文件
将 Ucglib_ST7735_18x128x160_SWSPI ucg(/sclk=/ 13, /data=/ 11, /cd=/ 9 , /cs=/
10, /reset=/ 8); 前 面 的 // 去 掉 ; 如 图 所 示
-
编译下载程序
看到效果:(后面代码加了背景和一条线。。。) -
接线说明:
- GND=GND
- VCC=5V
- SCL=13
- SDA=11
- CS=10
- DC=9
- RES=8
- BLK 默认可以不接 或者3.3V 接高电平有背光,低电平关灯(关屏)
代码是在淘宝和GitHub找了很久才找到的。
我的代码:
#include <SPI.h>
#include "Ucglib.h"
Ucglib_ST7735_18x128x160_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8);
void setup(void)
{
delay(1000);
//ucg.begin(UCG_FONT_MODE_TRANSPARENT); //字体模式透明
ucg.begin(UCG_FONT_MODE_SOLID); //立体字,有底字
ucg.clearScreen(); //清除屏幕
ucg.setColor(0, 120, 0, 0);
ucg.setColor(2, 0, 120, 0);
ucg.setColor(1, 120, 0, 120);
ucg.setColor(3, 0, 120, 120);
ucg.drawGradientBox(0, 0, ucg.getWidth(), ucg.getHeight()); //背景设置
}
void loop(void)
{
ucg.setRotate90(); //旋转
ucg.setFont(ucg_font_ncenR12_tr); //字体
ucg.setColor(255, 255, 0); //颜色
ucg.setColor(0, 255, 0);
ucg.setColor(1, 255, 0,0);
ucg.setPrintPos(0,24); //设置显示的位置
ucg.print("Hello World!");
ucg.setColor(255, 0, 0); //红
ucg.setPrintPos(36,48);
ucg.print("adan666!");
ucg.setColor(0, 255, 0); //绿
ucg.setPrintPos(36,62);
ucg.print("adan666!");
ucg.setColor(0, 0, 255); //蓝
ucg.setPrintPos(36,86);
ucg.print("six");
ucg.setRotate90(); //旋转
ucg.setColor(255, 255, 255); //白色
ucg.setPrintPos(10,100);
ucg.print("=。=");
ucg.undoRotate(); //不旋转
ucg.setColor(255, 255, 255); //白色
ucg.setPrintPos(10,86);
ucg.print("*+");
for(int i=0;i<100;i++){
ucg.drawPixel(i,20); //画点
delay(200);
} //画线
delay(500);
}
官方字符处理代码:
#include <SPI.h>
#include "Ucglib.h"
/*
Hardware SPI Pins:
Arduino Uno sclk=13, data=11
Arduino Due sclk=76, data=75
Arduino Mega sclk=52, data=51
>>> Please uncomment (and update) one of the following constructors. <<<
*/
Ucglib_ST7735_18x128x160_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8);
/*
Linear Congruential Generator (LCG) 线性同余发生器
z = (a*z + c) % m;
m = 256 (8 Bit)
for period:
a-1: dividable by 2
a-1: multiple of 4
c: not dividable by 2
c = 17
a-1 = 64 --> a = 65
*/
uint8_t z = 127; // start value
uint32_t lcg_rnd(void) //随机数
{
z = (uint8_t)((uint16_t)65*(uint16_t)z + (uint16_t)17);
return (uint32_t)z;
}
void setup(void)
{
delay(1000);
ucg.begin(UCG_FONT_MODE_TRANSPARENT);
ucg.setColor(0, 120, 0, 0);
ucg.setColor(2, 0, 120, 0);
ucg.setColor(1, 120, 0, 120);
ucg.setColor(3, 0, 120, 120);
ucg.drawGradientBox(0, 0, ucg.getWidth(), ucg.getHeight());
}
void loop(void)
{
// 获取0到255之间的随机值
uint8_t rnd = lcg_rnd();
ucg_int_t y = 0;
ucg_int_t h = 14;
//您不能用透明字体覆盖前面的数字
y += h;
ucg.setColor(0, 255, 255, 255); // 使用白色作为字体的主要颜色
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setPrintPos(4,y);
ucg.setFont(ucg_font_helvB08_tr);
ucg.print("Does not work:");
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setFont(ucg_font_helvB08_tr);
ucg.setColor(0, 255, 255, 255); // 使用白色作为字体的主要颜色
ucg.setPrintPos(80,y);
ucg.print(rnd);
//在实体模式下使用相同的透明字体效果更好,
//但仍然有一些像素没有被覆盖
y += h;
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setPrintPos(4,y);
ucg.setFont(ucg_font_helvB08_tr);
ucg.print("Pixel errors:");
ucg.setFontMode(UCG_FONT_MODE_SOLID);
ucg.setFont(ucg_font_helvB08_tr);
ucg.setColor(0, 255, 255, 255); // use white as main color for the font
ucg.setColor(1, 64, 64, 255); // 使用蓝色作为背景为固体模式
ucg.setPrintPos(80,y);
ucg.print(rnd);
//在实体模式下使用“h”或“m”类型的字体几乎可以工作
//但是,如果数字从100改变到99,最后一个数字
//将不会被覆盖。
y += h;
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setPrintPos(4,y);
ucg.setFont(ucg_font_helvB08_tr);
ucg.print("Value errors:");
ucg.setFontMode(UCG_FONT_MODE_SOLID);
ucg.setFont(ucg_font_helvB08_hr);
ucg.setColor(0, 255, 255, 255); // use white as main color for the font
ucg.setColor(1, 64, 64, 255); // use blue as background for SOLID mode
ucg.setPrintPos(80,y);
ucg.print(rnd);
//在实体模式下使用“h”或“m”类型的字体会很好,如果
//字符串后面有额外的间隔来覆盖之前的值。
//只要使用“h”字体,空格的数量是不固定的。
//这意味着,即使是两倍间距的my也不够。最好使用单行字体。
y += h;
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setPrintPos(4,y);
ucg.setFont(ucg_font_helvB08_tr);
ucg.print("Almost ok:");
ucg.setFontMode(UCG_FONT_MODE_SOLID);
ucg.setFont(ucg_font_helvB08_hr);
ucg.setColor(0, 255, 255, 255); // use white as main color for the font
ucg.setColor(1, 64, 64, 255); // use blue as background for SOLID mode
ucg.setPrintPos(80,y);
ucg.print(rnd);
ucg.print(" "); // two extra spaces (not sufficient here)
//透明字体和模式可以使用,如果前面的内容
//被完全删除或覆盖
y += h;
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setPrintPos(4,y);
ucg.setFont(ucg_font_helvB08_tr);
ucg.print("Manual erase:");
ucg.setColor(0, 255, 40, 80);
ucg.setColor(1, 0, 255, 0);
ucg.setColor(2, 255, 0, 0);
ucg.setColor(3, 65, 255, 40);
ucg.drawGradientBox(80-2, y-10, 22, 12); // red to green bar will erase the previous value
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setFont(ucg_font_helvB08_tr);
ucg.setColor(0, 255, 255, 255); // use white as main color for the font
ucg.setPrintPos(80,y);
ucg.print(rnd);
// is将使用纯字体和额外的空格来擦除前面的值
//使用等宽的8x8像素字体(这里:ucg_font_amstrad_cpc_8r)。
y += h;
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setPrintPos(4,y);
ucg.setFont(ucg_font_helvB08_tr);
ucg.print("8x8 font:");
ucg.setFontMode(UCG_FONT_MODE_SOLID);
ucg.setFont(ucg_font_amstrad_cpc_8r);
ucg.setColor(0, 255, 255, 255); // use white as main color for the font
ucg.setColor(1, 64, 64, 255); // use blue as background for SOLID mode
ucg.setPrintPos(80,y);
ucg.print(rnd);
ucg.print(" "); // extra spaces
// is将使用纯字体和额外的空格来擦除前面的值
//任何等宽字体都可以使用(这里:ucg_font_7x13_mr)。
y += h;
ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
ucg.setPrintPos(4,y);
ucg.setFont(ucg_font_helvB08_tr);
ucg.print("_mr font:");
ucg.setFontMode(UCG_FONT_MODE_SOLID);
ucg.setFont(ucg_font_7x13_mr);
ucg.setColor(0, 255, 255, 255); // use white as main color for the font
ucg.setColor(1, 64, 64, 255); // use blue as background for SOLID mode
ucg.setPrintPos(80,y);
ucg.print(rnd);
ucg.print(" "); // extra spaces
delay(100);
}