新版本,在内测,说明还没写,可以试验下:
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图上叠加显示汉字,要求字体必须在背景图中,全包围
hubertdong 发表于 2014-10-7 10:59 static/image/common/back.gif
用DS18B20测温,显示
可以加一副背景图,比如有温度计的图形,中间的水银柱可以用BOXF 语句画出,效果就比这个好看多了
apachectl 发表于 2014-10-8 13:11 static/image/common/back.gif
生产周期很长,烧写程序和MEM需要几天,PCB生产需要2周,贴片厂排队2周,回来焊屏,测试,粘,测试,装 ...
无问题的, 我只是发点唠骚吧了.用上了几天, 也给它写了个库, 已经取代了我原来的TFT 监察器, 正在使用中了,
但有些地方不知是否可以改善.
1) 每当发出指令後, 虽然 delay 一段时间, 否则会可以遗失部份指令, 甚至出错.初时跟你的提议, 在发出一串指令後, delay 200~300 ms, 但会令画面更新速度降至 3-4 fps, 而且没有保障.由於我是用作监察之用, 要在画面中不断更新当前状况, 对於 16Mhz 的 系统, 那 200ms 的延误己不可接受了.现在只好把 RX 也连上, 每次发出指令後等待回复, 一般如指令不多, 50ms 以内已可以完成.但就要多插一根线了.如果可以有其他方法, 用一根线也可安全发捷地发送指令就最好了.
2) 在更新 DS24 或以上的字库时, 每次都会把所有字型一同更新, 由於我的电脑并没有你的字库, 结果某些字型更新後就没有了.但更新字库的版面, 好像不能删去其中一行, 结果被逼把垃圾也要储存.请问是否可以单独更新其中一行, 又或删除已储在的.
可以加入新功能, 刚去图中 1-8 的字型吗?
apachectl 发表于 2014-10-8 13:11 static/image/common/back.gif
生产周期很长,烧写程序和MEM需要几天,PCB生产需要2周,贴片厂排队2周,回来焊屏,测试,粘,测试,装 ...
想再补充一点, 有关内码和字体的问题, 程式本身不可以支持不同内码的 (对程式而言, 也只是几个 byte), 所以我其实还可以用到的, 只是版面上的字, 看不到. 见下图, 繁体的国字也可以用到的.
所以, 只要更改了画面上的按键及选单的字, 已经可以变成不同语言版本了.
本帖最后由 504835618 于 2014-10-10 11:26 编辑
也用3.5寸串口屏做了个时钟,上图看看效果,基本实现了每天自动换图片功能,下步准备用网络模块读取天气支持天气图片
hubertdong 发表于 2014-10-7 11:01 static/image/common/back.gif
电池电压测量用的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;
}
当然,你也可以用宏定义:
#define SCK_H digitalWrite(SCK1,HIGH);
......
504835618 发表于 2014-10-9 23:25 static/image/common/back.gif
也用3.5寸串口屏做了个时钟,上图看看效果,基本实现了每天自动换图片功能,下步准备用网络模块读取天气支持 ...
您好,能否指点一下每天换图片的语句用法吗?我使用了Serial.print("PIC(0,180,1");这样的语句,结果图片“1”可以显示,但是没有“星期......”这个显示了,
本帖最后由 504835618 于 2014-10-14 14:17 编辑
yuqingshan 发表于 2014-10-14 09:39 static/image/common/back.gif
您好,能否指点一下每天换图片的语句用法吗?我使用了Serial.print("PIC(0,180,1");这样的语句,结果图片 ...
更新到最新固件,保持图片大小不要超过文字坐标
看源程序,星期在前,图片在后,在之间加延时
比如:Serial1.print("DS24(15,145,'");Serial1.print(hz);Serial1.println("',7);");
delay(10);
Serial1.print("PIC(0,220,3)");
这样试试看
504835618 发表于 2014-10-14 14:16 static/image/common/back.gif
更新到最新固件,保持图片大小不要超过文字坐标
看源程序,星期在前,图片在后,在之间加延时
比如:Se ...
缓存区有1K 长度,多个命令组合起来不超1K,就可以不停的print,最后再加一个println 就可以了显示了,这样中间不用延时
apachectl 发表于 2014-10-16 12:54 static/image/common/back.gif
缓存区有1K 长度,多个命令组合起来不超1K,就可以不停的print,最后再加一个println 就可以了显示了,这样 ...
已修改为 Serial1.print("DS24(15,145,'");Serial1.print(hz);Serial1.print("',13);");
Serial1.print("PIC(0,220,3);\r\n");
试了下可以换,看今天0点对不对了
本帖最后由 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
主函数:int main(void)
{
system_init(); //系统初始化GPIO,串口等与硬件有关的
Delayms(200000);//延时200ms,等待串口屏确保启动
setup();//显示背景界面
while(1)
{ loop(); //显示每次刷新测试的值
}
}
可以看到,主函数中,构造出来类似arduino一样的setup与loop结构
Setup程序:void setup(void)
{ GpuSend("DR2;CLS(0);DS24(4,0,'锂电池电压',1);DS24(160,0,'总电压:',4);BOX(0,30,319,130,11);\r\n");
Delayms(200000);
}
固定显示一些内容,延时200ms;如果显示的固定信息比较复杂,建议使用批页面显示,每个批页面可存储1K语句,一个批页面不够时,可以在批页面最后一个语句使用SPG(下一个批页面号);讲批页面级连起来完成负载的页面显示;
Loop程序:void loop(void)
{ u8 i,y,c;
u16 x1,x2;
CompADC();
CompVol();
CompLi();
CompCellPer();
min=12;max=0;argv=0;
js=0;
for (i=0;i<6;i++)
{ if (Li>1)
{ argv+=Li;
js++;
if (Li<=min) min=Li;
if (Li>max) max=Li;
}
}
argv=argv/js;
for (i=0;i<6;i++)
{ x1=i*54+10;x2=x1+30;
if (Li>1)
{ sprintf(buf,"ICON(%d,165,1,11,1,%d);DS16(%d,224,'%.2f',4);",54*i,CellPer,54*i+4,Li);
GpuSend(buf);
y=(Li-argv)*100;
y=80-y;
c=2;
if (y>130) {y=130;c=1;};
if (y<30) {y=30;c=1;};
sprintf(buf,"BOXF(%d,31,%d,%d,0);BOXF(%d,%d,%d,129,%d);",x1,x2,y,x1,y,x2,c);
GpuSend(buf);
}
else
{ 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);
GpuSend(buf);
}
}
sprintf(buf,"DS24(240,0,'%.2f',4);",LV);
GpuSend(buf);
GpuSend("PL(0,80,320,80,11);\r\n");
Delayms(1000000);
}
Loop 程序比较复杂,通过AD测量的值,决定各个图标以及柱状图的显示颜色和比例,这些都不用管,重要的是每个GpuSend后面都不带0d 0a,直到最后一条GpuSend语句才发送0d 0a,发送后延时1秒,这样确保显示连贯,不闪烁,且1s刷新一次测量值,效果很好;
============================================
Arduino的控制可以参考下
本帖最后由 504835618 于 2014-10-22 20:33 编辑
一直都在用你的串口屏,对于我们这些小白,,跟到例子学还可以,深了就不行了,建议多点例子,这样小白门就可以在学习中,找到自已喜欢的东西,也就可以根据例子做些自已喜欢的东西,我用你的串口屏,最得意的就是做了一个DS3231时钟,只要有ARDUINO用到串口输出的例子,或者好的应用程序用你的这个串口屏就可以做出一个比较实用的东西,希望AP老大能写更多的例子,服务小白们,必定懂或能单独编程的是少数,有了一些例子小白门就有更多的参考,慢慢就有提高,也可能做出更好的东西,在这里再次谢谢AP老大给我吗提供了这样好的东西,谢谢!!
在这里强烈推荐大家试用AP老大的串口屏淘宝地址:http://item.taobao.com/item.htm?id=41397487432小白的最爱
期望出640x480的屏!!!