【最终程序: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
}
}
}
}
}
我要赚赏金
