|
楼主 |
发表于 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
主函数:- 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[i]>1)
- { argv+=Li[i];
- js++;
- if (Li[i]<=min) min=Li[i];
- if (Li[i]>max) max=Li[i];
- }
- }
- argv=argv/js;
- for (i=0;i<6;i++)
- { x1=i*54+10;x2=x1+30;
- if (Li[i]>1)
- { sprintf(buf,"ICON(%d,165,1,11,1,%d);DS16(%d,224,'%.2f',4);",54*i,CellPer[i],54*i+4,Li[i]);
- GpuSend(buf);
- y=(Li[i]-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[js-1]);
- GpuSend(buf);
- GpuSend("PL(0,80,320,80,11);\r\n");
- Delayms(1000000);
- }
复制代码 Loop 程序比较复杂,通过AD测量的值,决定各个图标以及柱状图的显示颜色和比例,这些都不用管,重要的是每个GpuSend后面都不带0d 0a,直到最后一条GpuSend语句才发送0d 0a,发送后延时1秒,这样确保显示连贯,不闪烁,且1s刷新一次测量值,效果很好;
============================================
Arduino的控制可以参考下 |
|