新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能:
1、系统上电后,关闭蜂鸣器和继电器,关闭全部指示灯,数码管最右边两位显示计数初始值28,其余数码管关闭。
2、利用定时器0实现10ms的间隔定时,将其作为长定时的基本单位,用于记录按键按下的持续时间。
3、将J5的23脚短接,把S4设置为独立按键。
4、循环扫描S4按键,按下时间小于1秒为短按,数码管上的数字加1,超过最大值99后恢复00,继续计数;S4按键按下的时间大于1秒为长按,数码管上的计数清除为00。
5、在按键扫描和处理的过程中,不能干扰数码管正常显示,避免出现按键误触发和一次按键多次处理的情况。
【小提示】:按键的长按与短按实现原理,可见本博客:《【CC2530强化实训01】普通延时函数实现按键的长按与短按》。
/*==================蓝桥杯单片机特训==================
【进阶02】:长按与短按控制数码管显示
**平 台:CT107D单片机综合实训平台
**模 式:IO模式
**设 计:欧浩源(小蜜蜂老师,ohy3686@qq)
**时 间:2022-03-31
**更多详见f393
====================================================*/
#include "reg52.h"sbit S4 = P3^3;//定义动态显示中单个数码管点亮时长
#define TSMG 500
//-------共阳数码管的段码编码表(无小数点)--------
//0 1 2 3 4 5 6 7 8 9 A b C D E F - .
unsigned char code SMG_NoDot[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};unsigned char num = 28; //定义计数变量
bit F_key = 0; //按键按下标志
unsigned int count_t = 0; //10ms单位累计
void Display_Num(); //声明数码管显示函数
/*====锁存器设置和数码管显示的代码参考前面的案例====*/
//===================定时器T0初始化===================
void Init_Timer0()
{//定时器计数初值设置TH0 = (0 - 10000) / 256;TL0 = (0 - 10000) % 256;TMOD = 0x01; //模式1:16位非重装模式ET0 = 1; //使能定时器0中断EA = 1; //打开总中断TR0 = 1; //启动定时器0
}
//===============定时器T0的中断服务函数================
void Service_Timer0() interrupt 1
{TH0 = (0 - 10000) / 256;TL0 = (0 - 10000) % 256;if(F_key == 1) //在按键按下期间进行计数{count_t++; //按键按下的持续时间}
}
//==================按键扫描处理函数===================
void Scan_Keys()
{if(S4 == 0){DelaySMG(1000); //去抖动处理if(S4 == 0) //确认为按下信号{count_t = 0; //时间计数变量清0F_key = 1; //标志按键按下状态while(S4 == 0) //等待按键松开{Display_Num(); //在按下期间保持数码管正常显示}F_key = 0; //标志按键松开状态if(count_t > 50) //按下时间大于1秒,长按{num = 0; //数码管计数清除为00}else //按下时间小于1秒,短按{num++; //数码管计数加1if(num == 100){num = 0; //计数超出最大值99后恢复00}}}}
}
【注】:更多关于蓝桥杯单片机备赛内容,详见《蓝桥杯单片机设计与开发》小蜜蜂特训手册,本站可下载,相关更多蓝桥杯的案例完整源码及学习备赛笔记,欢迎进入“小蜜蜂笔记”公众号。
本文发布于:2024-01-31 01:02:01,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170663412224190.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |