学习笔记——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->EXTICR3 &= ~(0xF << 8); //清除EXTI11-8位

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

}

}

相关推荐
John_ToDebug5 小时前
判断力无法被 AI 替代,但它正在被你亲手扔掉
经验分享·笔记
secondyoung5 小时前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
sunshine22 girl5 小时前
Java学习二 基本语法2, 算术运算符
java·学习
anew___5 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
柳鲲鹏6 小时前
运气学概论:提纲草案
笔记
Zw-awa7 小时前
001-01-从C语言的main到STM32的main-你的代码后来去了哪里
stm32
衡石科技8 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
传奇开心果编程9 小时前
【Xilem基础语法学与练】第7课:Xilem与Masonry底层构建技术解析
学习·rust·前端框架
疯狂打码的少年9 小时前
【计算机网络】子网掩码与子网划分计算(含CIDR表示法)
服务器·笔记·计算机网络·php
想要入门的程序猿9 小时前
回调函数学习
java·网络·学习