#include "stm32f10x.h" 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(); //*等待外部高速时钟晶振工作: if(HSEStartUpStatus==SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1);//*AHB使用系统时钟,负责外部存储器的时钟 RCC_PCLK1Config(RCC_HCLK_Div2);//*APB1 负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM RCC_PCLK2Config(RCC_HCLK_Div1);//*APB2负责AD,I/O,高级TIM,串口1 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//*设置PLL输入时钟源72M RCC_PLLCmd(ENABLE);//*打开PLL: while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//*等待PLL工作: RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//*设置系统时钟 while(RCC_GetSYSCLKSource() != 0x08);//* 判断PLL是否是系统时钟: } GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//改变管脚的映射SWJ使能,禁用JTAG,选择用于事件输出的GPIO端口 /*蜂鸣器*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //# 使能被重新映射到GPIOD时钟和使能复用时钟功能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //#管脚号 关闭蜂鸣器 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //#输出速度 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //#推挽输出 GPIO_Init(GPIOD, &GPIO_InitStructure); //#初始化 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); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度 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; 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(t); 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(t); 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; } } }
虽然是借助大神的,还是勉强完成了!