STM32F103 RCT6 LCD显示正弦波并且设置可以调节振幅的触摸按键代码

时间: 2023-12-03 15:47:49 浏览: 123
以下是基于STM32F103RCT6和Keil MDK-ARM开发环境的LCD显示正弦波并且设置可以调节振幅的触摸按键代码: ```c #include "stm32f10x.h" #include "lcd.h" //LCD驱动库 #include "math.h" //数学库 #define PI 3.14159 //圆周率 void delay_ms(uint16_t n); int main(void) { float amplitude = 20; //振幅 float frequency = 1; //频率 float phase = 0; //相位 float voltage = 0; uint16_t i = 0; uint16_t j = 0; uint16_t k = 0; uint16_t x = 0; uint16_t y = 0; uint16_t z = 0; uint16_t key_value = 0; uint8_t flag = 0; //标志位 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); //使能GPIOA、GPIOB、GPIOC时钟 LCD_Init(); //初始化LCD LCD_Clear(WHITE); //清屏为白色 //配置PA0、PA1、PA2、PA3、PA4、PA5、PA6、PA7为输入模式,设置为下拉输入模式,用于触摸屏按键扫描 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); //配置PB0、PB1、PB2、PB10、PB11、PB12、PB13、PB14、PB15为输出模式,用于触摸屏按键扫描 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //配置PC13为输入模式,用于外部中断触发 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); //配置外部中断 EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); //选择外部中断线路 EXTI_InitStructure.EXTI_Line = EXTI_Line13; //选择外部中断线路 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //上下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能外部中断 EXTI_Init(&EXTI_InitStructure); //配置外部中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //选择外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //抢占优先级0,最高优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //配置外部中断通道 while(1) { //扫描触摸屏按键 GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); //PB0、PB1、PB2设置为高电平 GPIO_ResetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12); //PB10、PB11、PB12设置为低电平 delay_ms(10); //延时10ms,等待电平稳定 key_value = GPIO_ReadInputData(GPIOA) & 0xFF; //读取PA0~7的输入状态 if(key_value != 0xFF) //检测到按键按下 { if(key_value == 0xFE) //PA0按键按下 { flag = 1; //标志位设置为1 } else if(key_value == 0xFD) //PA1按键按下 { flag = 0; //标志位设置为0 } else if(key_value == 0xFB) //PA2按键按下 { amplitude += 5; //振幅增加5 } else if(key_value == 0xF7) //PA3按键按下 { amplitude -= 5; //振幅减少5 } else if(key_value == 0xEF) //PA4按键按下 { frequency += 0.1; //频率增加0.1 } else if(key_value == 0xDF) //PA5按键按下 { frequency -= 0.1; //频率减少0.1 } else if(key_value == 0xBF) //PA6按键按下 { phase += 0.1; //相位增加0.1 } else if(key_value == 0x7F) //PA7按键按下 { phase -= 0.1; //相位减少0.1 } } //显示正弦波 for(i = 0; i < 320; i++) { voltage = amplitude * sin(2 * PI * frequency * i / 320 + phase); //计算正弦波电压值 j = (uint16_t)voltage; //转换为整型 if(j > 240) //防止数组越界 { j = 240; } for(k = 0; k < j; k++) //画正弦波 { x = i; y = 240 - k; LCD_SetPoint(x, y, BLACK); } for(z = j; z < 240; z++) //清空非正弦波部分 { x = i; y = 240 - z; LCD_SetPoint(x, y, WHITE); } } //显示振幅、频率、相位、标志位状态 LCD_ShowString(0, 0, "Amplitude:"); LCD_ShowNum(80, 0, amplitude, 2, 16); LCD_ShowString(0, 16, "Frequency:"); LCD_ShowNum(80, 16, frequency, 1, 16); LCD_ShowString(0, 32, "Phase:"); LCD_ShowNum(80, 32, phase, 1, 16); LCD_ShowString(0, 48, "Flag:"); LCD_ShowNum(80, 48, flag, 0, 16); } } //延时函数,n为延时时间,单位为毫秒 void delay_ms(uint16_t n) { uint16_t i = 0; for(; n > 0; n--) { for(i = 0; i < 8000; i++); } } //外部中断处理函数 void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line13) != RESET) //检测到外部中断 { GPIO_SetBits(GPIOB, GPIO_Pin_13); //PB13设置为高电平 delay_ms(100); //延时100ms,等待电平稳定 if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET) //检测到按键按下 { while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET); //等待按键释放 if(flag == 1) //标志位为1时,PB14设置为高电平 { GPIO_SetBits(GPIOB, GPIO_Pin_14); } else //标志位为0时,PB15设置为高电平 { GPIO_SetBits(GPIOB, GPIO_Pin_15); } delay_ms(50); //延时50ms,等待电平稳定 GPIO_ResetBits(GPIOB, GPIO_Pin_14 | GPIO_Pin_15); //PB14、PB15设置为低电平 } EXTI_ClearITPendingBit(EXTI_Line13); //清除中断标志位 } } ``` 说明: 1. 本代码使用了LCD驱动库,在开发前需要先下载并导入到Keil MDK-ARM开发环境中。 2. 本代码使用了数学库,需要在项目设置中勾选使用math库。 3. 本代码使用了外部中断,需要在项目设置中配置外部中断优先级和中断向量表。 4. 本代码使用了触摸屏按键扫描,需要连接触摸屏按键模块,其中PA0~7为输入端口,PB0~2和PB10~15为输出端口。 5. 本代码通过触摸屏按键来调节正弦波的振幅、频率、相位和标志位状态。 6. 本代码通过外部中断来触发PB14或PB15的输出,实现与外设的交互。

相关推荐

最新推荐

recommend-type

启明欣欣stm32f103rct6开发板原理图

启明欣欣stm32f103rct6开发板原理图 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈...
recommend-type

STM32F103RCT6

6.设置低速速APB1时钟 RCC_PCLK1Config 7.设置PLL RCC_PLLConfig 8.打开PLL RCC_PLLCmd(ENABLE); 9等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 10.设置系统时钟 RCC_SYSCLKConfig 11.判断...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、
recommend-type

已知自动控制原理中通过更高的频率特征来评估切割频率和库存——相位稳定。确定封闭系统的稳定性。求Wcp 和ψ已知W(p)=30•(0.1p+1)•(12.5p+1)/p•(10p+1)•(0.2p+1)•(p+1)

根据相位稳定的定义,我们需要找到一个频率 Wcp,使得相位满足 -ψ = -180°,即 ψ = 180°。此时系统的相位裕度为 0°,系统处于边缘稳定状态。 首先,我们需要将 W(p) 表示成极点和零点的形式。将分母和分子分别因式分解,得到: W(p) = 30 • (0.1p+1) • (12.5p+1) / [p • (10p+1) • (0.2p+1) • (p+1)] = 375p/(p+1) - 3750/(10p+1) + 750p/(0.2p+1) - 3750p/(10p+1) + 150p/(p+1) + 30 因此,系统的极点为 -1、-0.1、-0.2、