c语言不会,c代码真难写啊!!,学渣的世界,学霸不懂。
stm32按键切换,数码管计数视频:
视频地址:http://player.youku.com/player.php/sid/XODEzOTA0NTky/v.swf
stm32按键切换数码管计数代码:
#include "stm32f10x.h"
#include "stm32_eval.h"
GPIO_InitTypeDef GPIO_InitStructure; //结构体的命名
void RCC_Configuration(void)
{
RCC_DeInit(); //复位外设RCC的所有寄存器至缺省值(默认值)
RCC_HSICmd(ENABLE); //使能外设RCC高速内部时钟
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); //判断RCC的标志位是否被RESET
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); //配置系统的嘀嗒时钟函数
RCC_HSEConfig(RCC_HSE_OFF); //关闭高速外部时钟
RCC_LSEConfig(RCC_LSE_OFF); //关闭低速外部时钟
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_9); // 72HMz
RCC_PLLCmd(ENABLE); //使能外设PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //判断RCC的标志位是否被RESET
RCC_ADCCLKConfig(RCC_PCLK2_Div4); ADC速率为RCC_PCLK2/4 ,配置低速ADC时钟等于SYSCLK/4
RCC_PCLK2Config(RCC_HCLK_Div1); // 配置高速APB时钟等于SYSCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //配置低速APB时钟等于SYSCLK/2
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB时钟 AHB时钟等于SYSCLK
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟SYSCLK=PLL时钟
while(RCC_GetSYSCLKSource() != 0x08); //关闭蜂鸣器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //使能外设 GPIOD端口时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//disable JTAG
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //端口配置PD.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ;//GPIO速率
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO输出模式
GPIO_Init(GPIOD, &GPIO_InitStructure); //应用结构体的成员
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //重置GPIOD.2
}
void GPIO_INIT()//输入输出的初始化
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//使能外设GPIOC端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能外设GPIAC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //端口配置PB.0至PB.7
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速率为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIOS输出模式 (推挽输出)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能外设 GPIOB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|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_Pin_15;//根据设定参数初始化GPIOB.0至GPIOB.7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIOS输出模式 (推挽输出)
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.0至GPIOB.7
}
void delay_us(u32 n) //延时1us
{
u8 j;
while(n--)
for(j=0;j<10;j++);
}
void delay_ms(u32 n) //延时1ms
{
while(n--)
delay_us(1000);
}
//定义一个数组,用来显示数字0到9
int table[10]={GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_8 ,GPIO_Pin_9|GPIO_Pin_12 ,GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_5,
GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_5,GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_8|GPIO_Pin_5,GPIO_Pin_7|GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_8|GPIO_Pin_5,
GPIO_Pin_7|GPIO_Pin_12|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_8|GPIO_Pin_5,GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_12,
GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14,GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_14
};
void s2_20(char temp) //定义一个函数,在数码管上显示数字
{
char ge=0,shi=0; //定义个位 十位
shi=temp/10; //十位
ge=temp%10; //个位
GPIO_SetBits(GPIOB,GPIO_Pin_15); //PB.15 输出高
GPIO_ResetBits(GPIOB,table[shi]);
delay_ms(5);
GPIO_ResetBits(GPIOB,GPIO_Pin_15); //PB.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); //PB.0到PB.15 输出高
GPIO_SetBits(GPIOB,GPIO_Pin_1);//PB.1 输出高
GPIO_ResetBits(GPIOB,table[ge]); //个位上显示的数值
delay_ms(5);
GPIO_ResetBits(GPIOB,GPIO_Pin_1); //PB.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); //PB.0到PB.15 输出高
if(temp>30) //若temp>30
{
GPIO_SetBits(GPIOB,GPIO_Pin_15); //PB.15 输出高
GPIO_ResetBits(GPIOB,table[shi]); //显示十位上的数值
delay_ms(100);
GPIO_ResetBits(GPIOB,GPIO_Pin_15); //PB.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); //PB.0到PB.15 输出高
GPIO_SetBits(GPIOB,GPIO_Pin_1); //PB.1 输出高
GPIO_ResetBits(GPIOB,table[ge]); //个位上显示的数值
delay_ms(150);
GPIO_ResetBits(GPIOB,GPIO_Pin_1); //PB.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); //PB.0到PB.15 输出高
}
}
void func() //定义一个功能函数,使得按键按下去之后,数码管能计数
{
char a = 0, b = 0,count=0; //定义三个计数器。
while(1){
if(!GPIO_ReadInputDataBit (GPIOC,GPIO_Pin_10)) //判断按键是否按下 PC.10
{
delay_ms(100);
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10)) //判断按键是否按下 PC.10
{
count++; //count自加1;
}
}
if(count%2==1){ //对2求余==1;
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)) //判断按键是否按下 PC.8
{ delay_ms(80);
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)) //判断按键是否按下 PC.8
{a++;}
}
if(a>100)
{a=0;} //a>100,a置0;
s2_20(a);
}
if(count%2==0){
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)) //判断按键是否按下 PC.9
{delay_ms(80);
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)){b++;}} //判断按键是否按下 PC.9 b计数器自加1
if(b>100){b=0;} /若b的值大于100,则b清零
s2_20(b);} //调用函数
}
}
int main(void)
{
RCC_Configuration(); //调用函数
GPIO_INIT(); //调用函数
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); //关闭数码管
func(); //调用功能函数
}