蓝桥杯-单片机组基础14——定时计数器与延时函数2方法实现长短按功能

news2025/1/24 2:17:40

蓝桥杯单片机组备赛指南请查看 :本专栏第1篇文章

本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。

型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2

(使用国信天长蓝板也可以完美兼容,与绿板几乎无差别)


        恭喜各位看到这里,大势已去,接下来只是额外学习一点省赛的小技巧

1. 功能概览

        大部分省赛里,官方会考察矩阵键盘,就不会考察大家对于长按与短按的操作

        但是一旦遇到考独立按键的试题,就一定会有长短按的考察

        推荐大家掌握定时器方式,短按加1,长按不松手清0方式。其他方式为供大家共同学习,一起进步所写,有任何问题欢迎指出。

2. 代码目的

        按下独立按键S7,数码管两位数显示加1。长按独立按键S7超过1秒,则数码管示数清0。

        性能指标:数码管亮度均匀,最大计数值99

3. 实现思路

        只涉及一个S7按键,因此我们将长短按的检测放到 keyrunning()按键检测函数中。

        当S7==0,表示按键被按下,我们一个 TR0=1 启动定时器;

        当while( S7 == 0 );循环结束,表示按键被松开,我们一个 TR0=0 停止定时器;

        此时读取定时过程中记录的时间,如果大于1则将显示数值清0.

4. 代码参考

4.1 定时器方式:短按加1,长按不松手清0代码

#include <reg52.h>
#include <intrins.h>

unsigned char code duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
											0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

sbit S7 = P3^0;
sbit AUXR = 0x8e;
unsigned char count_num = 0;
											
void SMGrunning ();

void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
	}
}

void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 7 );
	P0 = 0xff;
	
	select_HC573 ( 6 );
	P0 = 0x01 << pos_SMG;
	select_HC573 ( 7 );
	P0 = value_SMG;
}

void state_SMG_all ( unsigned char value_SMG )
{
	select_HC573 ( 6 );
	P0 = 0xff;
	select_HC573 ( 7 );
	P0 = value_SMG;
}

void init_sys ()
{
	select_HC573 ( 4 );
	P0 = 0xff;
	select_HC573 ( 5 );
	P0 = 0x00;	
}

//用定时器0,产生20ms一次的中断
void init_timer0(void)		//20毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0xB8;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	
	EA = 1;
	ET0 = 1;
}

unsigned char count_20ms = 0;
bit count_1s = 0;
void timer0_service () interrupt 1
{
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0xB8;		//设置定时初始值
	
	count_20ms++;
	
	if ( count_20ms == 50 )
	{
		count_20ms = 0;
		count_1s = 1;
	}
	if ( count_1s == 1 )
	{
		count_num = 0;
	}
}

void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}


void keyrunning ()
{
	if ( S7 == 0 )
	{
		Delay2ms();//适当消除一点点抖动
		
		if ( S7 == 0 )
		{
			TR0 = 1;
			while ( S7 == 0 )
			{
				SMGrunning ();
			}
			TR0 = 0;
			count_20ms = 0;
			
			if ( count_1s == 1 )
			{
				count_1s = 0;
			}
			else
			{
				count_num ++;
				
				if ( count_num == 100 )
				{
					count_num = 0;
				}
				
			}
		}
	}
}

void SMGrunning ()
{
	state_SMG ( 6 , duanma[count_num/10] );
	Delay2ms();
	state_SMG ( 7 , duanma[count_num%10] );
	Delay2ms();
	
	state_SMG_all ( 0xff );
}

void main ()
{
	init_sys ();
	init_timer0 ();
	
	while( 1 )
	{
		SMGrunning ();
		keyrunning ();
	}
}

4.2 定时器方式:短按加1,长按松手清0代码

        为了节省篇幅,这里我来给讲要怎么修改程序实现:

我们的思路就是,删去中断服务函数中直接响应清0的语句,在按键检测函数中加入清0语句

        步骤一:在中断服务函数timer0_service() 中,注释掉或者删掉这4行代码

        步骤二:在键值扫描函数keyrunning()中,添加这1行代码:

4.3 延时函数方式:短按加1,长按松手清0代码

思路就是,循环20ms的软件延时,当循环个数达到50个时,则表示时间经过了1s

        代码如下:

#include <reg52.h>
#include <intrins.h>

unsigned char code duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
											0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

sbit S7 = P3^0;
sbit AUXR = 0x8e;
											
unsigned char count_num = 0;
unsigned char count_20ms = 0;
											
void SMGrunning ();

void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
	}
}

void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 7 );
	P0 = 0xff;
	
	select_HC573 ( 6 );
	P0 = 0x01 << pos_SMG;
	select_HC573 ( 7 );
	P0 = value_SMG;
}

void state_SMG_all ( unsigned char value_SMG )
{
	select_HC573 ( 6 );
	P0 = 0xff;
	select_HC573 ( 7 );
	P0 = value_SMG;
}

void init_sys ()
{
	select_HC573 ( 4 );
	P0 = 0xff;
	select_HC573 ( 5 );
	P0 = 0x00;	
}

void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}

//数码管刷新函数自带4ms,因此这里我们设置16ms
void Delay16ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 173;
	j = 28;
	do
	{
		while (--j);
	} while (--i);
}

void keyrunning ()
{
	if ( S7 == 0 )
	{
		Delay2ms();//适当消除一点点抖动
		
		if ( S7 == 0 )
		{
			while ( S7 == 0 )
			{
				SMGrunning ();//数码管扫描函数内自带4ms
				Delay16ms();
				count_20ms++;
				
				if( count_20ms > 50 )
				{
					count_num = 99;
					count_20ms = 50;
				}
			}
			count_20ms = 0;
			count_num ++;
				
			if ( count_num == 100 )
			{
				count_num = 0;
			}
				
		}
	}
}

void SMGrunning ()
{
	state_SMG ( 6 , duanma[count_num/10] );
	Delay2ms();
	state_SMG ( 7 , duanma[count_num%10] );
	Delay2ms();
	
	state_SMG_all ( 0xff );
}

void main ()
{
	init_sys ();
	
	while( 1 )
	{
		SMGrunning ();
		keyrunning ();
	}
}

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

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

相关文章

Python+Vuecil笔记

Nginx 进入目录: C:\nginx-1.20.2\nginx-1.20.2 start nginx 开始 nginx -s stop 停止 nginx -s quit 退出CSS 通过标签去写css 循环展示数据 JS 点击时执行事件 Django 配置media 在seetings里面修改 STATIC_URL /static/ MEDIA_URL /upload/ MEDIA_ROOT os.pat…

力扣 583. 两个字符串的删除操作

题目来源&#xff1a;https://leetcode.cn/problems/delete-operation-for-two-strings/description/ C题解1&#xff1a;动态规划 寻找word1和word2拥有的公共最长子序列&#xff0c;之后分别对word1和word2进行删除操作&#xff0c;即可使word1和word2相等。 寻找公共最长子…

linux 任务管理器(top, ps),面试考点与面试技巧

图2-1 top命令 RES 表示内存占用。 SHR 表示 share 内存占用. 该视图会自动刷新&#xff0c;按"P"(大写要用 shift) 按照cpu使用率倒排 按 "M"按照内存占用倒排。 图 2-2 top命令开头的几行 top命令开头的几行见图2-2. load average后的三个小数分别表…

Embedding:跨越离散与连续边界——离散数据的连续向量表示及其在深度学习与自然语言处理中的关键角色

Embedding嵌入技术是一种在深度学习、自然语言处理&#xff08;NLP&#xff09;、计算机视觉等领域广泛应用的技术&#xff0c;它主要用于将高维、复杂且离散的原始数据&#xff08;如文本中的词汇、图像中的像素等&#xff09;映射到一个低维、连续且稠密的向量空间中。这些低…

Ubuntu 22.04安装新硬盘并启动时自动挂载

方法一 要在Ubuntu 22.04系统中安装一个新硬盘、对其进行格式化并实现启动时自动挂载&#xff0c;需要按以下步骤操作&#xff1a; 1. 安装硬盘 - 确保你的硬盘正确连接到计算机上&#xff08;涉及硬件安装&#xff09;。 2. 发现新硬盘 - 在系统启动后&#xff0c;打开终端…

机器视觉学习(十二)—— 绘制图形

目录 一、绘制函数参数说明 1.1 cv2.line(&#xff09;绘制直线 1.2 cv2.rectangle&#xff08;&#xff09;绘制矩形 1.3 cv2.circle&#xff08;&#xff09; 绘制圆形 1.4 cv2.ellipse&#xff08;&#xff09;绘制椭圆 1.5 cv2.polylines&#xff08;&#xff09;绘制…

【电路笔记】-逻辑非门

逻辑非门 文章目录 逻辑非门1、概述2、晶体管逻辑非门3、六角施密特反相器逻辑非门是所有逻辑门中最基本的,通常称为反相缓冲器或简称为反相器。 1、概述 反相非门是单输入器件,其输出电平通常为逻辑电平“1”,当其单个输入为逻辑电平“1”时,输出电平变为“低”至逻辑电平…

目标检测——RCNN系列学习(二)Faster RCNN

接着上一篇文章&#xff1a;目标检测——RCNN系列学习(一&#xff09;-CSDN博客 主要内容包含&#xff1a;Faster RCNN 废话不多说。 Faster RCNN [1506.01497] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (arxiv.org)https://arxiv.…

幸运数(蓝桥杯)

该 import java.util.*; public class Main {public static void main(String[] args) {Scanner scannew Scanner(System.in);int cnt0;for(int i1;i<100000000;i) {String si"";int lens.length();if(len%2!0) continue;int sum10; //左边int sum20; //右边fo…

jest单元测试——项目实战

jest单元测试——项目实战 一、纯函数测试二、组件测试三、接口测试四、React Hook测试&#x1f4a5; 其他的疑难杂症另&#xff1a;好用的方法 &#x1f31f; 温故而知新&#xff1a;单元测试工具——JEST 包括&#xff1a;什么是单元测试、jest的基本配置、快照测试、mock函数…

2-django、http、web框架、django及django请求生命周期、路由控制、视图层

1 http 2 web框架 3 django 3.1 django请求生命周期 4 路由控制 5 视图层 1 http #1 http 是什么 #2 http特点 #3 请求协议详情-请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本-请求头---》key:value形式-referer&#xff1a;上一次访问的地址-user-agen…

特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中&#xff0c;搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。 我们引入spring cloud的依赖和eureka的依赖。 <dependencyManagement><!-- spring clo…

软件无线电系列——CIC滤波器

本节目录 一、CIC滤波器 1、积分器 2、梳状滤波器 3、CIC滤波器的特性 二、单级CIC和多级CIC滤波器本节内容 一、CIC滤波器 CIC滤波器&#xff0c;英文名称为Cascade Integrator Comb&#xff0c;中文全称为级联积分梳状滤波器&#xff0c;从字面来看就是将积分器与梳状滤波器…

VS Code远程连接服务器运行python程序

之前一直用pycharm连接服务器跑程序&#xff0c;pycharm需要本地和远程都存一份代码&#xff0c;然后把本地的更新同步到服务器上来实现代码修改&#xff0c;后来实习的时候发现企业里面都用VS Code&#xff0c;不得不说&#xff0c;VS Code真的很方便&#xff0c;直接连服务器…

持续交付工具Argo CD的部署使用

Background CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发流程&#xff0c;旨在通过自动化和持续集成的方式提高软件交付的效率和质量。它包括持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;两个主要阶…

解决前端精度丢失问题:后端Long类型到前端的处理策略

在Web开发中&#xff0c;我们经常遇到前后端数据类型不匹配的问题&#xff0c;特别是当后端使用大数据类型如Long时&#xff0c;前端由于JavaScript的数字精度限制&#xff0c;可能导致精度丢失。本文将深入探讨这个问题&#xff0c;并提供两种有效的解决方法。 一、问题背景 …

Python学习从0开始——007输入与输出

Python学习从0开始——007输入与输出 一、简单输出二、复杂输出2.1引用变量2.2format()函数2.3手动格式化 三、读写文件3.1open()3.2操作文件对象3.3使用 json 保存结构化数据 一、简单输出 str() 函数返回供人阅读的值&#xff0c;repr() 则生成适于解释器读取的值&#xff0…

加州大学欧文分校英语基础语法专项课程01:Word Forms and Simple Present Tense 学习笔记

Word Forms and Simple Present Tense Course Certificate 本文是学习Coursera上 Word Forms and Simple Present Tense 这门课程的学习笔记。 文章目录 Word Forms and Simple Present TenseWeek 01: Introduction & BE VerbLearning Objectives Word FormsWord Forms (P…

【AI】ubuntu 22.04 本地搭建Qwen-VL 支持图片识别的大语言模型 AI视觉

下载源代码 yeqiangyeqiang-MS-7B23:~/Downloads/src$ git clone https://gh-proxy.com/https://github.com/QwenLM/Qwen-VL 正克隆到 Qwen-VL... remote: Enumerating objects: 584, done. remote: Counting objects: 100% (305/305), done. remote: Compressing objects: 10…

Java单链表和LinkedList的实现

一、单链表的实现 无头单向非循环链表 定义异常用于判断所给位置是否合法 public class IndexNotLegal extends RuntimeException{public IndexNotLegal(){}public IndexNotLegal(String smg){super(smg);} } class ListNode中包含当前节点的值和下一个节点指向 实现链表的…