金牌会员
- 积分
- 1479
- 金钱
- 1479
- 注册时间
- 2016-1-25
- 在线时间
- 260 小时
|
实现环境:STM32战舰V3开发板+4.3寸触摸屏【屏尺寸大小可以根据自己实际使用显示屏,修改对应的坐标范围】+10K可调电阻【作为adc采集输入源】实验参考:①https://blog.csdn.net/neqee/article/details/53366158
②emwin5中文手册->窗口对象(小工具)->15.9图形小工具
实现效果:使用emwin的图形小工具GRAPH,用波形的方式来实时显示adc采集到电压变化
实现过程:首先:将原子哥中的 D:\STM32_SOURCE\STM32战舰V3\A盘 基本资料\4,程序源码\3,扩展例程\3,EMWIN扩展例程\EMWIN实验14 GUIbulider使用 拷贝到桌面进行修改,利用GUIbulider创建一个graph窗口,保存后替换点例程里面的C:\Users\Administrator\Desktop\GRAPH\EMWIN_DEMO\GUIBulder的FramewinDLG.c文件 【注意:当中文件目录为自己电脑文件夹所在位置】,这只是简单的生成一个显示框架而已。
接下来:我们就必须根据emwin5中文手册修改FramewinDLG.c文件的内容,来进行波形显示窗口的绘制,需要修改的代码如下:
[mw_shl_code=c,true]//对需要使用到的句柄进行定义
extern WM_HWIN hItem; //»ñè¡μ±Ç°¶ÔÏó¾ä±ú
extern WM_HWIN pdataGRP; //»ñè¡μ±Ç°ÇúÏßò»¾ä±ú
extern WM_HWIN pdataGRP1; //»ñè¡μ±Ç°ÇúÏ߶t¾ä±ú
//构建需要波形显示窗口
static void _cbdraw(WM_MESSAGE * pMsg) {
WM_HWIN hScaleV;
WM_HWIN hScaleH;
hItem =WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0);
GRAPH_SetBorder(hItem,40, 5, 5, 30);//éèÖñ߿ò3ß′ç éÏÏÂ×óóò
GRAPH_SetGridVis(hItem,1); //ÆôóÃíø¸ñ»æÖÆ
GRAPH_SetGridFixedX(hItem,1); //1춨XÖá·½ÏòμÄíø¸ñ
GRAPH_SetGridDistY(hItem,25); //éèÖÃˮƽíø¸ñ¼ä¾à
GRAPH_SetGridDistX(hItem,50); //éèÖÃ′1Ö±íø¸ñ¼ä¾à
hScaleV =GRAPH_SCALE_Create(30, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 25);//′′½¨oíìí¼ó′1Ö±·¶Î§3߶è±êÇ©
GRAPH_SCALE_SetTextColor(hScaleV,GUI_RED); //éèÖñêÇ©×ÖìåÑÕé«
GRAPH_AttachScale(hItem,hScaleV); //ìí¼óμ½Ë®Æ½·½Ïò
hScaleH =GRAPH_SCALE_Create(390, GUI_TA_HCENTER, GRAPH_SCALE_CF_HORIZONTAL, 50);//′′½¨oíìí¼óˮƽ·¶Î§3߶è±êÇ©
GRAPH_SCALE_SetTextColor(hScaleH,GUI_DARKGREEN); //éèÖñêÇ©×ÖìåÑÕé«
GRAPH_AttachScale(hItem,hScaleH); //ìí¼óμ½′1Ö±·½Ïò
pdataGRP =GRAPH_DATA_YT_Create(GUI_GREEN, 500, 0, 0); //′′½¨êy¾YÇúÏß ò»
GRAPH_AttachData(hItem,pdataGRP); //Îa»æí¼¿ØÖÆìí¼óêy¾Y¶ÔÏó
pdataGRP1 =GRAPH_DATA_YT_Create(GUI_RED, 500, 0, 0); //′′½¨êy¾YÇúÏß ¶t
GRAPH_AttachData(hItem,pdataGRP1); //Îa»æí¼¿ØÖÆìí¼óêy¾Y¶ÔÏó
}
//替换原来自动生成创建对话框内容
WM_HWIN CreateFramewin(void) {
WM_HWIN hWin;
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbdraw, WM_HBKWIN, 0, 0);
return hWin;
}[/mw_shl_code]
到上面这步,我们只是简单的实现绘制一个跟示波器显示一样的窗口而且,需要使用GRAPH_DATA_YT_AddValue()函数赋值给GRAPH控件,每赋值一个数据则显示一个点,点和点之间emWin会自动连结起来,无需我们操心:
我要显示的是adc采集到的电压变化,所以我们直接拷贝原子哥的adc实验,这边需要注意的几点,因为我们是拷贝出来的EMWIN实验14 GUIbulider使用 例程,所以直接将adc实验添加进去编译的话肯定会报错。
注意:
一:需要将__STM32F10x_CONF_H配置文件中的#include "stm32f10x_adc.h"包含进去,例程中原子哥是给屏蔽掉的
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F10x_CONF_H
#define __STM32F10x_CONF_H
/* Includes ------------------------------------------------------------------*/
/* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */
#include "stm32f10x_adc.h"
//#include "stm32f10x_bkp.h"
//#include "stm32f10x_can.h"
//#include "stm32f10x_cec.h"
//#include "stm32f10x_crc.h"
//#include "stm32f10x_dac.h"
//#include "stm32f10x_dbgmcu.h"
二:需要stm32f10x_adc.c文件添加到程序中FWLIB库中,例程也是没有添加进去。
做完以上部分的话 接下来就简单了,在ucos创建三个任务:一:任务创建 二:波形框初始化 三:波形显示
以下为adc数据显示的代码
[mw_shl_code=c,true]void led0_task(void *p_arg)
{
OS_ERR err;
u16 adcx;
float temp;
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,10);
temp=(float)adcx*(3.3/4096);
adcx=temp*100;
GRAPH_DATA_YT_AddValue(pdataGRP,adcx);
//GRAPH_DATA_YT_AddValue(pdataGRP1,(i+50));//2¨DÎ ¶t
LED0 = !LED0;
OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_PERIODIC,&err);//Ñóê±500ms
}
}[/mw_shl_code]
到这里的话 整个程序就算完成了,完整的大家可以下载附件中的源码,里面也有详细的注释,因为编码格式不同,所以上传的代码注释就成乱码了。我觉得最主要的还是要看emwin5中文手册,里面的对图形API函数都有详细的描述,所以对照着手册学起来也会轻松一点
如:GRAPH_SetBorder(hItem,40, 5, 5, 30);//设置边框尺寸 上下左右
描述
设置给定图形小工具的左、上、右和下边框。
原型
void GRAPH_SetBorder(GRAPH_Handle hObj,
unsigned BorderL, unsigned BorderT,
unsigned BorderR, unsigned BorderB);
参数:
hObj 小工具的句柄。
BorderL 距离左边框的尺寸 (单位:像素)。
BorderT 距离上边框的尺寸 (单位:像素)。
BorderR 距离右边框的尺寸 (单位:像素)。
BorderB 距离下边框的尺寸 (单位:像素)。
我也是刚学,所以也只是简单的实现一些效果而已。感谢文中网友neqee的网文和原子哥提供的开源环境提供的帮助。
创建FramewinDLG.c
波形左移效果
左移效果
GRAPH.rar
(11.68 MB, 下载次数: 769)
|
|