蓝桥杯单片机快速开发笔记——特训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进行系统初始化,然后进入一个无限循环,在循环中持续进行数码管显示和按键扫描的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美摄科技剪同款SDK解决方案全面升级

视频内容已成为企业宣传、品牌塑造和市场营销的重要载体。然而&#xff0c;如何快速、高效地制作出高质量的视频内容&#xff0c;成为摆在众多企业面前的一大难题。针对这一挑战&#xff0c;美摄科技凭借深厚的技术积累和创新能力&#xff0c;推出了全新的剪同款SDK解决方案&am…

如何注册 onlyFans? onlyFans 如何订阅教程

一、onlyFans 介绍 OnlyFans 是一个在线平台&#xff0c;允许创作者为他们的内容提供订阅服务&#xff0c;通常是成人内容或独家内容。该平台于2016年成立&#xff0c;起初被认为是一个用于演员、模特、艺术家和其他创意行业从业者分享内容的地方。随着时间的推移&#xff0c;O…

21 OpenCV 直方图均衡化

文章目录 直方图概念均衡的目的equalizeHist 均衡化算子示例 直方图概念 图像直方图&#xff0c;是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数&#xff0c;据此生成的直方图&#xff0c;称为图像直方图-直方图。直方图反映了图像灰度的分布情况。 均衡的目的…

全国农产品价格分析预测可视化系统设计与实现

全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会&#xff0c;数据的可视化已成为决策和分析的重要工具。尤其是在农业领域&#xff0c;了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求&#xff0c;设计并实现了全国农产…

摘录笔记——2024年3月20日

这位大佬介绍的技术PM方面心得&#xff0c;有一定的启发意义&#xff08;虽说我现在只是搬砖的&#xff0c;跟PM还有一定差距&#xff09;&#xff0c;现在摘录出来作为记录&#xff1a; 一文聊聊我理解的技术PM作为技术同学&#xff0c;不仅要写好自己的代码&#xff0c;做好…

OpenAI 首席执行官Altman透漏GPT-5最新细节

关注文章底部的公众号,获取每日AI最新新闻 获取每日资讯 Altman透漏GPT-5细节 在最近的一次采访中,美国知名播客 Lex Friedman 邀请 OpenAI 首席执行官 Sam Altman 进行专访。在 Altman 眼中 GPT-4 还是很糟糕的,他预计 5 和 4 之间的差值将与 4 和 3 之间的差值相同。具体…

时代教育期刊投稿发表

《时代教育》是由成都传媒集团主管主办&#xff0c;中华人民共和国新闻出版总署批准国内公开出版发行的专业教育类期刊&#xff0c;主要刊登各类高等院校、职业技术学校、中小学教师及研究生、教育科研工作者的教育实践研究成果&#xff1b;教育教学行业的最新动态&#xff1b;…

Python爬虫案例-爬取主题图片(可以选择自己喜欢的主题)

2024年了&#xff0c;你需要网络资源不能还自己再慢慢找吧&#xff1f; 跟着博主一块学习如何利用爬虫获取资源&#xff0c;从茫茫大海中寻找那个她到再妹子群中找妹子&#xff0c;闭着眼睛都可以找到合适的那种。文章有完整示例代码&#xff0c;拿过来就可以用&#xff0c;欢迎…

【智能算法】多元宇宙优化算法(MVO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2016年&#xff0c;Mirjalili 等人受到宇宙膨胀理论启发&#xff0c;提出了多元宇宙优化算法(Multi-verse Optimization, MVO)。 2.算法原理 2.1算法思想 MVO基于宇宙膨胀的原理&#xff0c;利用…

python 教你如何创建一个自定义库 colorlib.py

目录 Colorlib 生成代码 模块代码 导入测试 测试一 测试二 应用测试 颜色列表 colorList 随机颜色元组 randcolorTuples 随机颜色字串 randcolorStrings Color类测试 测试一 测试二 题外话 Colorlib 有没有碰到过这样的场景&#xff1a;写代码时想要用上丰富的色…

huggingface的transformers训练gpt

目录 1.原理 2.安装 3.运行 ​编辑 4.数据集 ​编辑 4.代码 4.1 model init​编辑 forward&#xff1a; 总结&#xff1a; 关于loss和因果语言模型&#xff1a; ​编辑 交叉熵&#xff1a;​编辑 记录一下transformers库训练gpt的过程。 transformers/examples/…

鸿蒙开发之导航栏tabs(类似Android tablayout)

当页面信息较多时&#xff0c;为了让用户能够聚焦于当前显示的内容&#xff0c;需要对页面内容进行分类&#xff0c;提高页面空间利用率。Tabs组件可以在一个页面内快速实现视图内容的切换&#xff0c;一方面提升查找信息的效率&#xff0c;另一方面精简用户单次获取到的信息量…

使用uniapp,uni-data-select组件时,内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点,逼死强迫症

项目场景&#xff1a; 微信小程序开发&#xff0c;使用uniapp&#xff0c;uni-data-select组件时&#xff0c;内容长度没超过容器宽度时候虽然能显示全内容但是数据后边会出现三个点&#xff0c;逼死强迫症 解决方案&#xff1a; 找到组件的源代码&#xff0c;然后删除那三个…

图像几何变换(仿射变换和透视变换...)及python-opencv实现

文章目录 图像变换类型仿射变换透视变换python-opencv实现参考文献 图像变换类型 图像几何变换主要包括以下几种类型&#xff1a; 平移&#xff08;Translation&#xff09;&#xff1a;将图像在水平或垂直方向上移动&#xff0c;不改变图像的尺寸和形状。缩放&#xff08;Sca…

声控小助手:文本语音呼唤技术的应用与实现

title: 声控小助手&#xff1a;文本语音呼唤技术的应用与实现 date: 2024/3/22 18:20:42 updated: 2024/3/22 18:20:42 tags: 文本语音呼唤技术原理Python实现优缺点分析应用场景未来展望人机交互 1. 引言 在当今数字化时代&#xff0c;文本语音呼唤技术正逐渐成为人们生活中…

新零售SaaS架构:线上商城系统架构设计

零售商家为什么要建设线上商城&#xff1f; 传统的实体门店服务范围有限&#xff0c;只能吸引周边500米以内的消费者。因此&#xff0c;如何拓展服务范围&#xff0c;吸引更多的消费者到店&#xff0c;成为了店家迫切需要解决的问题。 缺乏忠实顾客&#xff0c;客户基础不稳&…

聊聊芯片中的动态功耗( Dynamic Power)

一、Dynamic Power 概念 动态功耗&#xff1a;主要包括动态开关电流引起的Switching Power和MOS管内部的Internal Power。 1.1 翻转功耗 我们先看Switching Power&#xff0c;开关功耗是指在逻辑门开关时所引起的功耗&#xff0c;在CMOS逻辑门输出节点产生逻辑转换时…

Linux--Shell脚本安装 httpd 和 修改IP

shell脚本 关闭防火墙、安装httpd、启动httpd [rootnode11 ~]# mkdir shell[rootnode11 ~]# vim abc.sh #!/bin/bash#安装httpd服务#1、挂载 准备yum源 mount /dev/sr0 /mnt &> /dev/nulldf$(df -h | grep /dev/sr0 | awk {print $6})if [ "$df" "/mn…

【C++】手撕红黑树

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能直接手撕红黑树。 > 毒鸡汤&#xff1a;行到…

redis-黑马点评-商户查询缓存

缓存&#xff1a;cache public Result queryById(Long id) {//根据id在redis中查询数据String s redisTemplate.opsForValue().get(CACHE_SHOP_KEY id);//判断是否存在if (!StrUtil.isBlank(s)) {//将字符串转为bean//存在&#xff0c;直接返回Shop shop JSONUtil.toBean(s, …