——文档转载自电子发烧友
此次分享使用COF智能屏实现速度仪表盘的案例,该案例利用仪表盘分别实现由串口传入速度值并显示功能、采集COF屏上AD数值并通过仪表显示功能。
1.DGUS开发
(1)首先使用DGUS 设计仪表盘面板,仪表盘面板设计如图1。
图1 仪表盘DGUS设计
(2)速度数据显示和里程数据显示分别采用不同的字体,用于对比数据效果,速度显示组件的设置如图2。
图2 速度显示组件的设置
(3)速度数据显示使用了外部自定义字库,为了显示风格,特意选用数码管字库。字库制作使用TS4.exe工具,因为只显示数字,则使用 ASICII编码,字体使用digital-7-italic 字体,这个字体在网上很容易找到,风格字库设置如图3。
图3 制作digital-7风格字库
(4)指针使用图设计一个正方形的图片,中间放置指针图标,图片大小为320x320,旋转指示组件设置如图4所示。
图4 图表旋转指示空间设置
(5)下方的里程数据显示组件设置如图5所示,这里使用另外一个16级灰度字库16号字库。其它设置跟速度显示组件一样。
图5 变量数值显示组件设置
(6)16级灰度字库使用DGUS的16级灰度字库生成工具制作,设置如图6。
图6 制作16级灰度字库
(7)界面显示效果如图7所示。
图7 UI在屏上显示效果
2.软件开发 接下来就是相关软件的开发了,这个软件首先测试由串口发送数据到0x5082地址,通过连续发送的方式修改改地址的值,达到旋转指针的目标。这里通过另外一个MCU做上位机通过串口向COF屏发送串口指令,上位机程序如下:
int uart_output(char *send_dat, unsigned short len) { unsigned short i; printf( " send:"); for(i=0; i<len; i++) { printf( "%.2X ", send_dat ); } 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<len; i++,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: %s\n",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时,此时讲由外部,也就是串口传入的命令来修改。这样就可以完成两个不同的测试,最后测试效果分别见两个视频。此项目代码工程打包附带在文件附件里,有需要的朋友可以自取。
|