按键控制数码管
时间: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反转
}
}
}
} */
按键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循环中写太多的延时函数,小编完全可以使用中断机制+状态机来识别按键是否按下,这样对其他程序运行的实时性干扰较小