一.硬件
1.数码管
2.3*3的矩阵键盘(自己做的模块(手残党一枚))
3.总体连接
二.在Keil5中的部分软代码
test.c中:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "exti.h"
//MCU会在外部中断时发生自动处理
int main(void)
{
vu8 t;
Stm32_Clock_Init(9); //初始化系统时钟为72MHZ
delay_init(72); //初始化延时函数
uart_init(72, 9600); // 舒适化串口,波特率为9600
LED_Init(); // 初始化LED
EXTI_Init(); // 初始化外部中断
while(1)
{
t=KEY_Scan(); //获取按键值
printf("t的值为:%d\n",t);
switch(t)
{
case 1:
printf("你按下了:1\r\n");
LED_1();
break;
case 2:
printf("你按下了:2\r\n");
LED_2();
break;
case 3:
printf("你按下了:3\r\n");
LED_3();
break;
case 4:
printf("你按下了:4\r\n");
LED_4();
break;
case 5:
printf("你按下了:5\r\n");
LED_5();
break;
case 6:
printf("你按下了:6\r\n");
LED_6();
break;
case 7:
printf("你按下了:7\r\n");
LED_7();
break;
case 8:
printf("你按下了:8\r\n");
LED_8();
break;
case 9:
printf("你按下了:9\r\n");
LED_9();
break;
default:
printf("无按键按下\r\n");
delay_ms(1000);
break;
}
}
}
led.c中:
#include "sys.h"
#include "led.h"
void LED_Init(void)
{
RCC->APB2ENR |= 1 << 2; // Enable GPIOA clock
RCC->APB2ENR |= 1 << 5; // Enable GPIOD clock
// Configure GPIOA pins for LED control
GPIOA->CRL &= 0X00000000; // Clear configuration for GPIOA pins
GPIOA->CRL |= 0x33333333; // Set GPIOA pins as general purpose output push-pull
JTAG_Set(SWD_ENABLE); // Enable SWD for debugging
GPIOA->ODR &= 0X00000000; // Clear GPIOA output data register
}
void LED_1(void)
{
PAout(1) = 1;
PAout(2) = 1;
PAout(0) = 1;
PAout(5) = 0;
PAout(6) = 1;
PAout(7) = 1;
PAout(3) = 1;
PAout(4) = 0;
}
void LED_2(void)
{
PAout(1) = 0;
PAout(2) = 1;
PAout(0) = 0;
PAout(5) = 0;
PAout(6) = 0;
PAout(7) = 1;
PAout(3) = 0;
PAout(4) = 1;
}
void LED_3(void)
{
PAout(1) = 0;
PAout(0) = 0;
PAout(2) = 0;
PAout(5) = 1;
PAout(6) = 0;
PAout(7) = 1;
PAout(3) = 0;
PAout(4) = 1;
}
void LED_4(void)
{
PAout(1) = 0;
PAout(0) = 1;
PAout(5) = 1;
PAout(6) = 0;
PAout(7) = 1;
PAout(2) = 0;
PAout(3) = 1;
PAout(4) = 0;
}
void LED_5(void)
{
PAout(1) = 1;
PAout(0) = 0;
PAout(5) = 1;
PAout(6) = 0;
PAout(7) = 1;
PAout(3) = 0;
PAout(2) = 0;
PAout(4) = 0;
}
void LED_6(void)
{
PAout(1) = 1;
PAout(0) = 0;
PAout(5) = 0;
PAout(6) = 0;
PAout(7) = 1;
PAout(3) = 0;
PAout(4) = 0;
PAout(2) = 0;
}
void LED_7(void)
{
PAout(1) = 0;
PAout(0) = 0;
PAout(5) = 1;
PAout(6) = 1;
PAout(7) = 1;
PAout(2) = 0;
PAout(3) = 1;
PAout(4) = 1;
}
void LED_8(void)
{
PAout(1) = 0;
PAout(0) = 0;
PAout(2) = 0;
PAout(5) = 0;
PAout(6) = 0;
PAout(7) = 1;
PAout(3) = 0;
PAout(4) = 0;
}
void LED_9(void)
{
PAout(1) = 0;
PAout(0) = 0;
PAout(5) = 1;
PAout(6) = 0;
PAout(7) = 1;
PAout(3) = 0;
PAout(4) = 0;
PAout(2) = 0;
}
exti.c中:
#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
//外部中断初始化函数
void EXTI_Init(void)
{
//配置外部中断出发方式
AFIO->EXTICR[3] &= ~(0xF << 8); //清除EXTI11-8位
AFIO->EXTICR[3] |= 0x1000; //EXTI11配置端口
EXTI->FTSR |= (1 << 11); // 配置EXIT11为下降沿触发
EXTI->IMR |= (1 << 11); // 使能EXTI11中断
NVIC_EnableIRQ(EXTI15_10_IRQn); // 在NVIC中使能EXTI15_10中断
}
//外部中断处理函数
void EXTI_IRQHandler(void)
{
if (EXTI->PR & (1 << 11))
{
vu8 key = KEY_Scan();
switch(key)
{
case 1:
printf("你按下了:1\r\n");
LED_1();//ÏÔʾ¶ÔÓ¦Êý×Ö
break;
case 2:
printf("你按下了:2\r\n");
LED_2();
break;
case 3:
printf("你按下了:3\r\n");
LED_3();
break;
case 4:
printf("你按下了:4\r\n");
LED_4();
break;
case 5:
printf("你按下了:5\r\n");
LED_5();
break;
case 6:
printf("你按下了:6\r\n");
LED_6();
break;
case 7:
printf("你按下了:7\r\n");
LED_7();
break;
case 8:
printf("你按下了:8\r\n");
LED_8();
break;
case 9:
printf("你按下了:9\r\n");
LED_9();
break;
default:
printf("无按键按下\r\n");
delay_ms(1000);
break;
}
EXTI->PR |= (1 << 11); //清除EXTII挂起标志位
}
}