用触摸按键控制流水灯流水方向或暂停 工程4

本文介绍了一个基于STM32微控制器的GPIO配置示例,详细展示了如何设置输入和输出引脚,并通过触摸按键控制LED灯的切换。代码中包含了GPIO初始化、延迟函数和主循环逻辑,适用于嵌入式系统开发的学习者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 接线规则
  • 除电源外LED灯接A0-A5,触摸按键接A6A7B0B1
  • 注:LED为共阳极
  #include"stm32f10x.h"
    #include"delay.h"
    #define ABC Delay(0x4FFFFF);
    #define ABD Delay(0x0FFFFF);
    #define ABE Delay(0x04FFFF);
    /*
    
    Author: Skye99
    Github: Skye99
    
    */
    
    void GPIO_Config()
    {
    	GPIO_InitTypeDef arms;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	arms.GPIO_Pin=GPIO_Pin_6;
    	arms.GPIO_Mode=GPIO_Mode_IPD;
    	GPIO_Init(GPIOA,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	arms.GPIO_Pin=GPIO_Pin_7;
    	arms.GPIO_Mode=GPIO_Mode_IPD;
    	GPIO_Init(GPIOA,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    	arms.GPIO_Pin=GPIO_Pin_0;
    	arms.GPIO_Mode=GPIO_Mode_IPD;
    	GPIO_Init(GPIOB,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    	arms.GPIO_Pin=GPIO_Pin_1;
    	arms.GPIO_Mode=GPIO_Mode_IPD;
    	GPIO_Init(GPIOB,&arms);
    
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	arms.GPIO_Mode=GPIO_Mode_Out_PP;
    	arms.GPIO_Pin=GPIO_Pin_0;
    	arms.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	arms.GPIO_Mode=GPIO_Mode_Out_PP;
    	arms.GPIO_Pin=GPIO_Pin_1;
    	arms.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	arms.GPIO_Mode=GPIO_Mode_Out_PP;
    	arms.GPIO_Pin=GPIO_Pin_2;
    	arms.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	arms.GPIO_Mode=GPIO_Mode_Out_PP;
    	arms.GPIO_Pin=GPIO_Pin_3;
    	arms.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
    	arms.GPIO_Mode=GPIO_Mode_Out_PP;
    	arms.GPIO_Pin=GPIO_Pin_4;
    	arms.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&arms);
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	arms.GPIO_Mode=GPIO_Mode_Out_PP;
    	arms.GPIO_Pin=GPIO_Pin_5;
    	arms.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&arms);
    
    }
    
    void Delay(__IO uint32_t nCount)
    {
    	for(; nCount != 0; nCount--);
    }
    
    int main()
    {
    	int i=0;
    	int c=0;
    	int choose=0;
    	GPIO_Config();
    	while(1)
    	{
    	if(GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_6)==1)
    {
      while(GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_6)==1);
    	choose=1;
    }
    if(GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_7)==1)
    {
      while(GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_7)==1);
    	choose=2;
    }
    if(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_0)==1)
    {
      while(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_0)==1);
    	choose=3;
    }
    if(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_1)==1)
    {
      while(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_1)==1);
    	choose=4;
    }
    if(choose==2)
    {
    	c=99;
    }
    if(choose==1)
    {
    	switch(c){
    		case 0:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_5);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    		ABE;c++;break;}
    		case 1:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_0);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
    		ABE;c++;break;}
    		case 2:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_1);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
    		ABE;c++;break;}
    		case 3:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_2);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_3);
    		ABE;c++;break;}
    		case 4:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_3);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
    			ABE;c++;break;}
    		case 5:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_4);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
    			ABE;c++;break;}
    		case 99:{break;}
    	}
    }
    if(choose==3)
    {
    	switch(c){
    	case 0:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_0);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
    		ABE;c++;break;}
    		case 1:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_5);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
    		ABE;c++;break;}
    		case 2:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_4);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_3);
    		ABE;c++;break;}
    		case 3:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_3);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
    		ABE;c++;break;}
    		case 4:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_2);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
    			ABE;c++;break;}
    		case 5:{
    		GPIO_SetBits(GPIOA,GPIO_Pin_1);
    		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    			ABE;c++;break;}
    		case 99:{break;}
    	}
    }
    	if(c>=6)
    	{c=0;}
    } 
    }`

在这里插入图片描述

### 触摸按键控制流水灯的PCB设计 #### 硬件电路设计 对于触摸按键控制流水灯的设计,首先需要考虑的是硬件电路的选择与布局。在单片机控制系统中,触摸按键可以通过电容感应来检测触碰动作[^1]。为了实现这一功能,通常会在PCB板上布置特定形状的铜箔区域作为触摸传感器,并连接到单片机的一个输入端口。 #### 单片机选型与接口配置 选用合适的单片机至关重要。考虑到成本效益以及开发便利性,可以选择STM32系列其他具有内置ADC模块和支持低功耗特性的MCU型号。这些特性使得它们非常适合用于处理来自触摸按键信号并执行相应的灯光效果逻辑运算[^4]。 #### Protues仿真环境搭建 使用Protues软件可以先构建虚拟原型来进行初步测试。创建项目时应包括如下组件: - MCU芯片及其最小系统; - LED阵列模拟流水灯效果; - 触摸按键模型; 完成上述设置之后即可编写驱动代码并通过Keil工具链编译下载至目标设备,在此过程中还可以借助于Proteus提供的交互式界面观察实际运行状况以便及时调整参数设定。 #### C语言编程实现 针对该应用案例而言,主要任务在于定义好各个状态之间的转换关系,即当某个指定位置上的触摸按键被触发后应该如何改变当前显示模式。以下是简化版伪代码示例: ```c #include "stm32f10x.h" void Delay(__IO uint32_t nCount); uint8_t Get_Touch_Status(void); int main() { // 初始化GPIO和其他外设... while (1) { if(Get_Touch_Status()){ Change_Light_Pattern(); Delay(500); // 防抖动延时 } Update_LEDs(); // 更新LED状态 } } ``` 这段代码展示了基本框架,其中`Get_Touch_Status()`函数负责读取触摸按键的状态变化,而`Change_Light_Pattern()`则用来切换不同的流水灯样式。 #### PCB布线注意事项 在进行最终实物制作之前还需要注意一些细节问题,比如确保电源层和地平面的良好分布以减少噪声干扰;合理安排元件间距避免短路风险;为提高抗电磁辐射能力可以在适当的位置增加屏蔽罩等措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值