学习笔记——STM32F103的V3版本——3*3矩阵键盘控制数码管

一.硬件

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挂起标志位

}

}

相关推荐
执笔论英雄1 小时前
【大模型学习cuda】入们第一个例子-向量和
学习
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
ouliten2 小时前
cuda编程笔记(36)-- 应用Tensor Core加速矩阵乘法
笔记·cuda
孞㐑¥3 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Gary Studio4 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice4 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
工程师老罗4 小时前
YOLOv1 核心知识点笔记
笔记·yolo
lingggggaaaa4 小时前
安全工具篇&动态绕过&DumpLsass凭据&Certutil下载&变异替换&打乱源头特征
学习·安全·web安全·免杀对抗
PP东4 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
学电子她就能回来吗4 小时前
深度学习速成:损失函数与反向传播
人工智能·深度学习·学习·计算机视觉·github