0~99按键计数:
GPIO_InitTypeDef GPIO_InitStructure; // 声明一个结构体
void RCC_Configuration(void);
void GPIO_INIT(void) ;
void Function(void) ;
int main(void)
{
RCC_Configuration();
GPIO_INIT();
Function();
}
void RCC_Configuration(void) //复位所有的RCC外围设备寄存器
{
ErrorStatus HSEStartUpStatus; // 设置错误标志量
RCC_DeInit(); //复位RCC模块的寄存器,复位成缺省值
RCC_HSEConfig(RCC_HSE_ON); //开启HSE时钟
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //获取HSE启动状态:
if(HSEStartUpStatus==SUCCESS) //如果HSE启动成功
{
FLASH_PrefetchBufferCmd(ENABLE); //开启FLASH的预取功能
FLASH_SetLatency(FLASH_Latency_2); //FLASH延迟2个周期
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置HCLK,PCLK2,PCLK1,PLL
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_9); // 72HMz
RCC_PLLCmd(ENABLE); //启动PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
{} //等待PLL启动完成
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟
while(RCC_GetSYSCLKSource() != 0x08); //检查是否将HSE 9倍频后作为系统时钟
}
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//改变管脚的映射SWJ使能选择用于事件输出的GPIO端口
/*蜂鸣器*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //使能所有要用APB2的外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //选中2引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 引脚频率50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //引脚设置推拉输出
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
void delay_us(u32 n) //延时函数
{
u8 j;
while(n--)
for(j=0;j<10;j++);
}
void delay_ms(u32 n) //延时函数
{
while(n--)
delay_us(1000);
}
void GPIO_INIT(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB, ENABLE); //使能所有要用APB2的外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //选中8,9,10,11引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 引脚频率50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //引脚设置推拉输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_1|GPIO_Pin_15|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;//数码管
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 引脚频率50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
}
void Number(int a) //数码管显示数字
{
switch(a)
{
case 0 : GPIO_ResetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);break;
case 1 : GPIO_ResetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_12);break;
case 2 : GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_13|GPIO_Pin_14);break;
case 3 : GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_14);break;
case 4 : GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12);break;
case 5 : GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_12|GPIO_Pin_14);break;
case 6 : GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);break;
case 7 : GPIO_ResetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_12);break;
case 8 : GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);break;
case 9 : GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_14); break;
}
}
void Function(void)
{
int i=0,j=0; //i被按下的次数,n延时变量
GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
delay_ms(50); //关闭数码管
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_1); //打开个位数码管
Number(i); //用switch函数显示00
delay_ms(50);
GPIO_ResetBits(GPIOB,GPIO_Pin_1); //关闭个位
GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
GPIO_SetBits(GPIOB,GPIO_Pin_15); //打开十位
Number(j);
delay_ms(50);
GPIO_ResetBits(GPIOB,GPIO_Pin_15); //关掉十位数码管
GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)) //判断按键是s1否被按下
{
delay_ms(50); //延时消抖
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)) //再次判断按键是s1否被按下
{
i++; //按键被按下,个位+1
if(i==10)
{
j++;
i=0;
}
if(j==10)
{
j=0;
i=0;
}
}
}