配置相应的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