TA的每日心情 | 开心 2022-8-16 09:50 |
---|
签到天数: 16 天 连续签到: 1 天 [LV.4]偶尔看看III
|
示波器也当显示屏用,示波器上也能写字画画,今天就教大家在示波器上为所欲为所欲为所欲为的显示东西了。
(先上程序链接,stm32 adc+ZLG的GUI)链接:https://pan.baidu.com/s/1eSgMksq 密码:itia
还记得当年的物理实验么,用双踪示波器画个李萨如图形,简单来讲就是示波器的xy模式下,x和y都输入同样的一个正弦波然后就会出来一个圆。想详细了解的话看这里示波器李萨如实验。
我们用示波器写字的话也要用这个模式xy模式,我的示波器上直接有一个按键切换的,其它示波器看操作说明吧,有的示波器是不支持的。
要想用单片机控制输入信号当然由单片机给了,我们都知道示波器采集的是电压,那么DAC不是刚好么,这里我们 需要两路dac一路输入到x轴,一路到y轴这里我用的stm32的dac1的1 2路通道,初始化如下
void Dac1_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitType; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA通道时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能DAC通道时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; // 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5) ;//PA.4 输出高 DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0 DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生 DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置 DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1 DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1DAC_Init(DAC_Channel_2,&DAC_InitType); //初始化DAC通道2 DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1 DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC1 DAC_SetChannel1Data( DAC_Align_8b_R, 0); //8位右对齐数据格式设置DAC值 DAC_SetChannel2Data( DAC_Align_8b_R, 0); //18位右对齐数据格式设置DAC值}可以简单的这样理解,x方向上(dac1)的电压大小就是x的坐标点,y方向上的电压大小也是他的坐标点,然后我用的是8位adc的所以屏幕的分辨率就是256*256的。为了更便于操作,我移植了我之前常用的GUi库,这个GUI库在我之前的经验里有https://jingyan.eeboard.com/article/75774这次需要修改打点的函数,在lcmdrv。c中
/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x 指定点所在列的位置
* y 指定点所在行的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
* 效范围)
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void GUI_Point(uint16 x, uint8 y, TCOLOR color)
{if(color==1)
{DAC_SetChannel2Data( DAC_Align_8b_R,x);//设置DAC值xxx
DAC_SetChannel1Data( DAC_Align_8b_R,y );//设置DAC值yyy
}
}
把这个函数修改了即可,然后我们就能用gui库了,写汉字的时候操作方法类似于对于点阵的操作,一个一个点的打然后由于视觉暂留的作用所以就成为字或者图了,这里给一个画五角星的函数
/***********************************************
函数名 :void Five_pointedstar(int x,int y,int angle,int r)
功 能 :在x,y位置处画一个五角星,角度为angle,五角星外切圆的半径为r;
入口参数 :无
返回参数 :无
作 者 :lx
***********************************************/
void Five_pointedstar(int x,int y,int angle,int r)
{
int m_xw[5]; //5个X外顶点坐标
int m_yw[5]; //5个Y外顶点坐标
int i;
for (i = 0; i < 5; i++)
{
m_xw = (int) (cos(i * 72 * PI / 30 - PI *angle/ 180) * (r) + x);
m_yw = (int) (sin(i * 72* PI / 30 - PI *angle/180) * (r) + y);
}
GUI_Line(m_xw[0],m_yw[0],m_xw[2],m_yw[2],1); //画直线
GUI_Line(m_xw[2],m_yw[2],m_xw[4],m_yw[4],1); //画直线
GUI_Line(m_xw[4],m_yw[4],m_xw[1],m_yw[1],1); //画直线
GUI_Line(m_xw[1],m_yw[1],m_xw[3],m_yw[3],1); //画直线
GUI_Line(m_xw[3],m_yw[3],m_xw[0],m_yw[0],1); //画直线
}
对了图中的那个小丸子是取的坐标点画出来的,想了解的可以研究下程序。
; |
|