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

news2024/11/19 3:23:55

一.硬件

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1099: 希尔排序算法实现

解法&#xff1a; 希尔增量选定n/2&#xff0c; #include<iostream> #include<vector> using namespace std; int main() {int n;cin >> n;vector<int> vec(n);for (int i 0; i < n; i) cin >> vec[i];int d n / 2;for (int i 0; i <…

大摩:AI PC渗透率到2028年将达65%,联想和戴尔是最大受益者

报告预计&#xff0c;当AI PC的渗透率在2025年达到20%时&#xff0c;PC出货量将加速增长&#xff1b;微软的“CopilotPC”将成为AI PC第一个“杀手级应用”。 报告正文 从苹果M4芯片、高通骁龙X的发布&#xff0c;再到微软推出重磅“CopilotPC”&#xff0c;AI PC逐渐成为市场…

AI应用案例:服务器智能分析管理系统

服务器硬件配置、性能状态、所运行的应用系统等信息分散于多个不同的信息管理系统。人为查询判断现有的服务器资源是否满足用户需求&#xff0c;且需结合资产管理系统与Maximo基础资源、性能监控、运维管理等各个系统互不关联&#xff0c;数据分散不能为运维管理提供完整一致的…

MySql--表的基本查询(CRUD)

CRUD : Create( 创建 ), Retrieve( 读取 ) &#xff0c; Update( 更新 ) &#xff0c; Delete &#xff08;删除&#xff09; 1.insert 基本插入 创建一张表&#xff1a; -- 创建一张学生表 CREATE TABLE students ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, sn INT NO…

【软件设计师】大题

一、数据流图 基础知识 数据流图&#xff08;Data Flow Diagram,DFD&#xff09;基本图形元素&#xff1a; 外部实体&#xff08;External Agent&#xff09; 表示存在于系统之外的对象&#xff0c;用来帮助用户理解系统数据的来源和去向加工&#xff08;Process&#xff09;数…

Python设计模式之适配器模式

目录 一、适配器模式 适配器模式的组成部分 适配器模式的种类 应用场景 实现步骤 二、测试例子 一、适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将一个现有接口转换为另一个期望的接口来让不兼容的接口能够合作…

渗透测试 一个很奇怪的支付漏洞

新手实战刷课网站、好玩又有趣&#xff01; 第一步 打开网站、任意账户名密码登陆发现验证码可重复利用 这时候我们可以试试admin账号、发现如果账号正确会提示账户已存在、反之回显账户密码错误 第二步 既然验证码可以重复利用&#xff1b;而且账号名有回显 这时候我们试…

DNS服务的部署与配置(1)

一、DNS的定义 1、域名系统&#xff08;英文&#xff1a;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。 它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。 DNS使用UDP端口53。 当前&#xff0…

SpringBoot 集成 Nebula

工作需求&#xff0c;开始了解图数据库&#xff0c;经过工具选型&#xff0c;最终选择nebula graph&#xff0c;并集成到springboot&#xff0c;java 环境下如何对 Nebula Graph 进行操作&#xff0c;本文整理下过程。 1、首先引入 pom 依赖 <dependency><groupId&g…

安全访问python字典:避免空键错误的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、直接访问字典键的问题 三、使用get方法安全访问字典键 四、get方法的实际应…

v-model详解

目录 原理 作用 表单类组件封装 ​编辑v-model简化代码 原理 v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是value属性和input属性的合写。 作用 提供数据的双向绑定。 数据变&#xff0c;视图跟着变:value视图变&#xff0c;数据跟着变input 注意&…

【C++】AVL树和红黑树模拟实现

AVL树和红黑树 1. 背景2. AVL树的概念3. AVL树节点的定义4. AVL树的插入5. AVL树的旋转5.1. 左单旋5.2. 右单旋5.3. 左右单旋5.4. 右左单旋5.5. 旋转总结 6. AVL树的验证7. AVL树的性能8. 红黑树的概念9. 红黑树的节点的定义10. 红黑树的插入10.1. 情况一10.2.情况二 11. 红黑树…

2024电工杯数学建模B题高质量成品论文,包括代码数据

2024电工杯数学建模B题高质量成品论文&#xff0c;包括代码数据 完整内容见文末名片 摘要 大学时期是学生们知识学习和身体成长的重要阶段&#xff0c;良好的饮食习惯对于促进生长发育和保证身体健康具有重要意义。针对当前大学生中存在的饮食结构不合理及不良饮食习惯的问题…

React useState数组新增和删除项

在React中&#xff0c;我们可以使用useState钩子来管理组件的状态&#xff0c;其中包括数组。如何在React函数组件中对数组进行增加和删除项的操作&#xff1f; 新增项时&#xff1a;我们可以对原数组进行解构&#xff0c;并把新增项一起加入到新数组&#xff1b; 删除项时&…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题&#xff1a;大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

IT行业已经饱和?2024年报考计算机类专业还有出路吗?

&#x1f446;点击关注 获取更多编程干货&#x1f446; “高薪”光环加持&#xff0c;IT行业一直是不少人心仪的职业选择&#xff0c;计算机专业一度成为最热门的本科专业。 然而&#xff0c;正因报考计算机专业、想要入行IT行业的人越来越多&#xff0c;“行业饱和”、“人才…

探数API统计分享-2017年-2021年中国各省人均消费支出统计

根据2017年至2021年的统计数据&#xff0c;我国各省&#xff08;市、区&#xff09;的人均消费支出情况各不相同。其中&#xff0c;上海的人均消费支出最高&#xff0c;达到了2021年的48879元&#xff0c;位居全国之首。紧随其后的是北京&#xff0c;人均消费支出为43640元。 …

Vivado 使用教程(个人总结)

Vivado 是 Xilinx 公司推出的一款用于 FPGA 设计的集成开发环境 (IDE)&#xff0c;提供了从设计输入到实现、验证、调试和下载的完整流程。本文将详细介绍 Vivado 的使用方法&#xff0c;包括项目创建、设计输入、约束文件、综合与实现、仿真、调试、下载配置等步骤。 一、创建…

如何生成Github Badge徽章图标

如何生成徽章Badge 什么是徽章(Badge)生成小徽章shields网站开源项目的徽章lib版本徽章代码测试覆盖度开源协议Github workflow的徽章 开源代码实践效果py-enumjs-enumerate 什么是徽章(Badge) 在开源项目的README中&#xff0c;经常会见到一些徽章(Badge)小图标&#xff0c;如…

抽烟行为检测:从传统巡查到智能算法

在当前人工智能和计算机视觉技术的迅猛发展下&#xff0c;基于视觉分析的抽烟行为检测算法成为一种高效的技术手段。此类算法通常依赖于深度学习模型&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通过对摄像头捕捉的视频流进行实时分析&#xff0c;能…