学习笔记——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挂起标志位
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NumPy】全面解析NumPy的bitwise_xor函数:高效按位异或操作指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【实战JVM】-基础篇-04-自动垃圾回收

【实战JVM】-基础篇-04-自动垃圾回收 自动垃圾回收1 多语言内存管理1.1 C/C的内存管理1.2 Java的内存管理1.3 自动与手动对比1.4 应用场景 2 方法区的回收2.1 回收条件 3 堆回收3.1 判断是否被引用3.1.1 引用计数法3.1.2 可达性分析算法3.1.2.1 GC Root3.1.2.2 监视GC Root3.1.…

如何用分立器件设计一个过流保护电路

过流保护电路是指当后级负载电流过大或者发生短路时&#xff0c;自动切断电源与后级负载&#xff0c;从而防止大电流损害电源电路&#xff0c;过流保护又叫OCP。 常见的过流保护电路有保险丝过流保护&#xff0c;集成的过流保护芯片&#xff0c;还有这种分立器件搭建的过流保护…

检索模型预训练方法:RetroMAE

论文title&#xff1a;https://arxiv.org/pdf/2205.12035RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder 论文链接&#xff1a;https://arxiv.org/pdf/2205.12035 摘要 1.一种新的MAE工作流&#xff0c;编码器和解器输入进行了不同的掩…

React@16.x(12)ref 转发-forwardRef

目录 1&#xff0c;介绍2&#xff0c;类组件如何使用4&#xff0c;应用场景-高阶组件HOC 1&#xff0c;介绍 上篇文章中提到&#xff0c;ref 只能对类组件使用&#xff0c;不能对函数组件使用。 而 ref 转发可以对函数组件实现类似的功能。 使用举例&#xff1a; import Re…

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测预测效果基本介绍程序设…

【CCF-CSP】202309-1 202309-2 坐标变换

坐标变换&#xff08;其一&#xff09; 代码&#xff1a; #include <bits/stdc.h> using namespace std; int main(){int n,m,x,y,sumx0,sumy0;cin>>n>>m;for(int i1;i<n;i){cin>>x>>y;sumxx,sumyy;}for(int i1;i<m;i){cin>>x>&…

用天工AI写文章,节约了8个人的成本

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 当下AI工具最大的问题是什么? 是写的文章没有灵魂、没有感情、像机器人! 生成的文章官话连篇&#xff0c;人们一眼就看出是AI写的&#xff0c;这种文章怎么能给客户交差呢?自己这关都过不去&#xff0c;是吧? …

md5强弱碰撞

一&#xff0c;类型。 1.弱比较 php中的""和""在进行比较时&#xff0c;数字和字符串比较或者涉及到数字内容的字符串&#xff0c;则字符串会被转换为数值并且比较按照数值来进行。按照此理&#xff0c;我们可以上传md5编码后是0e的字符串&#xff0c;在…

四川汇聚荣聚荣科技有限公司好不好?

在当今科技飞速发展的时代&#xff0c;企业要想在激烈的市场竞争中脱颖而出&#xff0c;必须具备强大的技术实力和良好的市场口碑。那么&#xff0c;作为一家专注于科技创新的公司&#xff0c;四川汇聚荣聚荣科技有限公司究竟如何呢?接下来&#xff0c;我们将从四个方面进行详…

K210 数字识别 教程

一、烧写固件 连接k210开发板&#xff0c;点开烧录固件工具&#xff0c;选中固件&#xff0c;并下载 二、模型训练 网站&#xff1a;MaixHub 1、上传文件 2、开始标记数据 添加9个标签&#xff0c;命名为1~9&#xff0c;按键盘w开始标记&#xff0c;键盘D可以下一张图片&…

YashanDB携手慧点科技完成产品兼容认证 助力国产信创生态建设

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与慧点科技顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;共同支撑政府、企业、金融等办公应用场景下的数字化转型升级&#xff0c;为企业的信息技术应用创新提供坚…

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…

【C++】<知识点> 标准模板库STL(下)

文章目录 六、set与multiset 1. 常用成员函数 2. pair模板 3. set 4. multiset 七、map与multimap 1. map 2. multimap 3. 应用实例 八、容器适配器 1. stack 2. queue 3. priority_queue 九、算法 六、set与multiset 1. 常用成员函数 iterator find(const T&am…

Kubernetes和Docker对不同OS和CPU架构的适配关系

Docker Docker官网对操作系统和CPU架构的适配关系图 对于其他发行版本&#xff0c;Docker官方表示没有测试或验证在相应衍生发行版本上的安装&#xff0c;并建议针对例如Debian、Ubuntu等衍生发行版本上使用官方的对应版本。 Kubernetes X86-64 ARM64 Debian系 √ √ Re…

鸿蒙学习第一课--认识目录结构

项目结构介绍 module.json5 src > main > module.json5&#xff1a;Stage模型模块配置文件。主要包含HAP包的配置信息、应用/服务在具体设备上的配置信息以及应用/服务的全局配置信息。具体的配置文件说明&#xff0c;详见module.json5配置文件。 资源分类和访问 关于s…

【C++题解】1133. 字符串的反码

问题&#xff1a;1133. 字符串的反码 类型&#xff1a;字符串 题目描述&#xff1a; 一个二进制数&#xff0c;将其每一位取反&#xff0c;称之为这个数的反码。下面我们定义一个字符的反码。 如果这是一个小写字符&#xff0c;则它和字符 a 的距离与它的反码和字符 z 的距离…

《当微服务遇上Ribbon:一场负载均衡的华丽舞会》

在微服务的厨房里&#xff0c;如何确保每一道服务都恰到好处&#xff1f;揭秘Spring Cloud Ribbon如何像大厨一样精心调配资源&#xff0c;让负载均衡变得像烹饪艺术一样简单&#xff01; 文章目录 Spring Cloud Ribbon 详解1. 引言微服务架构中的负载均衡需求Spring Cloud Rib…

SwiftUI中AppStorage的介绍使用

在Swift中&#xff0c;AppStorage是SwiftUI中引入的一个属性包装器&#xff0c;在这之前我们要存储一些轻量级的数据采用UserDefaults进行存取。而AppStorage用于从UserDefaults中读取值&#xff0c;当值改变时&#xff0c;它会自动重新调用视图的body属性。也就是说&#xff0…

地图数据导入

OpenStreetMap 地图数据官网 Geofabrik Download Server 下载数据 china-latest-free.shp.zip 解压到 D:\works\mapworks\shp\tmp 解压找到相关数据&#xff08;目前我要的是铁路数据&#xff09; 导入 gis_osm_railways_free_1.shp 到 pgAdmin4 数据库 1.启动 C:\Progra…