使用COF屏实现速度仪表盘和显示AD数值
作者:大信 8125036
此次分享一个使用 COF智能屏实现速度仪表盘的案例。这个利用这个仪表盘分别实现由串口传入速度值并显示的例子 和 采集COF屏上AD数值并通过仪表显示的例子。
首先使用 DGUS 设计仪表盘面板,仪表盘面板设计如图1,界面主要有1.一张最大140迈的跑车仪表盘底图;2。仪表盘上方的显示速度数据变量显示组件;3.中间图表旋转组件;4.下方的总里程数据变量显示组件。
图1 仪表盘DGUS设计
也为对比测试数据显示效果,其中速度数据显示和里程数据显示分别采用不同的字体,来对比看一下。速度显示组件的设置如图2。设置速度值变量的地址是 0x5082, 颜色 #FFFFFF ,字库15号文件位,字体大小为24点阵,这个点阵也是制作字库时设置的大小,如果两边一不知,将会出现花屏。居中显示,2字节整数,最长6个数字,初始值设为1。
图2 速度显示组件的设置
速度数据显示使用了外部自定义字库,为了显示风格,特意选用数码管字库,字库制作使用TS4.exe工具,因为只显示数字,则使用 ASICII编码,字体使用 digital-7-italic 字体,这个字体在网上很容易找到。在制作字体时要注意调节横向和纵向偏移保证字体能顾完整的显示出来。选择24点阵大小,然后预览各个字符都能显示后,点生成。即可得到 15_led_asic_24.DZK 字库文件,因为只有数字和英文字符,可以看到字库文件体积很小。
图3 制作digital-7风格字库
指针使用图设计一个正方形的图片,中间放置指针图标,图片大小为320x320,jiemia表旋转指示组件,其设置如图4所示,图标打包进23号文件,在文件这里选择23号,图标ID 选择内部的编号6,图标中心则通过测量图标的旋转中心点坐标填入,如果坐标不准确,那么指针旋转起来就会出现跑偏。旋转组件的每次旋转角度为0.5度为一个单位,那么根据这个底图上的刻度范围可以计算出指针旋转的角度为,255度,则组件里开始旋转与中止旋转角度分别填入0 和 510,变量值则根据业务而定,这里根据面板上的量程显示,故设定为0到280。即,变量为280时角度为255度。另外这里的变量地址和上面的数据显示组件使用同一个地址,这样指针转动的角度所对应的值就可以很直观的看到。
图4 图表旋转指示空间设置
下方的里程数据显示组件设置如图5所示,这里使用另外一个16级灰度字库16号字库。其它设置跟速度显示组件一样。
图5 变量数值显示组件设置
16级灰度字库使用DGUS的16级灰度字库生成工具制作,如图6,在16号字体处,选择 digital-7-italic ,调整纵向坐标40点阵,然后点生成,则得到 16_digtail_asic_16type.bin 16级灰度字体,16级灰度字体文件相比上面的字库体积要大一些,16级灰度字体可以很好的抗锯齿,字体显示光滑。
图6 制作16级灰度字库
界面设计完毕,进行打包生成烧写文件,烧写到屏里,界面显示效果如图7所示。
图7 UI在屏上显示效果
接下来就是相关软件的开发了,这个软件首先测试由串口发送数据到0x5082地址,通过连续发送的方式修改改地址的值,达到旋转指针的目标。这里通过另外一个MCU做上位机通过串口向COF屏发送串口指令,上位机程序如下:
- int uart_output(char *send_dat, unsigned short len)
- {
- unsigned short i;
- printf( " send:");
- for(i=0; i
- {
- printf( "%.2X ", send_dat[i] );
- }
- printf("n");
- tls_uart_write(TLS_UART_1, send_dat, len); /* output */
- return len;
- }
- //向COF屏发送读地址数据
- int read_t5l_data(short addr, short len)
- {
- char send[128]={0};
- send[0]=0x5A;
- send[1]=0xA5;
- send[2]=0x04;
- send[3]=0x83;
- send[4]= (addr & 0xff00) >> 8;
- send[5]= (addr & 0xff);
- send[6]= (len & 0xff);
- uart_output(send,7); //向上位机返回,此处可以改成本地处理,加入业务流程
- return 0;
- }
- //向COF屏发送写地址数据
- int write_t5l_data(short addr, short* data, short len)
- {
- char send[128]={0};
- unsigned short out_len;
- int i,j;
- send[0]=0x5A;
- send[1]=0xA5;
- send[2]=0x00;
- send[3]=0x82;
- send[4]= (addr & 0xff00) >> 8;
- send[5]= (addr & 0xff);
- for(i=0,j=0; j
- {
- send[6+i]= (data[j] & 0xff00) >> 8;
- i++;
- send[6+i]= (data[j] & 0xff);
- }
- send[2] = 3+i;
- out_len = 6+i;
- uart_output(send,out_len);
- return 0;
- }
- //测试命令处理
- int command(char *cmd_str)
- {
- int i=0;
- char* token;
- short mileval;
- short svalue;
- printf( "uart1 command: %sn",cmd_str );
- token = strstr(cmd_str,"set_speed"); //发送速度值
- if(token != NULL)
- {
- mileval = 1;
- for(i=0; i<280; i++)
- {
- write_t5l_data(0x5082,&mileval,1);
- tls_os_time_delay(10);
- mileval++;
- }
-
- }
- token = strstr(cmd_str,"set_mile"); //发送里程数
- if(token != NULL)
- {
- mileval = 12345;
- for(i=0; i<240; i++)
- {
- write_t5l_data(0x50A0,&mileval,1);
- tls_os_time_delay(10);
- mileval+=87;
- }
- }
- return 0;
- }
COF屏51 C代码程序如下:
- void Function_All(void)
- {
- u32 tmp;
- u16 V1[8];
- adtime++;
- if(adtime%100==0)
- {
- V1[0] = Read_Dgus(0x50b0);
- if(V1[0]==0x2022)
- {
- tmp = (u32) Read_Dgus(0x0033);
- V1[1] = (u16) (tmp / 167);
- Write_Dgus( 0x5082,V1[1]);
- }
- }
- }
这里使用一个空闲的地址,来做一个功能的切换,即读取 0x50b0地址,当0x50b0地址内的值等于0x2022时,此时将读取采集 AD1 的数据,并转化为0~280范围的数值,并写入仪表指针的地址0x5082内。 当0x50b0不为0x2022时,此时讲由外部,也就是串口传入的命令来修改。这样就可以完成两个不同的测试,最后测试效果分别见两个视频。此项目代码工程打包附带在文件附件里,有需要的朋友可以自取。