本文章参考网页https://blog.csdn.net/FML7169/article/details/94044285
1. 实验环境
(1)Keil uVision5
(2)STM32F407ZGT6
2. 实验内容
在开发板的LCD上画出电压的波形。
注意:
(1)波形反映的是电压的波动,比例可以自己决定,但要波动看上去比较明显;
(2)开始的时候波形是向右延伸,而满屏后应该让图形滚动起来。
3. 实验代码
【lcd.h】
void GUI_Init(void);//添加一个图形界面初始化的函数定义
【lcd.c】
//图形界面显示
void GUI_Init()
{
u16 x,y;
BACK_COLOR=BLACK;
//画虚线方格
for(x=25;x<401;x=x+25)//画列,从第25个像素开始
for(y=25;y<226;y=y+5)
LCD_Fast_DrawPoint(x,y,GRAY);
for(y=25;y<226;y=y+25)//画行
for(x=25;x<401;x=x+5)
LCD_Fast_DrawPoint(x,y,GRAY);
//画坐标轴
POINT_COLOR=YELLOW; //颜色为黄色
LCD_DrawLine(25,25,400,25);//横上
LCD_DrawLine(400,25,400,225);//竖右
LCD_DrawLine(25,25,25,225); //竖左
LCD_DrawLine(25,225,400,225);//横下
POINT_COLOR=BLUE;//蓝色
LCD_ShowString(0,15,40,16,12,"Volt");
LCD_ShowString(400,225,50,16,12,"Time");
LCD_ShowString(0,150,40,16,12,"3V");
LCD_ShowString(30,600,200,16,16,"Author:3170602001");
LCD_ShowString(30,620,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,640,200,16,16,"ADC TEST");
LCD_ShowString(30,660,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,680,200,16,16,"2020/9/15");
LCD_ShowString(30,700,200,16,16,"ADC1_CH5_VAL:");
LCD_ShowString(30,720,200,16,16,"ADC1_CH5_VOL:0.000V"); //先在固定位置显示小数点
}
【main.c】
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"
u16 adcx;//通道转换值
float temp;//暂存值
u16 value[17];//通道转换值数组
u16 count=0;//数组计数
//动态刷新
void ShowWave()
{
u16 x,y;//定义变量
LCD_Fill(25,25,400,225,BLACK);//网格区域填充黑色
//画虚线方格
for(x=25;x<401;x=x+25)//画列,从第25个像素开始
for(y=25;y<226;y=y+5)
LCD_Fast_DrawPoint(x,y,GRAY);
for(y=25;y<226;y=y+25)//画行
for(x=25;x<401;x=x+5)
LCD_Fast_DrawPoint(x,y,GRAY);
//画坐标轴
POINT_COLOR=YELLOW; //颜色为黄色
LCD_DrawLine(25,25,400,25);//横上
LCD_DrawLine(400,25,400,225);//竖右
LCD_DrawLine(25,25,25,225); //竖左
LCD_DrawLine(25,225,400,225);//横下
}
//实现数组元素左移
void ValueMove()
{
u8 i;//循环变量
for(i=0;i<count-1;i++)
value[i]=value[i+1];//左移
count--;
}
void DrawWave()//显示波形
{
u8 j;//循环变量
POINT_COLOR=RED;//红色画笔
for(j=1;j<count;j++)//循环
LCD_DrawLine((j-1)*25+25,250-value[j-1],j*25+25,250-value[j]);//从[j-1]到[j]画线
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化LED
LCD_Init(); //初始化LCD接口
Adc_Init(); //初始化ADC
LCD_Clear(BLACK); //清屏函数
GUI_Init(); //图形界面初始化
while(1)
{
LED0=!LED0;//判断程序是否正常
adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowxNum(134,700,adcx,4,16,0); //显示ADCC采样后的原始值
temp=(float)adcx*(3.3/4096); //获取计算后的带小数的实际电压值,比如3.1111
adcx=temp; //赋值整数部分给adcx变量,因为adcx为u16整形
LCD_ShowxNum(134,720,adcx,1,16,0); //显示电压值的整数部分,3.1111的话,这里就是显示3
temp-=adcx; //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
temp*=1000; //小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。
LCD_ShowxNum(150,720,temp,3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
delay_ms(250);
value[count]=temp*3; //记录通道值
count++; //计数递增
if(count==17)
{
ValueMove();//实现数组元素左移
}
ShowWave();//动态刷新
DrawWave();//显示波形
}
}
4.注意事项
(1)使用清屏函数后不要立即画图
(2)实现图像滚动的方法:动态刷新