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

news2024/12/28 4:28:45

一、题目要求

在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;   //LED
		break;
		
		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, //0
	0xf9, //1
	0xa4, //2
	0xb0, //3
	0x99, //4
	0x92, //5
	0x82, //6
	0xf8, //7
	0x80, //8
	0x90, //9
	0x88, //A
	0x83, //b
	0xc6, //C
	0xa1, //d
	0x86, //E
	0x8e //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 200

sbit 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);   //熄灭所以LED
	smg_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进行系统初始化,然后进入一个无限循环,在循环中持续进行数码管显示和按键扫描的操作。

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

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

相关文章

代码随想录第20天| 654.最大二叉树 617.合并二叉树

654.最大二叉树 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 又是构造二叉树&#xff0c;又有很多坑&#xff01;| LeetCode&#xff1a;654.最大二叉树_哔哩哔哩_bilibili 给定一个不重复的整数数组 nums 。 最大二叉树 可以…

基于java+springboot+vue实现的医院门诊信息管理系统(文末源码+Lw+ppt)23-325

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

不敢想象吧!Anzo Capital发现不仅经济事件影响汇率天气也是

在投资交易中弄懂汇率的走势方向&#xff0c;对各位投资者的交易盈利那还不是小菜一碟&#xff0c;但各位投资者你们想象不到吧&#xff01;Anzo Capital发现不仅经济事件能影响汇率&#xff0c;就连天气也能轻易影响汇率。 就用2015年1月15日的经济事件来说&#xff0c;当瑞…

pandas读写excel,csv

1.读excel 1.to_dict() 函数基本语法 DataFrame.to_dict (self, orientdict , into ) --- 官方文档 函数种只需要填写一个参数&#xff1a;orient 即可 &#xff0c;但对于写入orient的不同&#xff0c;字典的构造方式也不同&#xff0c;官网一共给出了6种&#xff0c…

基于springboot+vue的流浪动物管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2002-2023年各地级市环境规制强度数据(环保词频统计)

2002-2023年各地级市环境规制强度数据&#xff08;环保词频统计&#xff09; 1、时间&#xff1a;2002-2023年 2、来源&#xff1a;政府工作报告 3、指标&#xff1a; 行政区划代码、年份、城市、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档&#xff0c;并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界&#xff0c;检索的结果取决于相关性&#xff0c;相关性计算…

ssm004新生报到系统+jsp

新生报到系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱&#xff0c;出错率…

JS运行时大盘点,出新JS运行时了!

大家好&#xff0c;我是奇兵&#xff0c; 在前端技术日新月异的今天&#xff0c;新的 JavaScript 运行时环境不断涌现&#xff0c;它们为开发者提供了更多的选择和可能性。近期&#xff0c;诸如 LLRT 和 WinterJS 等新运行时环境的发布&#xff0c;进一步丰富了 JavaScript 运…

实战 | 任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处&#xff0c;输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面&#xff0c;点击发送验证码&#xff0c;然后用BURP发包 更改手机号传参&#xff0c;这里手机号传参没有进行加密&#xff0c;直接用手机号的位置进行爆破 正确的…

cad怎么画洗菜盆平面图?

CAD绘制住宅平面布置图的时候&#xff0c;特别是对厨房区域的绘制时&#xff0c;需要使用到洗菜盆图块该怎么绘制洗菜盆平面图呢&#xff1f;下面我们就来看看详细的教程。 1、打开AutoCAD 2013软件&#xff0c;点击【图层特性管理器】&#xff0c;点击【新建图层】&#xff0…

maya打开bvh脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件&#xff0c;点击右下角 “脚本编辑器” 运行打开bvh脚本 https://github.com/jhoolmans/mayaImporterBVH/blob/master/bvh_importer.py import os import re from typing impo…

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题&#xff1a; 由于代码是串行方式&#xff0c;流程大致为&#xff1a;开…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据&#xff0c;众所周知&#xff0c;Gmsh可以导出多种网格数据格式&#xff0c;比如大家熟悉的msh、stl、inp、cgns&#xff08;似乎不完善&#xff09;等等&#xff0c;但是gmsh不支持nas格式的导出&#xff0c;只支持nas格式的导入&a…

基于java+springboot+vue实现的图书借阅系统(文末源码+Lw+ppt)23-328

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“期待相遇”图书借阅系统&#xff0c;帮助商…

Harmony(鸿蒙)Stage模型综述

设计思想 ​Stage模型的设计&#xff0c;是为了提供给开发者一个更好的开发方式&#xff0c;更好的适用于多设备、分布式场景。 ​Stage模型的设计思想如下图所示。 ​Stage模型的设计基于如下三个出发点&#xff1a; 应用进程的有序管理 随着设备的内存越来越大&#xff0…

【docker】查看并拷贝容器内文件

一、查询容器 查询所有容器 docker ps查询名为os11的容器 docker ps | grep os11查询名为os11的容器&#xff08;包含不运行的&#xff09; docker ps -a| grep os11 docker ps [option] 显示结果介绍如下&#xff1a; 参考&#xff1a;[https://blog.51cto.com/u_15009374/31…

详解华为软件研发管理IPD

IPD,即集成产品开发(Integrated Product Development),是一种综合多种管理模型和理论、企业最佳实践的管理体系。旨在帮助企业快速适应市场变化,缩短产品上市时间,减少资源浪费,并提高生产力,以实现商业成功。 IPD的核心是跨部门团队的合作,涉及市场、研发、制造、服…

java项目将静态资源中的文件转为浏览器可访问的http地址

新增一个类叫啥无所谓&#xff0c;主要是实现 WebMvcConfigurer 加上注解 Configuration项目启动时加入bean中 只操作addResourceHandlers这一个方法 其他都没用 文章下方附带一个简易的上传图片代码 package cn.exam.config;import org.springframework.context.annotati…

Java代码基础算法练习-字符串反转-2024.03.25

任务描述&#xff1a; 输入一个字符串&#xff0c;然后将此字符串反转&#xff08;字符串最长不超过25个字符&#xff09; 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240325_1 {public static void main(String…