arduino驱动SPI的FTF_LCD的ST7735屏幕

29 篇文章 10 订阅

在电脑上显示Openmv查看图像信息特别麻烦,所以找了一块屏幕出来,准备用arduino接收openmv的数据,然后以坐标点的形式在LCD屏上显示出来。

工程及代码库:

  1. 将 Ucglib_Arduino-1.3.3 放 到 arduino 库 目 录 下 解 压
    在这里插入图片描述

  2. 打开 Ucglib_Arduino-1.3.3\examples\UcgLogo\UcgLogo.ino 文件
    将 Ucglib_ST7735_18x128x160_SWSPI ucg(/sclk=/ 13, /data=/ 11, /cd=/ 9 , /cs=/
    10, /reset=/ 8); 前 面 的 // 去 掉 ; 如 图 所 示
    在这里插入图片描述

  3. 编译下载程序
    看到效果:(后面代码加了背景和一条线。。。)在这里插入图片描述

  4. 接线说明:

  1. GND=GND
  2. VCC=5V
  3. SCL=13
  4. SDA=11
  5. CS=10
  6. DC=9
  7. RES=8
  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);  
}
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要在Arduino上实现SPI协议,你可以按照以下步骤进行操作: 1. 首先,包含SPI库。在代码的开头添加`#include <SPI.h>`。 2. 在`setup()`函数中,初始化串口和SPI总线。使用`Serial.begin(9600)`初始化串口,使用`SPI.begin()`初始化SPI总线。 3. 配置从设备的选择引脚为输出模式,并激活从设备。使用`pinMode(SS_PIN, OUTPUT)`将选择引脚设置为输出模式,使用`digitalWrite(SS_PIN, LOW)`将选择引脚拉低,激活从设备。 4. 发送初始化指令。使用`SPI.transfer(0x55)`发送初始化指令。 5. 等待一段时间,以便示波器采集到数据。使用`delay(500)`等待500毫秒。 6. 使用`SPI.transfer()`函数获取示波器采集到的数据。将数据存储在一个变量中,例如`byte data = SPI.transfer(0xAA)`。 7. 关闭从设备。使用`digitalWrite(SS_PIN, HIGH)`将选择引脚拉高,关闭从设备。 8. 使用`Serial.println()`函数将采集到的数据输出到串口。例如,`Serial.println(data, HEX)`将以十六进制形式输出数据。 9. 在`loop()`函数中,可以添加其他的主程序循环体。 这样,你就可以在Arduino上实现SPI协议了。请注意,以上代码是一个示例,具体的实现可能会根据你的具体需求而有所不同。你可以根据自己的需要使用SPI库中的其他函数,如`beginTransaction()`、`endTransaction()`、`setBitOrder()`、`setClockDivider()`、`setDataMode()`等\[2\]。另外,不同的Arduino板上的SPI线的针脚可能会有所不同,你可以参考\[3\]中的表格来确定你所使用的Arduino板上的SPI线的针脚。 #### 引用[.reference_title] - *1* [SPI通信协议及基于ArduinoSPI通信例程](https://blog.csdn.net/wangjiaweiwei/article/details/129687615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Arduino--SPI协议官方库官方文档](https://blog.csdn.net/qq_28877125/article/details/103467181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创客阿蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值