你好!基于Arduino控制的串口屏

在创客教育中,能用Arduino控制的屏幕有LCD1602液晶显示屏、OLED显示屏(I2C方式)等,但是LCD1602只能显示英文字符和数字,OLED显示屏尺寸又小.

实际上在单片机开发中还会用到一种TFT彩色液晶显示屏,但是这种显示屏的引脚比较多、控制又太复杂,往往需要更高级的单片机才能控制,而且驱动代码非常复杂

但是总有些人希望能用简单的单片机控制复杂的显示屏,今天跟大家分享一款非常适合Arduino控制的彩色液晶显示屏——串口屏

在这里插入图片描述
串口是单片机中最常用的一种接口,小编在之前有专门介绍过串口的概念,小伙伴们可以再翻一下以前的文章!

把串口和彩色液晶显示屏结合起来,就是我们今天要分享的串口屏了,这种控制方式既简单又方便,更适合应用在创客教育领域!

基 本 原 理

1.串口屏的原理

串口屏是由液晶屏+单片机+存储器三部分构成的
我们可以在计算机上利用上位机软件将图片和汉字点阵预先存储到串口屏的存储器中,然后串口屏就可以通过串口接收到指令后调用并显示存储器中的图片和汉字了

在这里插入图片描述

2.接线方式

在这里插入图片描述

本篇文章使用的是Ustart-GPU 22E(II)型号的串口屏,在屏幕右侧有四个引脚,分别是+5V、RX、TX、GND,其中RX是串口接收引脚,TX是串口发送引脚,与Arduino UNO的连接方式如下:

Ustart-GPU Arduino UNO
+5V ------------- +5V
RX ------------- TX(1)
TX ------------- RX(0)

注意
Arduino UNO端使用的是Serial串口,这与Arduino程序下载时使用的是同一个串口引脚,所以在给Arduino下载程序之前要把TX和RX引脚断开连接,待程序下载完成以后再把这两个引脚连接上,然后重启Arduino(按复位键);
对Arduino比较熟悉小伙伴也可以使用软串口SoftSerial或者更换具有多个串口的单片机,例如:mega2560

基 础 指 令

本篇文章只分享串口屏的基本用法和几个常用指令,更高级的指令和用法大家可以查看串口屏的数据手册就可以了,关注微信公众号并发送“串口屏”就可以获取数据手册和示例代码咯!

1.清除屏幕

给串口屏通电10秒钟以后,如果串口屏接收不到串口指令就会自动进入演示状态,显示生产厂家预先设置好的内容

但只要在接通电源的10秒内发送指令给串口屏就会自动进入串口命令状态,也就是我们能自由控制串口屏显示内容了

  • 清理屏幕的指令是 CLS( c ),这里的c表示常用颜色的快捷索引号,常用的有0~63共64中,而演示状态中提供了前16中,例如0表示黑色,1表示红色,2表示绿色等

  • 串口屏实际可设置的颜色有65535种,具体设置方法请查看数据手册

  • 使用Arduino发送串口指令时要以字符串的形式发送,而且每发送一个指令的末尾要加上“\r\n”,示例代码如下:


void setup() {
  Serial.begin(115200);//设置串口波特率,串口屏默认为115200
  Serial.print("CLS(0);\r\n");//发送清理屏幕的指令
  delay(100);
}
void loop() {
}
2.显示文字

在串口屏上显示文字时要标明在哪个位置显示什么文字内容,在哪个位置就是指坐标;

串口屏的坐标是以左上角为原点,横向为x轴,Ustart-GPU22E的x轴是从0到319,共320个像素点,纵向为y轴,从0到239,共240个像素点;

DS16(x1,y1,‘显示内容字符串’,c,limitX); 指令是指在(x1,y1)处用颜色 c 显示一行 16 点阵字;

16 点阵显示一个汉字在X方向占用 16 像素点,Y 方向占用 16 像素点;在显示 16点阵英文字符的时候,系统使用内置的 8X16 点阵英文字符进行显示,X 方向占 8 像素点,Y 方向占 16 像素点;

void setup() {
  Serial.begin(115200);
  Serial.print("CLS(0);\r\n");
  delay(100);
}
void loop() {
  Serial.print("DS16(100,50,'Happy New Year!',2);\r\n");
  delay(100);
}
3.显示汉字

在串口屏上显示汉字可以直接使用上述显示文字的指令,但是ArduinoIDE中输入的中文编码和串口屏的中文编码不一致,因此需要一些特殊处理

  • 在保存Arduino代码的目录下新建一个文本文档,文档中编写如下代码
const char hz[][32]={
"新年快乐!",  //0
"Arduino -- 串口屏",  //1
};
  • 然后另存到同一文件夹中,另存的文件名为hz.c,编码类型要选择ANSI
    在这里插入图片描述

注意:

  • const char hz[][32]实际上是声明了一个字符串数组,每个字符串不能超过32字节,如果你要显示的汉字特别长,可以修改这个数字;
  • 这个文件的目的就是为了解决使用IDE编程环境无法编辑汉字的问题,请勿使用IDE编程环境打开编辑此文件,这样操作会将此文件改写为UTF8内码的文件!
  • 在Arduino中编写代码时要先引入hz.c文件,最好使用绝对路径
#include "C:\Users\Desktop\gpuTest\Hz.c"
String s;
void setup() {
  Serial.begin(115200);
  Serial.print("CLS(0);\r\n");
  delay(100);
}
void loop() {
  Serial.print("DS16(100,50,'Happy New Year!',2);\r\n");
  //指令要拼接成一个字符串统一发送
  //hz是一个字符数组,使用时要先转换成字符串
  s = "DS16(50,100,'" + (String)hz[0] + "',2);\r\n";
  Serial.print(s);
  s = "DS16(50,120,'" + (String)hz[1] + "',2);\r\n";
  Serial.print(s);
  delay(100);
}
4.画圆弧和直线
  • CIR(x1,y1,r,c); 指令是指在(x1,y1)处用颜色 c 画一个半径 r 的空心圆
    参数(x1,y1)表示圆心点的坐标;r表示圆的半径;c表示圆的颜色序号

  • PL(x1,y1,x2,y2,c); 指令是指从(x1,y1)用颜色 c 画一条直线到(x2,y2)
    参数(x1,y1)表示起点的坐标;(x2,y2)表示终点的坐标;c表示线的颜色序号,直线可以是横线,竖线,斜线;

void setup() {
  Serial.begin(115200);
  Serial.print("CLS(0);\r\n");
  delay(100);
}
void loop() {
  Serial.print("PL(0,0,319,239,1);\r\n");
  Serial.print("CIR(160,120,50,2);\r\n");
  delay(100);
}

时 钟 案 例

小编在串口屏上显示了一个钟表的表盘,并实现了指针的转动,作为最后的案例跟大家分享一下,代码逻辑比较简单,就不具体分析说明了,简单说几个注意的地方吧

1.模拟时钟

时分秒的更新可以通过额外增加时钟模块来设置真实的时间,小编在此文中只是模拟了一个时钟
在这里插入图片描述
视频链接:https://b23.tv/520xkd

2.指令拼接

串口发送的指令中涉及到小数的要先转换成整数,然后再把整数数字转换成字符串,最后再把要发送的指令拼接成完整的字符串发送出去

3.表盘初始化

表盘的圆圈和数字不必一直刷新,可以放在初识化中,只发送一次指令即可

4.更新时钟指针

由于表盘中的指针要实时更新,所以在新位置上显示指针时也要把原位置上的指针抹掉,小编直接用背景颜色重新画了一条线来实现的。

所以代码中用到了数组来保存指针上一次的位置坐标,由于表盘中有时分秒三个指针所以用到了二维数组
部分代码如下:

Serial.print("CIR(160,120,3,2);\r\n");
Serial.print("CIR(160,120,115,2);\r\n");
for (int i = 0; i < 12; i++)
  {
    startX = (int)(160 + 110 * sin(3.14 *  i * 30 / 180));
    startY = (int)(120 - 110 * cos(3.14 *  i * 30 / 180));
    endX = (int)(160 + 115 * sin(3.14 *  i * 30 / 180));
    endY = (int)(120 - 115 * cos(3.14 *  i * 30 / 180));
    as = "PL(" + (String)startX + "," + (String)startY + "," + (String)endX + "," + (String)endY + ",2);\r\n";
    Serial.print(as);
    delay(10);
  }

在这里插入图片描述
在这里插入图片描述

  • 11
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值