外中断控制多位数码管显示

配置相应的GPIO口为外中断口,数码管初始显示数字000,按下KEY1,使数字加1,加到999为止;按下KEY2使数字减1,减到0为止;按下KEY3,数码管显示位置左移一位,直到顶格为止;按下KEY4,数码管显示位置右移一位,直到顶格为止。

#include "stm32f10x.h"

#include "key.h"

#include "led.h"

extern uint8_t table[];     extern uint8_t wei[];

extern int i; extern int index_1; extern int index_2; extern int index_3; extern int g;  extern int s;  extern int b;

int main()

{

delay_init();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                 手册13.2.3    P165

KEY_Init();

LED_Init();

GPIO_SetBits(GPIOB,GPIO_Pin_All);

while(1)

{

Select(i,b,s,g,index_1,index_2,index_3);

}

}

key.c

#include "stm32f10x.h"

#include "key.h"

#include "sys.h"

uint8_t table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

int i = 0;

int index_1 = 0;   int index_2 = 1;   int index_3 = 2;

uint8_t wei[]={0x0df,0x0ef,0x0f7,0x0fb,0x0fd,0x0fe};

int g;int s;int b;

void KEY_Init()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA , GPIO_PinSource1);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA , GPIO_PinSource2);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA , GPIO_PinSource3);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA , GPIO_PinSource4);           手册10.2.17

EXTI_InitTypeDef EXTI_InitStructure;

EXTI_InitStructure.EXTI_Line = EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4; //外部线路

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                    手册8.2.2    P100

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 手册 13.2.4    P167

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;

NVIC_Init(&NVIC_InitStructure);

}

void EXTI1_IRQHandler()

{

if(i < 999)  i++;   g = i % 10;   s = i / 10 % 10;   b = i / 100;

EXTI_ClearITPendingBit(EXTI_Line1);

}

void EXTI2_IRQHandler()

{

if(i > 0)  i--;   g = i % 10;    s = i / 10 % 10;   b = i / 100;

EXTI_ClearITPendingBit(EXTI_Line2);

}

void EXTI3_IRQHandler()

{

if(index_1 > 0)

{

index_1--;  index_2--;  index_3--;

}

GPIO_SetBits(GPIOB,GPIO_Pin_All);

GPIO_ResetBits(GPIOB,wei[index_1] | wei[index_2] | wei[index_3]);

EXTI_ClearITPendingBit(EXTI_Line3);

}

void EXTI4_IRQHandler()

{

if(index_3 < 5)

{

index_1++;   index_2++;   index_3++;

}

GPIO_SetBits(GPIOB,GPIO_Pin_All);

GPIO_ResetBits(GPIOB,wei[index_1] | wei[index_2] | wei[index_3]);

EXTI_ClearITPendingBit(EXTI_Line4);

}

void Select(int i,int b,int s,int g,int index_1,int index_2,int index_3)

{

GPIO_Write(GPIOB,wei[index_1]);

GPIO_Write(GPIOC,table[b]);   delay(120);

GPIO_Write(GPIOB,wei[index_2]);

GPIO_Write(GPIOC,table[s]);   delay(120);

GPIO_Write(GPIOB,wei[index_3]);

GPIO_Write(GPIOC,table[g]);   delay(120);

}

key.h

#ifndef _key_H

#define _key_H

#include "sys.h"

#define KEY1 PAin(1)

#define KEY2 PAin(2)

#define KEY3 PAin(3)

#define KEY4 PAin(4)

void KEY_Init(void);

void Select(int i,int b,int s,int g,int index_1,int index_2,int index_3);

#endif

led.c

#include "stm32f10x.h"

#include "led.h"

void LED_Init()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                        手册10.2.3  P125

GPIO_Init(GPIOC, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

led.h

#ifndef _led_H

#define _led_H

void LED_Init(void);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值