【最终程序:http://forum.eepw.com.cn/thread/261214/3/#28】
【已解决:各位十位分别用Num函数输出前都应该使数码管所有的灯关掉,不知为何不关掉的话十位也会不听控制跳出别的数字】
为什么显示的数字两个同时显示同一个数目,完全不管下面的分十位,个位分别显示呢??
【已解决:按键管脚没有改成GPIO_Mode_IN_FLOATING;难怪不听控制】
这个程序是希望先实现按键s1按下,数码管加1
没有按下按键,为何两数码管自己跳动
如“11、44、88、55”这样不规律地跳
找半天不明白什么回事,求不吝赐教
程序如下:
#include "stm32f10x.h" #include "stm32_eval.h" GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体 /*延时函数 微秒*/ 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() { //使能GPIO时钟 PB RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //RCC_APB2Periph_GPIOB 开启GPIOB的时钟 ENABLE\DISABLE 打开or关闭 //结构体配置 GPIO_InitStructure.GPIO_Pin = 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_1|GPIO_Pin_15;//数码管使用PB^5-9 12-14 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度:配置晶振 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //模式:Out_PP推挽输出,可做输出,输入 //GPIO PB初始化 GPIO_Init(GPIOB, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //RCC_APB2Periph_GPIOB 开启GPIOB的时钟 ENABLE\DISABLE 打开or关闭 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//按键使用PC8-11 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度:配置晶振 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //模式:Out_PP推挽输出,可做输出,输入 GPIO_Init(GPIOC, &GPIO_InitStructure); } void Num(int z) { switch(z)//分别点亮对应数字的数码管 { 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; } } int main() { int i=0,g=0,s=0; //i被按下的次数,g个位的数,s十位的数 GPIO_INIT(); while(1) { GPIO_SetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_15);//由于s1,s2两数码管分别接有三极管,须将B1,B15输出高电平,使三极管导通 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(100); //关闭全部所用管脚 Num(g); delay_ms(400); //用switch函数分别点亮个位,十位 Num(s); delay_ms(400); if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)) //判断按键是否被按下 { delay_ms(100); //延时去抖 if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)) //判断按键是否被按下 假如端口PC8为低电平 { i=i+1; //按键被按下,个位+1 g=i%10; //取余,求出个位 if(g==9) //如果个位到了9 { g=0; //个位回到0 s=s+1; //十位加1 } } } } }