效果图
正弦波定义
#define LCD_WIDTH 320
#define LCD_HEIGHT 480
#define M_PI 3.1415926
// 正弦波参数
#define WAVE_AMPLITUDE 80 // 振幅
#define WAVE_OFFSET LCD_HEIGHT / 2 // 偏移量(波形中心位置)
#define WAVE_CYCLES 5 // 周期数
#define WAVE_POINTS_PER_CYCLE 100 // 每个周期中的点数
// 绘制多个周期的正弦波
void DrawSineWave() {
float x_step = (float)LCD_WIDTH / (WAVE_CYCLES * WAVE_POINTS_PER_CYCLE); // 计算x轴上的步长
for (int cycle = 0; cycle < WAVE_CYCLES; cycle++) {
for (int i = 0; i < WAVE_POINTS_PER_CYCLE; i++) {
// 计算当前点的x坐标
int x = (int)(cycle * WAVE_POINTS_PER_CYCLE * x_step + i * x_step);
// 计算当前点的y坐标(正弦波值),并调整为LCD的坐标系统
float y_value = WAVE_AMPLITUDE * sin(2 * M_PI * (float)i / WAVE_POINTS_PER_CYCLE) + WAVE_OFFSET;
int y = (int)y_value;
// 确保y坐标在LCD范围内
if (y < 0) y = 0;
if (y >= LCD_HEIGHT) y = LCD_HEIGHT - 1;
// 绘制点
LCD_DrawPoint(x, y);
}
}
}
放在lcd.c中
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
LCD_SetCursor(x,y); // 设置坐标
LCD_WR_REG(0X2C); // 写入GRAM
*(__IO uint16_t*) FSMC_DATA = LCD.Color; // 写入颜色
}
主函数
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
LCD_Init(); // LCD初始化
DrawSineWave(); //显示正弦波
while (1)
{
}
}