当前位置: 首页 > article >正文

蓝桥杯电子赛_零基础利用按键实现不同数字的显现

目录

一、前提

二、代码配置

bsp_key.c文件

main.c文件

 main.c文件的详细讲解

功能实现

注意事项


一、前提

按键这一板块主要是以记忆为主,我直接给大家讲解代码去实现我要配置的功能。本次我要做的项目是板子上的按键有S4~S19,我希望任意一个按键可以显示对应的两位数,按下两个不同的按键可以一前一后各显示出两位数字,也就是生成四位数字,再按下另外一个按键实现清零的功能。

按键的原理图

二、代码配置

bsp_key.c文件

#include "bsp_key.h"//函数名:按键码值读取函数
//入口参数:无
//返回值:按键的码值
//函数功能:返回按键码
unsigned char Key_Read(void)
{unsigned int Key_NEW;unsigned char Key_Value;//返回值P44 = 0;P42 = 1;P35 = 1;P34 = 1;//第一列扫描Key_NEW = P3 & 0X0F; //P3 = 0000 1000---P37~P30,高位无效,只看P33~P30P44 = 1;P42 =0;P35 = 1;P34 = 1;//第二列扫描Key_NEW = (Key_NEW << 4) | (P3 & 0X0F); //将原来的数值挪到次4位,本次数值放到最低4位,占用了8位P44 = 1;P42 =1;P35 = 0;P34 = 1;//第三列扫描Key_NEW = (Key_NEW << 4) | (P3 & 0X0F); //将原来的数值挪到次次4位,本次数值放到最低4位,占用了12位P44 = 1;P42 =1;P35 = 1;P34 = 0;//第三列扫描Key_NEW = (Key_NEW << 4) | (P3 & 0X0F); //将原来的数值挪到次次次4位,本次数值放到最低4位,占用了16位switch(~Key_NEW)//Key_Value的数值对应按键的编号{case 0X8000:Key_Value = 4;break;case 0X4000:Key_Value = 5;break;case 0X2000:Key_Value = 6;break;case 0X1000:Key_Value = 7;break;case 0X0800:Key_Value = 8;break;case 0X0400:Key_Value = 9;break;case 0X0200:Key_Value = 10;break;case 0X0100:Key_Value = 11;break;case 0X0080:Key_Value = 12;break;case 0X0040:Key_Value = 13;break;case 0X0020:Key_Value = 14;break;case 0X0010:Key_Value = 15;break;case 0X0008:Key_Value = 16;break;case 0X0004:Key_Value = 17;break;case 0X0002:Key_Value = 18;break;case 0X0001:Key_Value = 19;break;default :Key_Value = 0;}return Key_Value;}

main.c文件

#include "bsp_init.h"
#include "bsp_seg.h"
#include "Timer0.h"
#include "bsp_key.h"
#include "bsp_key.h"
#include "STDIO.H"/* 函数声明 */
void	Key_Proc(void);//按键处理
void	Seg_Proc(void);//显示处理/* 全局变量 */unsigned char seg_buf[8];//放置字符串转换后的段码到数组
unsigned char seg_string[10];//放置字符串
unsigned char pos = 0;//中断显示专用unsigned char Key_Value;//读取按键的数值存储变量
unsigned char Key_Down,Key_Old;unsigned char num_buffer[2] = {0, 0}; // 存储2个按键编号
unsigned char num_count = 0; // 当前存储的数字个数unsigned char Seg_Show_Num;//准备显示出来的数值
void main()
{Cls_Peripheral();Timer0Init();		//1毫秒@12.000MHzEA = 1;while(1){Key_Proc();//按键处理Seg_Proc();//显示处理}}/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 
{Seg_Disp( seg_buf, pos );if(++pos ==8) pos = 0;
}
/* Key_Proc */
void	Key_Proc(void)//按键处理,底层数据变更
{Key_Value = Key_Read();//读取按键按下的编号Key_Down = Key_Value & (Key_Old ^ Key_Value);//^异或(0000^0101)= 0101 0101 & 0101 = //0101 如果按键发生了下降沿的变化,输出结果和本次按键数值相同//^异或(0101^0101)= 0000 0101 & 0000 = //0000 如果按键发生了下降沿的变化,输出结果和本次按键数值相同Key_Old = Key_Value;if(Key_Down)//如果捕捉到下降沿跳变{if (num_count < 2) // 如果存储的按键个数小于2{num_buffer[num_count++] = Key_Down; // 存储按键编号}else // 如果已经存储了两个按键编号{// 清零操作num_count = 0; // 清空按键个数     }}	
}/* Seg_Proc */
void	Seg_Proc(void)//显示处理,显示信息生成
{if (num_count == 1) // 如果只存储了一个按键编号{// 显示第一个按键编号的两位数字sprintf(seg_string, "    %02d", (unsigned int)num_buffer[0]);}else if (num_count == 2) // 如果存储了两个按键编号{// 显示两个按键编号的四位数字sprintf(seg_string, "    %02d%02d", (unsigned int)num_buffer[0], (unsigned int)num_buffer[1]);}else // 如果没有存储任何按键编号{// 显示全0sprintf(seg_string, "    0000");}Seg_Tran( seg_string,seg_buf);}

 main.c文件的详细讲解

  1. 显示逻辑调整:                                                                                                                      在Seg_Proc函数中:

    • 如果num_count为0,显示全0。

    • 如果num_count == 2,显示两个按键编号的四位数字(如0405)。

    • 如果num_count == 1,只显示第一个按键编号的两位数字(如04)。

  2. 按键逻辑调整

    Key_Proc函数中:
    • 如果num_count == 2,按下任意按键清零。

    • 如果num_count < 2,存储按键编号。

  3. 数码管显示位数调整

    数码管的动态扫描范围为8位,显示内容通过sprintf格式化为8位数码管的显示格式。
功能实现
  • 按下第一个按键

    • 显示该按键对应的两位数字(如04)。

  • 按下第二个按键

    • 显示两个按键对应的四位数字(如0405)。

  • 按下任意第三个按键

    • 清零显示内容,显示0000

注意事项
  • 确保按键编号S4S19与实际硬件的按键编号一致。

  • 如果按键编号不是从419的连续数字,需要根据实际硬件调整按键编号的判断逻辑。

  • 显示内容前面有4个空格,确保显示内容在8位数码管的中间位置。如果需要调整显示位置,可以修改sprintf中的空格数量。

http://www.lryc.cn/news/2386408.html

相关文章:

  • Docker架构详解
  • Rust 学习笔记:关于生命周期的练习题
  • Spring AI 模块架构与功能解析
  • 单元测试学习笔记
  • 多模态大语言模型arxiv论文略读(九十)
  • (1-6-1)Java 集合
  • spring5-配外部文件-spEL-工厂bean-FactoryBean-注解配bean
  • [安全清单] Linux 服务器安全基线:一份可以照着做的加固 Checklist
  • 企业级单元测试流程
  • 安卓开发用到的设计模式(2)结构型模式
  • JavaWeb:SpringBoot配置优先级详解
  • 故障率预测:基于LSTM的GPU集群硬件健康监测系统(附Prometheus监控模板)
  • 【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述
  • FFmpeg 安装包全攻略:gpl、lgpl、shared、master 区别详解
  • AI浪潮下,媒体内容运营的五重变奏
  • WindTerm 以 SSH 协议的方式通过安恒明御堡垒机间接访问服务器
  • 通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架
  • 邂逅Node.js
  • 计算机视觉(图像算法工程师)学习路线
  • GITLIbCICD流水线搭建
  • 详细介绍Qwen3技术报告中提到的模型架构技术
  • 【慧游鲁博】【8】前后端用户信息管理:用户基本信息在小程序端的持久化与随时获取
  • 上位机知识篇---keil IDE操作
  • Odoo: Owl Hooks 深度解析技术指南
  • SpringBoot返回xml
  • 【案例篇】 实现简单SSM工程-后端
  • 零基础学习计算机网络编程----网络基本知识
  • Zynq和Microblaze的区别和优势
  • FastAPI 支持文件下载
  • CNN卷积神经网络到底卷了啥?