极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: apachectl

Arduino只用一根信号线驱动Usart-GPU串口液晶屏

[复制链接]
 楼主| 发表于 2014-10-8 13:18:24 | 显示全部楼层
新版本,在内测,说明还没写,可以试验下:

http://stm32.sinaapp.com/gpu22b/index1.php

命令简介:

m为0~3 的数字

//BPIC(m,x,y,n);        标记m背景图为n号图,在x,y处显示
PS24(m,x,y,‘阿斯达’,c);在m图上叠加显示汉字,要求字体必须在背景图中,全包围
//PS32(m,x,y,‘阿斯达’,c);在m图上叠加显示汉字,要求字体必须在背景图中,全包围
//PS48(m,x,y,‘阿斯达’,c);在m图上叠加显示汉字,要求字体必须在背景图中,全包围
//PS64(m,x,y,‘阿斯达’,c);在m图上叠加显示汉字,要求字体必须在背景图中,全包围
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-8 13:20:14 | 显示全部楼层
hubertdong 发表于 2014-10-7 10:59
用DS18B20测温,显示

可以加一副背景图,比如有温度计的图形,中间的水银柱可以用BOXF 语句画出,效果就比这个好看多了
回复 支持 反对

使用道具 举报

发表于 2014-10-8 16:27:43 | 显示全部楼层
apachectl 发表于 2014-10-8 13:11
生产周期很长,烧写程序和MEM需要几天,PCB生产需要2周,贴片厂排队2周,回来焊屏,测试,粘,测试,装 ...

无问题的, 我只是发点唠骚吧了.  用上了几天, 也给它写了个库, 已经取代了我原来的TFT 监察器, 正在使用中了,




但有些地方不知是否可以改善.
1) 每当发出指令後, 虽然 delay 一段时间, 否则会可以遗失部份指令, 甚至出错.  初时跟你的提议, 在发出一串指令後, delay 200~300 ms, 但会令画面更新速度降至 3-4 fps, 而且没有保障.  由於我是用作监察之用, 要在画面中不断更新当前状况, 对於 16Mhz 的 系统, 那 200ms 的延误己不可接受了.  现在只好把 RX 也连上, 每次发出指令後等待回复, 一般如指令不多, 50ms 以内已可以完成.  但就要多插一根线了.  如果可以有其他方法, 用一根线也可安全发捷地发送指令就最好了.

2) 在更新 DS24 或以上的字库时, 每次都会把所有字型一同更新, 由於我的电脑并没有你的字库, 结果某些字型更新後就没有了.  但更新字库的版面, 好像不能删去其中一行, 结果被逼把垃圾也要储存.  请问是否可以单独更新其中一行, 又或删除已储在的.

可以加入新功能, 刚去图中 1-8 的字型吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-10-8 16:38:17 | 显示全部楼层
apachectl 发表于 2014-10-8 13:11
生产周期很长,烧写程序和MEM需要几天,PCB生产需要2周,贴片厂排队2周,回来焊屏,测试,粘,测试,装 ...


想再补充一点, 有关内码和字体的问题, 程式本身不可以支持不同内码的 (对程式而言, 也只是几个 byte), 所以我其实还可以用到的, 只是版面上的字, 看不到. 见下图, 繁体的国字也可以用到的.



所以, 只要更改了画面上的按键及选单的字, 已经可以变成不同语言版本了.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-10-9 23:25:01 | 显示全部楼层
本帖最后由 504835618 于 2014-10-10 11:26 编辑

也用3.5寸串口屏做了个时钟,上图看看效果,基本实现了每天自动换图片功能,下步准备用网络模块读取天气支持天气图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-10-11 17:05:54 | 显示全部楼层
hubertdong 发表于 2014-10-7 11:01
电池电压测量用的LTC2400,未贴上来。

int CS=11;
int SDO=12;
int SCK1=13;
void setup() {
  Serial.begin(115200);
   while (!Serial) {  }
   pinMode(SDO, INPUT);
   pinMode(CS,OUTPUT);
   pinMode(SCK1,OUTPUT);
   
  }

long ad_value=0;   //定义转化的值
void LTC2400(void)
{
    char SIG=0;        //定义符号位
    char i=0;
        digitalWrite(CS,HIGH);      //禁止SPI                          
        digitalWrite(SCK1,LOW);      //SCK=0;            //初始化时钟
        delay(1);
        digitalWrite(CS,LOW);
        ad_value=0;       
        while(digitalRead(SDO));                  //转换结束标志位
        digitalWrite(SCK1,HIGH);digitalWrite(SCK1,LOW);//SCK=1;SCK=0;         //第一位数据不要
        digitalWrite(SCK1,HIGH);digitalWrite(SCK1,LOW);//SCK=1;SCK=0;         //第二位数据不要
        digitalWrite(SCK1,HIGH);SIG=digitalRead(SDO);digitalWrite(SCK1,LOW);//SCK=1;SIG=SDO;SCK=0; //读取符号位
        digitalWrite(SCK1,HIGH);digitalWrite(SCK1,LOW);//SCK=1;SCK=0;         //第三位数据不要       
        for(i=0; i<24; i++)       //读取24位数据
        {
                digitalWrite(SCK1,HIGH);//SCK=1;                                
                if(digitalRead(SDO))
                ad_value |= 0x00000001;//如果为正数,加一
                else
                ad_value &= 0xfffffffe;//如果为负数,加零
                digitalWrite(SCK1,LOW);//SCK=0;                       
                ad_value <<= 1;               
        }       
        ad_value >>= 1;       
        digitalWrite(CS,HIGH);//CS=1;
}   
回复 支持 反对

使用道具 举报

发表于 2014-10-11 17:14:56 | 显示全部楼层
当然,你也可以用宏定义:
#define SCK_H digitalWrite(SCK1,HIGH);
......
回复 支持 反对

使用道具 举报

发表于 2014-10-14 09:39:21 | 显示全部楼层
504835618 发表于 2014-10-9 23:25
也用3.5寸串口屏做了个时钟,上图看看效果,基本实现了每天自动换图片功能,下步准备用网络模块读取天气支持 ...

您好,能否指点一下每天换图片的语句用法吗?我使用了Serial.print("PIC(0,180,1");这样的语句,结果图片“1”可以显示,但是没有“星期......”这个显示了,
回复 支持 反对

使用道具 举报

发表于 2014-10-14 14:16:02 | 显示全部楼层
本帖最后由 504835618 于 2014-10-14 14:17 编辑
yuqingshan 发表于 2014-10-14 09:39
您好,能否指点一下每天换图片的语句用法吗?我使用了Serial.print("PIC(0,180,1");这样的语句,结果图片 ...

更新到最新固件,保持图片大小不要超过文字坐标
看源程序,星期在前,图片在后,在之间加延时
比如:Serial1.print("DS24(15,145,'");Serial1.print(hz[7]);Serial1.println("',7);");
delay(10);
Serial1.print("PIC(0,220,3)");
这样试试看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-16 12:54:55 | 显示全部楼层
504835618 发表于 2014-10-14 14:16
更新到最新固件,保持图片大小不要超过文字坐标
看源程序,星期在前,图片在后,在之间加延时
比如:Se ...

缓存区有1K 长度,多个命令组合起来不超1K,就可以不停的print,最后再加一个println 就可以了显示了,这样中间不用延时
回复 支持 反对

使用道具 举报

发表于 2014-10-16 12:57:49 | 显示全部楼层
apachectl 发表于 2014-10-16 12:54
缓存区有1K 长度,多个命令组合起来不超1K,就可以不停的print,最后再加一个println 就可以了显示了,这样 ...

已修改为 Serial1.print("DS24(15,145,'");Serial1.print(hz[5]);Serial1.print("',13);");
         Serial1.print("PIC(0,220,3);\r\n");
试了下可以换,看今天0点对不对了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-20 13:09:52 | 显示全部楼层
本帖最后由 apachectl 于 2014-10-20 13:12 编辑

十一、        程序框架与编程思路
见到很多用户写的程序,以及咨询的问题,所以增加此节来详细讲解串口屏的编程思路;
首先,串口屏不是一般的TFT显示屏,一般的显示屏需要自己一个点一个点的操作屏显,因此需要讲各种应用写出函数,然后再调用函数,这样操作难度非常大,需要了解硬件资源以及各种显示技巧,需要非常高速的MCU,优点当然是MCU与屏的通讯带宽很高,可以做大幅度的实时显示;但是分析常用的界面,其实实时高速显示并非单片机常用的需求;
比如,作为仪表显示,实际刷新速度,最快也就是1秒3次左右,再快人眼也反映不过来,因此,串口屏的优势就出来了,串口屏的特点是:功能封装,调用简单,但传输带宽小
因此,请把需要显示的界面分成固定的与需要刷新的,如Arduino的编程思想一样,讲每个界面都分成setup()和loop() 两个结构,再setup中完成界面以及各个变量的初始化,再loop()中循环刷新显示测量的数据;
由于串口屏有1K的传输缓存区,因此最好每个结构中调用串口屏可以将语句陆续传出,不传最后的0D 0A,串口屏就不会执行,然后最后传一个 0D 0A 就可以一下显示出来,一点都不拖泥带水;
比如本屏带的示例:1~6S的锂电池电压显示仪中的代码:
http://pan.baidu.com/share/link?shareid=2710107915&uk=3204894695

主函数:
  1. int main(void)
  2. {       
  3.         system_init(); //系统初始化GPIO,串口等与硬件有关的
  4.         Delayms(200000);//延时200ms,等待串口屏确保启动
  5.         setup();//显示背景界面

  6.         while(1)
  7.         {        loop(); //显示每次刷新测试的值
  8.        
  9.         }
  10. }

复制代码
可以看到,主函数中,构造出来类似arduino一样的setup与loop结构

Setup程序:
  1. void setup(void)
  2. {        GpuSend("DR2;CLS(0);DS24(4,0,'锂电池电压',1);DS24(160,0,'总电压:',4);BOX(0,30,319,130,11);\r\n");
  3.         Delayms(200000);
  4. }
复制代码
固定显示一些内容,延时200ms;如果显示的固定信息比较复杂,建议使用批页面显示,每个批页面可存储1K语句,一个批页面不够时,可以在批页面最后一个语句使用SPG(下一个批页面号);讲批页面级连起来完成负载的页面显示;

Loop程序:
  1. void loop(void)
  2. {                u8 i,y,c;
  3.                 u16 x1,x2;
  4.                 CompADC();
  5.                 CompVol();
  6.                 CompLi();
  7.                 CompCellPer();
  8.                 min=12;max=0;argv=0;
  9.                 js=0;
  10.                 for (i=0;i<6;i++)
  11.                 {        if (Li[i]>1)
  12.                         {        argv+=Li[i];
  13.                                 js++;       
  14.                                 if (Li[i]<=min) min=Li[i];
  15.                                 if (Li[i]>max) max=Li[i];
  16.                         }
  17.                 }
  18.                 argv=argv/js;
  19.                 for (i=0;i<6;i++)
  20.                 {        x1=i*54+10;x2=x1+30;
  21.                         if (Li[i]>1)
  22.                         {        sprintf(buf,"ICON(%d,165,1,11,1,%d);DS16(%d,224,'%.2f',4);",54*i,CellPer[i],54*i+4,Li[i]);
  23.                                 GpuSend(buf);
  24.                                 y=(Li[i]-argv)*100;
  25.                                 y=80-y;
  26.                                 c=2;
  27.                                 if (y>130) {y=130;c=1;};
  28.                                 if (y<30) {y=30;c=1;};
  29.                                 sprintf(buf,"BOXF(%d,31,%d,%d,0);BOXF(%d,%d,%d,129,%d);",x1,x2,y,x1,y,x2,c);
  30.                                 GpuSend(buf);
  31.                         }
  32.                         else
  33.                         {        sprintf(buf,"ICON(%d,165,1,11,1,10);DS16(%d,224,' --- ',4);BOXF(%d,31,%d,79,0);BOXF(%d,81,%d,129,0);",54*i,54*i+4,x1,x2,x1,x2);
  34.                                 GpuSend(buf);
  35.                                
  36.                         }
  37.                 }
  38.                 sprintf(buf,"DS24(240,0,'%.2f',4);",LV[js-1]);
  39.                 GpuSend(buf);
  40.                 GpuSend("PL(0,80,320,80,11);\r\n");
  41.                 Delayms(1000000);
  42. }
复制代码
Loop 程序比较复杂,通过AD测量的值,决定各个图标以及柱状图的显示颜色和比例,这些都不用管,重要的是每个GpuSend后面都不带0d 0a,直到最后一条GpuSend语句才发送0d 0a,发送后延时1秒,这样确保显示连贯,不闪烁,且1s刷新一次测量值,效果很好;

============================================
Arduino的控制可以参考下
回复 支持 反对

使用道具 举报

发表于 2014-10-22 20:32:08 | 显示全部楼层
本帖最后由 504835618 于 2014-10-22 20:33 编辑

一直都在用你的串口屏,对于我们这些小白,,跟到例子学还可以,深了就不行了,建议多点例子,这样小白门就可以在学习中,找到自已喜欢的东西,也就可以根据例子做些自已喜欢的东西,我用你的串口屏,最得意的就是做了一个DS3231时钟,只要有ARDUINO用到串口输出的例子,或者好的应用程序用你的这个串口屏就可以做出一个比较实用的东西,希望AP老大能写更多的例子,服务小白们,必定懂或能单独编程的是少数,有了一些例子小白门就有更多的参考,慢慢就有提高,也可能做出更好的东西,在这里再次谢谢AP老大给我吗提供了这样好的东西,谢谢!!
回复 支持 反对

使用道具 举报

发表于 2014-10-22 20:37:46 | 显示全部楼层
在这里强烈推荐大家试用AP老大的串口屏淘宝地址:http://item.taobao.com/item.htm?id=41397487432小白的最爱
回复 支持 反对

使用道具 举报

发表于 2014-10-22 21:05:22 | 显示全部楼层
期望出640x480的屏!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 21:49 , Processed in 0.050567 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表