#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;
}
}
}
![](http://forum.eepw.com.cn/pub/k4110/plugins/emoticons/images/5.gif)
虽然是借助大神的,还是勉强完成了!