arduino串口显示屏
在家呆的经费已经耗尽了,想做一个电子钟项目却缺少一个合适的串口屏,于是我盯上了闲着的arduino和买了很长时间的8bit9341屏幕。。。。。。
先列目标:我的要求是一个比传统意义上串口屏更加简单的屏幕模块
串口输入什么就显示上去,第一版仅开发字符显示,用于显示数据的应急。
所以有如下的程序,简单有效:
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_KBV.h> //Hardware-specific library
LCDWIKI_KBV mylcd(ILI9341,A3,A2,A1,A0,A4); //model,cs,cd,wr,rd,reset
//我们的目的:在指定坐标,指定颜色和字号,显示一个字符
//这是最底层,之后要做各种显示拓展
//先做串口解码实验,解码数据后打回
//一字节表明要 输出文字(起始帧也携带显示种类数据)。一字节表明 字号和颜色(均为16种)2字节表示坐标,一字节表示字符,一字节表示结束
//一次显示共计6个字节,//可能会降速。。。一秒可能只能刷新50个字符。。但应该够了
String comdata = "";//接收数据缓冲组//0xf0为开始,0xff为结束
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
unsigned char view=0;//显示标志位,决定是否进入显示模式
unsigned char x=0;
unsigned char y=0;//坐标
unsigned char Size=0;//字号
char color=0;//色号
char backcolor=0;//色号
String Char= "";//要显示的字符序号
void setup() {
// start serial port at 9600 bps and wait for port to open:
Serial.begin(38400);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
mylcd.Init_LCD();
Serial.println(mylcd.Read_ID(), HEX);
mylcd.Set_Text_Mode(1); //设置显示模式
mylcd.Fill_Screen(BLACK); //刷成黑屏
mylcd.Set_Text_Back_colour(BLACK);//设置背景色
mylcd.Set_Rotation(1);//设置显示方向
}
void loop() {
// if we get a valid byte, read analog ins:
while (Serial.available() > 0)
{
comdata += char(Serial.read());
delay(1);
}
if(comdata.length() >= 6)//收满了统一处理//还是6个字节,留最后一个字节待用
{
if(comdata[0]==0x50)//要显示的是文字:
{
Size=comdata[1]>>4;//右移4位
color= comdata[1]&0x0f;
x=comdata[2];
y=comdata[3];
Char += char(comdata[4]);
backcolor=comdata[5];
view=1;//录入完数据,开显示
Serial.println(0xff);
}
//待补充其余显示变量,首字节不同,显示内容也不同
comdata = "";//收满5个都请一次
}
if(view==1)//如果有值要显示的话:
{
switch(color)//选择画笔颜色(支持16色)
{
case 0:mylcd.Set_Text_colour(0X01CF);break;
case 1:mylcd.Set_Text_colour(BLACK);break;
case 2:mylcd.Set_Text_colour(RED);break;
case 3:mylcd.Set_Text_colour(BLUE);break;
case 4:mylcd.Set_Text_colour(GREEN);break;
case 5:mylcd.Set_Text_colour(CYAN);break;
case 6:mylcd.Set_Text_colour(MAGENTA);break;
case 7:mylcd.Set_Text_colour(WHITE);break;
case 8:mylcd.Set_Text_colour(YELLOW);break;
case 9:mylcd.Set_Text_colour(0X7D7C);break;
case 10:mylcd.Set_Text_colour(0X5458);break;
case 11:mylcd.Set_Text_colour(0XBC40);break;
case 12:mylcd.Set_Text_colour(0XFC07);break;
case 13:mylcd.Set_Text_colour(0X8430);break;
case 14:mylcd.Set_Text_colour(0X841F);break;
case 15:mylcd.Set_Text_colour(0X2B12);break;
}
mylcd.Set_Text_Size(Size);//字符大小,最大值为7
mylcd.Print_String(Char, x, y);//打印一个字符
Char = "";
view=0;//显示完一次,清零
}
}
该程序实现了在波特率38400下,arduino读取一个6位字符串,并在屏幕指定位置显示一个指定字号颜色的指定字符的功能,有剩余数据容量,等待二次开发时拓展。
这篇是保姆级教程,所以还有一些信息要补充完整:
代码开头的两个头文件,属于屏幕自带的两个文件,获取方法请上淘宝搜索
2.4寸 TFT屏幕 在店铺给的资料里,找到这个屏幕的官网下载arduino的库即可
之后请参考arduino手动添加库教程,将两个屏幕库加入到arduino库中,即可编译上方代码烧录
串口格式如下:
1位 :起始位,0x50表示显示字符 (虽然现在也只能显示字符)
2位 : 大小及颜色位,高4位大小(1-7)低4位颜色
3,4位: XY坐标值
5位 :要显示的字符
6位 :待用
最后谈一谈做这个东西的意义:
其实是挺无厘头的一个想法。。。。。。。真的是因为没有经费买串口屏了
算一下帐的话,这一套其实和淘宝最便宜的串口屏相差不多。。。。(我记得是27元)
唯一的一点优势可能就是和单片机对接的便捷性,因为显示命令可以做的很好理解,做产品应该不会用(因为本身特点限制了不能做非常好看的效果),但在比赛或者需要提升速度的场合,这个特点还是很有用的。
会一直更新,有兴趣的来个关注吧
(bug:这一版代码刷新字符会有叠加现象。。。。。这个库属实有问题
待解决。。。。。。。。。。
应该在刷新字符之前,先对应字符大小刷一个长方形底色,再刷数字
)