学习笔记——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 小时前
数据结构——树
数据结构·笔记·考研
Dizzy.5173 小时前
数据结构(查找)
数据结构·学习·算法
lalapanda4 小时前
Unity学习part4
学习
E___V___E4 小时前
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2
数据库·笔记·mysql
艾格北峰5 小时前
STM32 物联网智能家居 (六) OLED显示设备
arm开发·stm32·单片机·嵌入式硬件·物联网·智能家居
啄缘之间5 小时前
4.6 学习UVM中的“report_phase“,将其应用到具体案例分为几步?
学习·verilog·uvm·sv
爱学习的小王!8 小时前
nvm安装、管理node多版本以及配置环境变量【保姆级教程】
经验分享·笔记·node.js·vue
陈志化8 小时前
JMeter----笔记
笔记·jmeter
viperrrrrrrrrr78 小时前
大数据学习(49) - Flink按键分区状态(Keyed State)
大数据·学习·flink
HollowKnightZ8 小时前
论文阅读笔记:Gated CRF Loss for Weakly Supervised Semantic Image Segmentation
论文阅读·笔记