本帖最后由 W丶Sir 于 2022-3-30 23:44 编辑
因为平时喜欢在家里折腾一些小玩意,但是没有示波器就会很不方便,当看到迪文推出了COF屏试用体验时,就想着做一个简易示波器。
下面直接开始分享我的开发过程。
1.主要界面
经过很多次调整最终确定了这一版的界面,还是暗色调的界面符合示波器的气质。
图1.启动界面
图2.单通道波形显示
图3.多通道波形显示
2.DGUS设计
通过基础触控可以轻松的实现界面直接的跳转。
图4.启动界面设计
按键功能的实现是通过“按键返回”控件实现的,设置键值和变量地址后,当触控按键被按下时,键值就会填充到变量地址对应的存储空间内,方便通过C语言进行访问。这里我尝试了“按字写入变量”和“位控制”两种方式,按位控制可以将多个按键的状态存放在一个变量里,大大减少了存储空间的占用,但是这样也有弊端,再C语言处理按键动作时,需要对按键的对应的bit进行复位,这会加大代码上的实现难度。按字写入变量整体上会便的简单许多,只需要判断地址上是不是指定的键值即可。地址和键值可以自由设定,实现很多功能。
图5.按键设计
这里我设置了居中对齐,但是最终效果还是左对齐,可能还有某个地方设置的不对。
图6.数值显示设计
“动态曲线”控件实现曲线显示时遭遇了一些困难,开发工具上的配置项在大面积显示曲线时不太灵活,给大家分享以下经过一些尝试后我的做法。曲线显示时Y_Central和VD_Central配置成0和65535,这样可以让数据范围变得很大,纵轴放大倍数建议设置成2,设置为1时数据范围只能覆盖屏幕的一部分,设置为2可以覆盖到屏幕外,这是可以通过代码处理波形数据,让波形的变化便的非常灵活。
六个通道我使用的是1到6号数据源通道,我把0号留给了显示和触控变量。
描述指针在官方文档中有给出设定范围,通过描述指针开发者可以对控件的配置信息在线修改。
图7.曲线显示设计
图8.字库设置
3.一些代码
- void key_operate( void )
- {
- static unsigned char index_cnt = 0;
- if( buff.word_t[ index_cnt*8 + 6 ] == 0xAAAA ) /* time - */
- {
- sys_write_vp( (0x100C + index_cnt*8 + 0) , def_byte_t , 1 );
-
- if( operate.word_t[ index_cnt*3 + 0 ] > 1 )
- {
- operate.word_t[ index_cnt*3 + 0 ] --;
-
- sys_write_vp( (0x1400 + index_cnt*3 + 0) , &(operate.byte_t[ (index_cnt*3 + 0)*2 ]) , 1 );
- set[0] = (unsigned char)(index_cnt+1);
- set[1] = (unsigned char)operate.word_t[ index_cnt*3 + 0 ];
- sys_write_vp( (0x5000 + index_cnt*256 + 9) , set , 1 );
- }
- }
- if( buff.word_t[ index_cnt*8 + 7 ] == 0xAAAA ) /* time + */
- {
- sys_write_vp( (0x100C + index_cnt*8 + 1) , def_byte_t , 1 );
-
- if( operate.word_t[ index_cnt*3 + 0 ] < 255 )
- {
- operate.word_t[ index_cnt*3 + 0 ] ++;
-
- sys_write_vp( (0x1400 + index_cnt*3 + 0) , &(operate.byte_t[ (index_cnt*3 + 0)*2 ]) , 1 );
- set[0] = (unsigned char)(index_cnt+1);
- set[1] = (unsigned char)operate.word_t[ index_cnt*3 + 0 ];
- sys_write_vp( (0x5000 + index_cnt*256 + 9) , set , 1 );
- }
- }
- if( buff.word_t[ index_cnt*8 + 8 ] == 0xAAAA ) /* amp - */
- {
- sys_write_vp( (0x100C + index_cnt*8 + 2) , def_byte_t , 1 );
-
- if( operate.word_t[ index_cnt*3 + 1 ] > 1 )
- {
- operate.word_t[ index_cnt*3 + 1 ] --;
-
- sys_write_vp( (0x1400 + index_cnt*3 + 1) , &(operate.byte_t[ (index_cnt*3 + 1)*2 ]) , 1 );
- }
- }
- if( buff.word_t[ index_cnt*8 + 9 ] == 0xAAAA ) /* amp + */
- {
- sys_write_vp( (0x100C + index_cnt*8 + 3) , def_byte_t , 1 );
-
- if( operate.word_t[ index_cnt*3 + 1 ] < 10 )
- {
- operate.word_t[ index_cnt*3 + 1 ] ++;
-
- sys_write_vp( (0x1400 + index_cnt*3 + 1) , &(operate.byte_t[ (index_cnt*3 + 1)*2 ]) , 1 );
- }
- }
- if( buff.word_t[ index_cnt*8 + 10 ] == 0xAAAA ) /* size - */
- {
- sys_write_vp( (0x100C + index_cnt*8 + 4) , def_byte_t , 1 );
-
- if( operate.word_t[ index_cnt*3 + 2 ] > 0 )
- {
- operate.word_t[ index_cnt*3 + 2 ] --;
-
- sys_write_vp( (0x1400 + index_cnt*3 + 2) , &(operate.byte_t[ (index_cnt*3 + 2)*2 ]) , 1 );
- set[0] = (unsigned char)(operate.word_t[ index_cnt*3 + 2 ]);
- set[1] = 0x00;
- sys_write_vp( (0x5000 + index_cnt*256 + 10) , set , 1 );
- }
- }
- if( buff.word_t[ index_cnt*8 + 11 ] == 0xAAAA ) /* size + */
- {
- sys_write_vp( (0x100C + index_cnt*8 + 5) , def_byte_t , 1 );
-
- if( operate.word_t[ index_cnt*3 + 2 ] < 7 )
- {
- operate.word_t[ index_cnt*3 + 2 ] ++;
-
- sys_write_vp( (0x1400 + index_cnt*3 + 2) , &(operate.byte_t[ (index_cnt*3 + 2)*2 ]) , 1 );
- set[0] = (unsigned char)(operate.word_t[ index_cnt*3 + 2 ]);
- set[1] = 0x00;
- sys_write_vp( (0x5000 + index_cnt*256 + 10) , set , 1 );
- }
- }
-
- index_cnt ++;
- if( index_cnt >= 6 )
- {
- index_cnt = 0;
- }
- }
复制代码
scop
|