【51单片机6位数码管显示时间与秒表】2022-5-8

缘由数码管 keil proteus 为什么出现这种情况呢?-编程语言-CSDN问答

cpp 复制代码
#include "reg52.h"
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号
unsigned char code DuLiAnJian[]={1,2,4,8,16,32,64,128,254,253,251,247,239,223,191,127};
unsigned char Js=0, Miao=59, Fen=59, Shi=11, Hm=0;//中断计时 秒 分 时 毫秒
unsigned int MiaoBiao=0;
bit QhShi=0,Mb=0;//12/24切换 秒表
void ZhongDuanSheZhi()
{
	TH0+=0X4c;/*定时器赋初值,定时50ms触发中断,自动补偿方式*/
	TL0+=0X00; 
	TMOD=0X01;//16位定时器/计数器
	TR0=1; //启动定时器T0。
	ET0=1; //开启定时器
	EA=1; //全局中断开关
}
void ZhongDuan() interrupt 1
{
	++Js;
	TH0+=0X4c;
	TL0+=0X00;        
}
void JiShi(/*时间计算*/)
{
	if(Js==2)
	{
		if(++Hm==10){Hm=0;if(++MiaoBiao==1000)MiaoBiao=0;++Miao;}
		if(Miao==60){Miao=0;++Fen;}
		if(Fen==60){Fen=0;++Shi;}
		if(Shi==24)Shi=0;Js=0;
	}
}
void main()
{
	unsigned char Ys=0,wei=1,Xd=0;//延时 数码位 消抖
	ZhongDuanSheZhi(/*中断设置*/);
	while(1)
	{
		JiShi(/*时间计算*/);
		if(P1==DuLiAnJian[11]&&!++Xd){++Miao;while(P1==DuLiAnJian[11]);}
		else if(P1==DuLiAnJian[15]&&!++Xd){Miao=(Miao?--Miao:59);while(P1==DuLiAnJian[15]);}
		else if(P1==DuLiAnJian[10]&&!++Xd){++Fen;while(P1==DuLiAnJian[10]);}
		else if(P1==DuLiAnJian[14]&&!++Xd){(Fen=Fen?--Fen:59);while(P1==DuLiAnJian[14]);}
		else if(P1==DuLiAnJian[9]&&!++Xd){++Shi;while(P1==DuLiAnJian[9]);}
		else if(P1==DuLiAnJian[13]&&!++Xd){(Shi=Shi?--Shi:23);while(P1==DuLiAnJian[13]);}
		else if(P1==DuLiAnJian[8]&&!++Xd){QhShi=~QhShi;while(P1==DuLiAnJian[8]);}
		else if(P1==DuLiAnJian[12]&&!++Xd){Mb=~Mb;if(Mb)MiaoBiao=Hm=0;while(P1==DuLiAnJian[12]);}
		if(!++Ys)
		{
			P2=wei;
			if(Mb==0)
			{
				if(wei==1)P0=~smgduan[(QhShi&&Shi>12?Shi-12:Shi)/10];
				else if(wei==2)P0=~(smgduan[(QhShi&&Shi>12?Shi-12:Shi)-(QhShi&&Shi>12?Shi-12:Shi)/10*10]|0X80);
				else if(wei==4)P0=~smgduan[Fen/10];
				else if(wei==8)P0=~(smgduan[Fen-Fen/10*10]|0X80);//(Mb?0X00:0X80)
				else if(wei==16)P0=~smgduan[Miao/10];
				else if(wei==32)P0=~smgduan[Miao-Miao/10*10];
			}
			else
			{
				if(wei==1)P0=255;
				else if(wei==2)P0=~smgduan[MiaoBiao/100];
				else if(wei==4)P0=~smgduan[MiaoBiao/10-MiaoBiao/10/10*10];
				else if(wei==8)P0=~(smgduan[MiaoBiao-MiaoBiao/10*10]|0X80);
				else if(wei==16)P0=~smgduan[Hm];
				else if(wei==32)P0=255;
			}
			if((wei*=2)>32)wei=1;//数码管动态显示
			Ys=147;
		}
	}
}
相关推荐
octopus_c2 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
IT小白杨8 小时前
工程视角下的浏览器环境API:资源模型、权限审计与MCP实践
大数据·经验分享·selenium·chrome devtools·安全架构·指纹浏览器
YH55269848 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
chushiyunen8 小时前
欧洲地理笔记
笔记
吃着火锅x唱着歌8 小时前
Effective C++ 学习笔记 条款43 学习处理模板化基类内的名称
c++·笔记·学习
felixking9 小时前
C++20 协程
开发语言·c++·协程
遥感知识服务10 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶10 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆10 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
恒锐丰小瑞11 小时前
率能SS8841T 40V/2.5A/双通道H桥驱动芯片,PWM控制接口与低导通电阻(350mΩ),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·机器人