【安富莱二代示波器教程】第8章 示波器设计—测量功能

第8章        示波器设计—测量功能

二代示波器测量功能实现比较简单,使用2D函数绘制即可。不过也专门开辟一个章节,为大家做一个简单的说明,方便理解。

8.1    水平测量功能

8.2     垂直测量功能

8.3     总结

8.1  水平测量功能

水平测量方式的效果如下:

水平测量功能的数据显示不要以窗口的形式呈现,因为将窗口显示在波形显示区上会造成波形刷新慢。当前的方案是在绘制完毕波形后,直接2D函数绘制测量窗口,这种方式的实际效果好很多。对应的代码如下:

/*

*********************************************************************************************************

*    函 数 名: DSO_DrawCursorH

*    功能说明: 绘制示波器的水平测量游标,用于测量幅值。

*    形    参: 无          

*    返 回 值: 无

*********************************************************************************************************

*/

void DSO_DrawCursorH(void)

{

     char buf[60];

    

     /* 第1步:绘制用于测量的两个游标线********************************************************/

     GUI_SetColor(0x0040f0);

    

     /* 绘制横线A */

     GUI_DrawHLine(g_Cursors->sCursorHA, DSOSCREEN_STARTX, DSOSCREEN_ENDX);

     GUI_DrawHLine(g_Cursors->sCursorHA+1, DSOSCREEN_STARTX, DSOSCREEN_ENDX); 

     GUI_FillRoundedRect(50, g_Cursors->sCursorHA+3, 61, g_Cursors->sCursorHA+18, 3);

 

     /* 绘制横线B */

     GUI_DrawHLine(g_Cursors->sCursorHB, DSOSCREEN_STARTX, DSOSCREEN_ENDX);

     GUI_DrawHLine(g_Cursors->sCursorHB-1, DSOSCREEN_STARTX, DSOSCREEN_ENDX); 

     GUI_FillRoundedRect(50, g_Cursors->sCursorHB-18, 61, g_Cursors->sCursorHB-3, 3);

    

     /* 在横线A和横线B旁边的小圆圈中显示字母a和字母b */

     GUI_SetColor(GUI_BLACK);

     GUI_SetFont(&GUI_Font20_ASCII);

     GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   

     GUI_DispCharAt('a', 51, g_Cursors->sCursorHA);

     GUI_DispCharAt('b', 51, g_Cursors->sCursorHB-19);

    

     /* 第2步:绘制游标数据显示窗口********************************************************/

     GUI_SetColor(GUI_BLACK);

     GUI_FillRoundedRect(500, 55, 635, 135, 4);

     GUI_SetColor(GUI_WHITE);

     GUI_DrawRoundedRect( 499, 54, 636, 136, 4);

                             

     GUI_SetColor(0x0040f0);

     GUI_FillRoundedRect(75 + 433 , 47 + 15, 86 + 433, 62 + 15, 3);                

     GUI_FillRoundedRect(75 + 433 , 45 + 45, 86 + 433, 60 + 45, 3);

                             

     GUI_SetColor(GUI_BLACK);

     GUI_SetFont(&GUI_Font20_1);

     GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   

     GUI_DispCharAt('a', 509, 59);

     GUI_DispCharAt('b', 509, 88);

    

     GUI_SetColor(GUI_YELLOW);

     GUI_SetFont(&GUI_Font16_1);

     GUI_DispCharAt('#', 511, 115);

 

     /* 第3步:计算竖线线A的数值***********************************************************/

     g_Cursors->WaveCursorA = (float)((g_Cursors->sCursorVA - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

     if(g_CursorUintTable[TimeBaseId][1] == 1)

     {

         sprintf(buf, "%5.1fus", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 2)

     {

         sprintf(buf, "%5.3fms", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 3)

     {

         sprintf(buf, "%5.2fms", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 4)

     {

         sprintf(buf, "%5.1fms", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 5)

     {

         sprintf(buf, "%5.3fs", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 6)

     {

         sprintf(buf, "%5.2fs", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 7)

     {

         sprintf(buf, "%5.1fs", g_Cursors->WaveCursorA);

     }

 

     GUI_DispStringAt(buf, 523, 63);

    

     /* 第3步:计算竖线线B的数值***********************************************************/

     g_Cursors->WaveCursorB = (float)((g_Cursors->sCursorVB - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

     if(g_CursorUintTable[TimeBaseId][1] == 1)

     {

         sprintf(buf, "%5.1fus", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 2)

     {

         sprintf(buf, "%5.3fms", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 3)

     {

          sprintf(buf, "%5.2fms", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 4)

     {

         sprintf(buf, "%5.1fms", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 5)

     {

         sprintf(buf, "%5.3fs", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 6)

     {

         sprintf(buf, "%5.2fs", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 7)

     {

         sprintf(buf, "%5.1fs", g_Cursors->WaveCursorB);

     }

     GUI_DispStringAt(buf, 523, 91);

    

    

     /* 第5步:计算竖线A竖线B的差值***********************************************************/

     if(g_CursorUintTable[TimeBaseId][1] == 1)

     {

         sprintf(buf, "%5.1fus", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 2)

     {

         sprintf(buf, "%5.3fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 3)

     {

         sprintf(buf, "%5.2fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 4)

     {

         sprintf(buf, "%5.1fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

         else if(g_CursorUintTable[TimeBaseId][1] == 5)

     {

         sprintf(buf, "%5.3fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 6)

     {

         sprintf(buf, "%5.2fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 7)

     {

         sprintf(buf, "%5.1fs",(g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     GUI_DispStringAt(buf, 523, 115);

    

     /* 第6步:显示水平线的计算数值***********************************************************/

     GUI_DispCharAt('#', 509+72, 115);

 

     g_Cursors->WaveCursorA = (float)((240 - g_Cursors->sCursorHA) * g_AttTable[Ch1AmpId][1]) / 50000;

     sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA);

     GUI_DispStringAt(buf, 518+72, 63);

    

     g_Cursors->WaveCursorB = (float)((240 - g_Cursors->sCursorHB) * g_AttTable[Ch1AmpId][1]) / 50000;

     sprintf(buf, "%5.3fV", g_Cursors->WaveCursorB);   

     GUI_DispStringAt(buf, 518+70, 91);

    

     sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA - g_Cursors->WaveCursorB);

     GUI_DispStringAt(buf, 520+70, 115);

}

水平测量的实现比较简单,就是2D函数调用和字符显示。如果大家要自己实现,按照代码中注释的步骤制作即可。测量功能的调节是通过开发板上面的摇杆实现的。

8.2   垂直测量功能

垂直测量方式的效果如下:

垂直测量功能的数据显示不要以窗口的形式呈现,因为将窗口显示在波形显示区上会造成波形刷新慢。当前的方案是在绘制完毕波形后,直接2D函数绘制测量窗口,这种方式的实际效果好很多。对应的代码如下:

/*

*********************************************************************************************************

*    函 数 名: DSO_DrawCursorV

*    功能说明: 绘制示波器的垂直测量游标,用于测量的时间。

*    形    参: 无          

*    返 回 值: 无

*********************************************************************************************************

*/

void DSO_DrawCursorV(void)

{

     char buf[60];

    

     /* 第1步:绘制用于测量的两个游标线********************************************************/

     GUI_SetColor(0x0040f0);

    

     /* 绘制竖线A */

     GUI_DrawVLine(g_Cursors->sCursorVA, DSOSCREEN_STARTY, DSOSCREEN_ENDY);

     GUI_DrawVLine(g_Cursors->sCursorVA+1, DSOSCREEN_STARTY, DSOSCREEN_ENDY); 

     GUI_FillRoundedRect(g_Cursors->sCursorVA+5, 47, g_Cursors->sCursorVA+16, 62, 3);

 

     /* 绘制竖线B */

     GUI_DrawVLine(g_Cursors->sCursorVB, DSOSCREEN_STARTY, DSOSCREEN_ENDY);

     GUI_DrawVLine(g_Cursors->sCursorVB-1, DSOSCREEN_STARTY, DSOSCREEN_ENDY);

     GUI_FillRoundedRect(g_Cursors->sCursorVB-16, 47, g_Cursors->sCursorVB-5, 62, 3);

    

     /* 在竖线A和竖线B旁边的小圆圈中显示字母a和字母b */

     GUI_SetColor(GUI_BLACK);

     GUI_SetFont(&GUI_Font20_ASCII);

     GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   

     GUI_DispCharAt('a', g_Cursors->sCursorVA+6, 44);

     GUI_DispCharAt('b', g_Cursors->sCursorVB-15, 45);

 

     /* 第2步:绘制游标数据显示窗口********************************************************/

     GUI_SetColor(GUI_BLACK);

     GUI_FillRoundedRect(500, 55, 635, 135, 4);

     GUI_SetColor(GUI_WHITE);

     GUI_DrawRoundedRect( 499, 54, 636, 136, 4);

                        

     GUI_SetColor(0x0040f0);

     GUI_FillRoundedRect(75 + 433 , 47 + 15, 86 + 433, 62 + 15, 3);                

     GUI_FillRoundedRect(75 + 433 , 45 + 45, 86 + 433, 60 + 45, 3);

                        

     GUI_SetColor(GUI_BLACK);

     GUI_SetFont(&GUI_Font20_1);

     GUI_SetTextMode(GUI_TEXTMODE_TRANS);                   

     GUI_DispCharAt('a', 509, 59);

     GUI_DispCharAt('b', 509, 88);

 

     GUI_SetColor(GUI_YELLOW);

     GUI_SetFont(&GUI_Font16_1);

     GUI_DispCharAt('#', 513, 115);

 

     /* 第3步:计算竖线A的数值***********************************************************/

     g_Cursors->WaveCursorA = (float)((g_Cursors->sCursorVA - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

     if(g_CursorUintTable[TimeBaseId][1] == 1)

     {

         sprintf(buf, "%5.1fus", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 2)

     {

         sprintf(buf, "%5.3fms", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 3)

     {

         sprintf(buf, "%5.2fms", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 4)

     {

         sprintf(buf, "%5.1fms", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 5)

     {

          sprintf(buf, "%5.3fs", g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 6)

     {

         sprintf(buf, "%5.2fs",g_Cursors->WaveCursorA);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 7)

     {

         sprintf(buf, "%5.1fs", g_Cursors->WaveCursorA);

     }

 

     /* 显示竖线A数值 */

     GUI_DispStringAt(buf, 523, 63);

 

     /* 第4步:计算竖线B的数值***********************************************************/

     g_Cursors->WaveCursorB = (float)((g_Cursors->sCursorVB - 340) * g_CursorUintTable[TimeBaseId][0])/1000;

     if(g_CursorUintTable[TimeBaseId][1] == 1)

     {

         sprintf(buf, "%5.1fus", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 2)

     {

         sprintf(buf, "%5.3fms", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 3)

     {

          sprintf(buf, "%5.2fms", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 4)

     {

         sprintf(buf, "%5.1fms", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 5)

     {

         sprintf(buf, "%5.3fs", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 6)

     {

         sprintf(buf, "%5.2fs", g_Cursors->WaveCursorB);

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 7)

     {

         sprintf(buf, "%5.1fs", g_Cursors->WaveCursorB);

     }

    

     /* 显示竖线B数值 */

     GUI_DispStringAt(buf, 523, 91);

 

     /* 第5步:计算竖线A竖线B的差值***********************************************************/

     if(g_CursorUintTable[TimeBaseId][1] == 1)

     {

         sprintf(buf, "%5.1fus", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 2)

     {

         sprintf(buf, "%5.3fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 3)

     {

         sprintf(buf, "%5.2fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 4)

     {

         sprintf(buf, "%5.1fms", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 5)

     {

         sprintf(buf, "%5.3fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 6)

     {

         sprintf(buf, "%5.2fs", (g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

     else if(g_CursorUintTable[TimeBaseId][1] == 7)

     {

         sprintf(buf, "%5.1fs",(g_Cursors->WaveCursorB - g_Cursors->WaveCursorA));

     }

    

     /* 显示竖线A和竖线B的差值 */

     GUI_DispStringAt(buf, 523, 115);

 

     /* 第6步:显示水平线的计算数值***********************************************************/

     GUI_DispCharAt('#', 509+72, 115);

 

     g_Cursors->WaveCursorA = (float)((240 - g_Cursors->sCursorHA) * g_AttTable[Ch1AmpId][1]) / 50000;

     sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA);

     GUI_DispStringAt(buf, 518+72, 63);

 

     g_Cursors->WaveCursorB = (float)((240 - g_Cursors->sCursorHB) * g_AttTable[Ch1AmpId][1]) / 50000;

     sprintf(buf, "%5.3fV", g_Cursors->WaveCursorB);   

     GUI_DispStringAt(buf, 518+70, 91);

 

     sprintf(buf, "%5.3fV", g_Cursors->WaveCursorA - g_Cursors->WaveCursorB);

     GUI_DispStringAt(buf, 520+70, 115);

}

垂直测量的实现比较简单,就是2D函数调用和字符显示。如果大家要自己实现,按照代码中注释的步骤制作即可。测量功能的调节是通过开发板上面的摇杆实现的。

8.3   总结

由于测量功能的实现比较简单,所以我们这里只是简单的进行了说明。如果大家要自己制作的话,建议实际操作下。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HTML5学堂

你们等了很久的弹性布局(flex),还不快来~!

传统的布局方案中,我们基本都是在基于盒模型,依赖dispaly(显示)、position(定位)以及float(浮动)等属性来操作。但是这些操作需要用到一些特殊...

3935
来自专栏mySoul

事件冒泡和传播

这还要从遥远的荒诞说起,两家网景和ie,为了能争夺市场,互相使用相反的技术,当网景使用事件传播的时候,ie使用事件冒泡。(两个正好相反)这个时候w3c来了,为了...

1336
来自专栏Nian糕的私人厨房

CSS 基础

层叠样式表 (Cascading Style Sheets),一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语...

1254
来自专栏前端侠2.0

重新认识visibility 原

原先只是记住了display:none不点位,visibility:hidden要占位显示。

672
来自专栏cnblogs

【垂直居中高级篇】你不知道的垂直居中方式

      在Css中对元素进行水平居中是很简单的,如果他是一个行内元素,对它的父元素应用text-align:center;如果是一个块级元素,就对自身应用...

2088
来自专栏黑泽君的专栏

day01_html学习笔记

2061
来自专栏代码世界

前端之CSS内容

一、CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表,它就会按照这个样式表来对文档...

34810
来自专栏从零开始学 Web 前端

从零开始学 Web 之 移动Web(二)JD移动端网页,移动触屏事件

要实现轮播图,必须在首尾添加图片,如果直接在 html 代码直接添加图片的话,由于图片的数量是不固定的,那么每次图片的数量发生改变的话,不仅需要设置 html ...

1711
来自专栏闻道于事

CSS样式表

CSS样式表的样式主要可以分为大小,背景,字体,对齐方式,边界边框,列表方块,格式布局等。 元素的大小: #div1{ width:30...

4298
来自专栏肖蕾的博客

第六章:常用控件日常科普标签(Lable)图片(Image)按钮(Button)

1.控件是用于开发构建用户界面(UI)控件,帮助完成开发中视窗,文本框,按钮,下拉菜单,等界面元素 2.在LibGdx中,提供的控件有 按钮,勾选框,下拉框,...

1182

扫码关注云+社区

领取腾讯云代金券