迪文智能屏
直播中

W丶Sir

7年用户 9经验值
擅长:电源/新能源 控制/MCU
私信 关注

【迪文COF结构智能屏试用体验】+简易示波器

本帖最后由 W丶Sir 于 2022-3-30 23:44 编辑

因为平时喜欢在家里折腾一些小玩意,但是没有示波器就会很不方便,当看到迪文推出了COF屏试用体验时,就想着做一个简易示波器。
下面直接开始分享我的开发过程。
1.主要界面
经过很多次调整最终确定了这一版的界面,还是暗色调的界面符合示波器的气质。
0_主界面.png
图1.启动界面

1_A-CH1.png
图2.单通道波形显示

7_ALL-CH.png
图3.多通道波形显示

2.DGUS设计
通过基础触控可以轻松的实现界面直接的跳转。
图片1.png 图片2.png
图4.启动界面设计

按键功能的实现是通过“按键返回”控件实现的,设置键值和变量地址后,当触控按键被按下时,键值就会填充到变量地址对应的存储空间内,方便通过C语言进行访问。这里我尝试了“按字写入变量”和“位控制”两种方式,按位控制可以将多个按键的状态存放在一个变量里,大大减少了存储空间的占用,但是这样也有弊端,再C语言处理按键动作时,需要对按键的对应的bit进行复位,这会加大代码上的实现难度。按字写入变量整体上会便的简单许多,只需要判断地址上是不是指定的键值即可。地址和键值可以自由设定,实现很多功能。
图片3.png 图片4.png
图5.按键设计

这里我设置了居中对齐,但是最终效果还是左对齐,可能还有某个地方设置的不对。
图片5.png 图片6.png
图6.数值显示设计


“动态曲线”控件实现曲线显示时遭遇了一些困难,开发工具上的配置项在大面积显示曲线时不太灵活,给大家分享以下经过一些尝试后我的做法。曲线显示时Y_Central和VD_Central配置成0和65535,这样可以让数据范围变得很大,纵轴放大倍数建议设置成2,设置为1时数据范围只能覆盖屏幕的一部分,设置为2可以覆盖到屏幕外,这是可以通过代码处理波形数据,让波形的变化便的非常灵活。
六个通道我使用的是1到6号数据源通道,我把0号留给了显示和触控变量。
描述指针在官方文档中有给出设定范围,通过描述指针开发者可以对控件的配置信息在线修改。
图片7.png 图片8.png
图7.曲线显示设计


图片9.png
图8.字库设置




3.一些代码
  1. void key_operate( void )
  2. {
  3.         static unsigned char index_cnt = 0;

  4.         if( buff.word_t[ index_cnt*8 + 6 ] == 0xAAAA ) /* time - */
  5.         {
  6.                 sys_write_vp( (0x100C + index_cnt*8 + 0) , def_byte_t , 1 );
  7.                
  8.                 if( operate.word_t[ index_cnt*3 + 0 ] > 1 )
  9.                 {
  10.                         operate.word_t[ index_cnt*3 + 0 ] --;
  11.                         
  12.                         sys_write_vp( (0x1400 + index_cnt*3 + 0) , &(operate.byte_t[ (index_cnt*3 + 0)*2 ]) , 1 );

  13.                         set[0] = (unsigned char)(index_cnt+1);
  14.                         set[1] = (unsigned char)operate.word_t[ index_cnt*3 + 0 ];
  15.                         sys_write_vp( (0x5000 + index_cnt*256 + 9) , set , 1 );
  16.                 }
  17.         }

  18.         if( buff.word_t[ index_cnt*8 + 7 ] == 0xAAAA ) /* time + */
  19.         {
  20.                 sys_write_vp( (0x100C + index_cnt*8 + 1) , def_byte_t , 1 );
  21.                
  22.                 if( operate.word_t[ index_cnt*3 + 0 ] < 255 )
  23.                 {
  24.                         operate.word_t[ index_cnt*3 + 0 ] ++;
  25.                         
  26.                         sys_write_vp( (0x1400 + index_cnt*3 + 0) , &(operate.byte_t[ (index_cnt*3 + 0)*2 ]) , 1 );

  27.                         set[0] = (unsigned char)(index_cnt+1);
  28.                         set[1] = (unsigned char)operate.word_t[ index_cnt*3 + 0 ];
  29.                         sys_write_vp( (0x5000 + index_cnt*256 + 9) , set , 1 );
  30.                 }
  31.         }

  32.         if( buff.word_t[ index_cnt*8 + 8 ] == 0xAAAA ) /* amp - */
  33.         {
  34.                 sys_write_vp( (0x100C + index_cnt*8 + 2) , def_byte_t , 1 );
  35.                
  36.                 if( operate.word_t[ index_cnt*3 + 1 ] > 1 )
  37.                 {
  38.                         operate.word_t[ index_cnt*3 + 1 ] --;
  39.                         
  40.                         sys_write_vp( (0x1400 + index_cnt*3 + 1) , &(operate.byte_t[ (index_cnt*3 + 1)*2 ]) , 1 );
  41.                 }
  42.         }

  43.         if( buff.word_t[ index_cnt*8 + 9 ] == 0xAAAA ) /* amp + */
  44.         {
  45.                 sys_write_vp( (0x100C + index_cnt*8 + 3) , def_byte_t , 1 );
  46.                
  47.                 if( operate.word_t[ index_cnt*3 + 1 ] < 10 )
  48.                 {
  49.                         operate.word_t[ index_cnt*3 + 1 ] ++;
  50.                         
  51.                         sys_write_vp( (0x1400 + index_cnt*3 + 1) , &(operate.byte_t[ (index_cnt*3 + 1)*2 ]) , 1 );
  52.                 }
  53.         }

  54.         if( buff.word_t[ index_cnt*8 + 10 ] == 0xAAAA ) /* size - */
  55.         {
  56.                 sys_write_vp( (0x100C + index_cnt*8 + 4) , def_byte_t , 1 );
  57.                
  58.                 if( operate.word_t[ index_cnt*3 + 2 ] > 0 )
  59.                 {
  60.                         operate.word_t[ index_cnt*3 + 2 ] --;
  61.                         
  62.                         sys_write_vp( (0x1400 + index_cnt*3 + 2) , &(operate.byte_t[ (index_cnt*3 + 2)*2 ]) , 1 );

  63.                         set[0] = (unsigned char)(operate.word_t[ index_cnt*3 + 2 ]);
  64.                         set[1] = 0x00;
  65.                         sys_write_vp( (0x5000 + index_cnt*256 + 10) , set , 1 );
  66.                 }
  67.         }

  68.         if( buff.word_t[ index_cnt*8 + 11 ] == 0xAAAA ) /* size + */
  69.         {
  70.                 sys_write_vp( (0x100C + index_cnt*8 + 5) , def_byte_t , 1 );
  71.                
  72.                 if( operate.word_t[ index_cnt*3 + 2 ] < 7 )
  73.                 {
  74.                         operate.word_t[ index_cnt*3 + 2 ] ++;
  75.                         
  76.                         sys_write_vp( (0x1400 + index_cnt*3 + 2) , &(operate.byte_t[ (index_cnt*3 + 2)*2 ]) , 1 );

  77.                         set[0] = (unsigned char)(operate.word_t[ index_cnt*3 + 2 ]);
  78.                         set[1] = 0x00;
  79.                         sys_write_vp( (0x5000 + index_cnt*256 + 10) , set , 1 );
  80.                 }
  81.         }
  82.         
  83.         index_cnt ++;
  84.         if( index_cnt >= 6 )
  85.         {
  86.                 index_cnt = 0;
  87.         }
  88. }


scop

更多回帖

发帖
×
20
完善资料,
赚取积分