微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 按键控制数码管

按键控制数码管

时间:10-02 整理:3721RD 点击:
/*
    按键pd5控制数码管pb0-pb2,pb8.pb9,pb5-pb7
*/
#include "stm32f10x.h"
void Delay (uint32_t nCount)
{
         for(;nCount!=0;nCount--);
}
  GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
unsigned  char a=0;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //初始化GPIOB时钟
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); //将GPIOF.6~9复位,关掉LED灯

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);         //初始化GPIOD时钟
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;                                  //引脚设置
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;                           //上拉输入
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  while (1)
  {
          //GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10);
          if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)) //发现按键KEY被按下
        {
          Delay(0xfff); //延时消斗
          if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5))//再次检测按键是否仍然被按下
          {
           while(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5));//等待按键被放开
           ++a;
            if(a==11)
             a=1;
           if(a==1)
                        { GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);                                                                                //0
                         GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_5);
                         }
           if(a==2)
                         { GPIO_ResetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_2);                  //1
                         GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
                         }
           if(a==3)
                         { GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_6 );           //2
                         GPIO_SetBits(GPIOB,GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_7);
                         }
           if(a==4)
                         { GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_5|GPIO_Pin_7);          //3
                         GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_6);
                         }
           if(a==5)
                         { GPIO_ResetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_6);           //4
                         GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_7);
                         }
           if(a==6)
                         { GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_5|GPIO_Pin_6);          //5
                         GPIO_SetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_9|GPIO_Pin_7);
                         }
           if(a==7)
                         { GPIO_SetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_7);                 //6
                         GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_5|GPIO_Pin_6);
                         }
           if(a==8)
                         { GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);                         //7
                          GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
                         }
           if(a==9)                  
                         {
                          GPIO_SetBits(GPIOB,GPIO_Pin_7);                  //8
                         GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_5|GPIO_Pin_6);
                         }
           if(a==10)
                         {
                          GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_7);           //9
                         GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_5|GPIO_Pin_6);
                         }
          }
}
  }
}

/***********************************************
按键控制流水灯        按键pd5控制pb0灯
********************************** /
#include "stm32f10x.h"
void Delay(unsigned int i)
{
        unsigned int j;
        for(;i>0;i--)
                for(j=0;j<1000;j++);
}
void Key_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//开启按键S4端口(PD5)的时钟
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  
        GPIO_Init(GPIOD, &GPIO_InitStructure); // PD5这个引脚设置为上拉输入
}
void Led_GIPO_Confing(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                //使能PB端口时钟
        
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //LED0-->PB.0端口配置(对应我们的学习板是D4那个LED发光二级管)
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);                                 //根据设定参数初始化GPIOB.0
// GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
int main(void)
{        
Key_GPIO_Config();
Led_GIPO_Confing();                                                
while(1)
{
    if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)==0 ) //检测一下按键是否按下
          {           
                 
                  Delay(1000);// 延时消抖               
                           if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)==0 )  
                        {         
                                                
                         while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)==0);  //等待按键释放  
                                                         
                     GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0))));//LED0反转         
                        }
                        
                }
        
}
} */



非常感谢小编分享,其实小编在大型项目中,最好不要在while循环中写太多的延时函数,小编完全可以使用中断机制+状态机来识别按键是否按下,这样对其他程序运行的实时性干扰较小

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top