蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按

2024-03-22 20:36

本文主要是介绍蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目要求

在CT107D单片机综合训练平台上,通过I/O模式编写代码,实现以下功能:

  1. 系统上电后,关闭蜂鸣器、继电器和全部指示灯,数码管显示初始值为28,仅显示数码管最右边两位。
  2. 利用定时器0实现10ms间隔定时,作为长定时的基本单位,用于记录按键按下持续时间。
  3. 将J5的23脚短接,将S4设置为独立按键。
  4. 循环扫描S7按键,按下时间小于1秒为短按,数码管数字加1,超过99后恢复为00;按下时间大于1秒为长按,数码管计数清零。
  5. 在按键扫描和处理过程中,确保不干扰数码管正常显示,避免按键误触发和多次处理的情况发生。

二、利用烧写工具中的定时器计数器定时

记得手打打开总中断EA

三、示例代码

#include "stc15.h"void hc573(unsigned char channel, unsigned char value)
{P2 = (P2 & 0x1f) | 0x00;P0 = value;switch(channel){case 4:P2 = (P2 & 0x1f) | 0x80;   //LEDbreak;case 5:P2 = (P2 & 0x1f) | 0xa0;   //蜂鸣器继电器break;case 6:P2 = (P2 & 0x1f) | 0xc0;   //数码管位选break;case 7:P2 = (P2 & 0x1f) | 0xe0;   //数码管段选break;}P2 = (P2 & 0x1f) | 0x00;
}void delay_smg(unsigned int t)
{while(t--);
}void delay_key(unsigned int t)
{while(t--);
}#define TSMG 500
unsigned char n = 28;code unsigned char Seg_Table[] = 
{0xc0, //00xf9, //10xa4, //20xb0, //30x99, //40x92, //50x82, //60xf8, //70x80, //80x90, //90x88, //A0x83, //b0xc6, //C0xa1, //d0x86, //E0x8e //F
};//控制所有数码管
void smg_all(unsigned char dat)
{hc573(6, 0xff);hc573(7, dat);
}//控制单个数码管
void smg_bit(unsigned char pos, unsigned char dat)
{hc573(6, 0x01 << pos);hc573(7, dat);delay_smg(TSMG);hc573(6, 0x01 << pos);hc573(7, 0xff);
}//数码管显示函数
void smg_display()
{smg_bit(6, Seg_Table[(n / 10)]);smg_bit(7, Seg_Table[(n % 10)]);
}unsigned int count = 0;extern unsigned char f_key;void Timer0_Init(void)		//10毫秒@12.000MHz
{AUXR &= 0x7F;			//定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TL0 = 0xF0;				//设置定时初始值TH0 = 0xD8;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时ET0 = 1;EA = 1;
}void service_timer0 () interrupt 1
{if(f_key == 1){count++;}
}#define TKEY 200sbit s7 = P3^0;
unsigned char f_key = 0;void key_scan()
{if(s7 == 0){count = 0;f_key = 1;delay_key(TKEY);if(s7 == 0){while(s7 == 0){smg_display();}f_key = 0;if(count >= 100){n = 0;count = 0;}else{n++;if(n > 99){n = 0;}count = 0;}}}f_key = 0;count = 0;}void init_sys()
{hc573(5, 0x00);   //关闭所有蜂鸣器和继电器hc573(4, 0xff);   //熄灭所以LEDsmg_all(0xff);    //熄灭所有数码管Timer0_Init();
}void main()
{init_sys();while(1){smg_display();key_scan();}
}
  1. void hc573(unsigned char channel, unsigned char value):定义了一个函数hc573,用于控制573锁存器的输出。根据传入的通道号和数据值,设置相应的输出信号。

  2. void delay_smg(unsigned int t):定义了一个延时函数delay_smg,用于实现数码管显示的延时。

  3. void delay_key(unsigned int t):定义了一个延时函数delay_key,用于实现按键扫描的延时。

  4. #define TSMG 500:定义了一个宏TSMG,值为500,用于设置数码管显示的延时时间。

  5. unsigned char n = 28;:定义了一个无符号字符型变量n,初始值为28,用于存储数码管显示的数值。

  6. code unsigned char Seg_Table[] = {...}:定义了一个只读数据表Seg_Table,存储了数码管显示的段选值。

  7. void smg_all(unsigned char dat):定义了一个函数smg_all,用于控制所有数码管的显示。

  8. void smg_bit(unsigned char pos, unsigned char dat):定义了一个函数smg_bit,用于控制单个数码管的显示。

  9. void smg_display():定义了一个数码管显示函数smg_display,在其中调用了smg_bit函数实现数码管的显示。

  10. unsigned int count = 0;:定义了一个无符号整型变量count,用于记录按键按下的持续时间。

  11. extern unsigned char f_key;:声明了一个外部的无符号字符型变量f_key,用于按键扫描的标志。

  12. void Timer0_Init(void):定义了一个定时器0初始化函数Timer0_Init,用于设置定时器0的工作模式和初值,并开启定时器0。

  13. void service_timer0 () interrupt 1:定义了一个定时器0中断服务函数service_timer0,用于处理定时器0的中断事件。

  14. #define TKEY 200:定义了一个宏TKEY,值为200,用于设置按键扫描的延时时间。

  15. sbit s7 = P3^0;:定义了一个位变量s7,表示P3口的第0位,用于表示S7按键的状态。

  16. unsigned char f_key = 0;:定义了一个无符号字符型变量f_key,初始化为0,用于按键扫描的标志。

  17. void key_scan():定义了一个按键扫描函数key_scan,用于检测S7按键的按下情况并进行相应处理。

  18. void init_sys():定义了一个系统初始化函数init_sys,在其中关闭蜂鸣器、继电器、LED灯和数码管,并初始化定时器0。

  19. void main():定义了主函数main,在其中首先调用init_sys进行系统初始化,然后进入一个无限循环,在循环中持续进行数码管显示和按键扫描的操作。

这篇关于蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836146

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s