sec.c

来自「单片及c语言轻松入门的随书光盘」· C语言 代码 · 共 83 行

C
83
字号
/**************************************************
;    平凡单片机工作室
;  http://www.mcustudio.com
;   (c) Copyright 2003 Pingfan's McuStudio
;    All rights Reserved
;sec1.c
;作者:周坚   
;秒钟程序,每到1S,显示值加1,有高位0消隐功能
;本例可用dpj.dll实验仿真板验证
;**************************************************/

#include "reg51.h"
#define uchar unsigned char
#define uint  unsigned int 

#define Hidden 0x10;	//消隐字符在字形码表中的位置
uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
uchar DispBuf[6];	//6字节的显示缓冲区
bit	Sec;			//1s到的标记
uchar SecValue;		//秒计数值

uchar code TH0Val=63266/256;
uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值
//经过精确调整,在值为63266时,定时时间为1.00043362s

void Timer0() interrupt 1
{	uchar tmp;
	static uchar dCount;	//计数器,显示程序通过它得知现正显示哪个数码管
	static uint Count;		//秒计数器
	const uint CountNum=400;	//预置值
	TH0=TH0Val;
	TL0=TL0Val;	
	tmp=BitTab[dCount];		//根据当前的计数值取位值
	P2=P2|0xfc;				//P2与11111100B相或,将高6位置1
	P2=P2&tmp;				//P2与取出的位值相与,将某一位清零
	tmp=DispBuf[dCount];	//根据当前的计数值取显示缓冲待显示值	
	tmp=DispTab[tmp];		//取字形码
	P0=tmp;					//送出字形码
	dCount++;				//计数值加1
	if(dCount==6)			//如果计数值等于6,则让其回0
		dCount=0;	
//以下是秒计数的程序行
	Count++;				//计数器加1
	if(Count>=CountNum)		//到达预计数值
	{	Count=0;			//清零 
		Sec=1;				//置位1s到标志
		SecValue++;				//秒值加1
		if(SecValue>=60)
			SecValue=0;			//秒从0计到59
	}
}

void Init()
{	TMOD=0x01;
	TH0=TH0Val;
	TL0=TL0Val;	
	ET0=1;				//开T0中断
	EA=1;				//开总中断
	TR0=1;				//T0开始运行
}
void main()
{	uchar i;
	Init();					//初始化
	for(i=0;i<=4;i++)
		DispBuf[i]=Hidden;	//显示器前四位消隐
	DispBuf[4]=SecValue/10;
	DispBuf[5]=SecValue%10;
	for(;;)
	{
		if(Sec)				//1s时间到
		{	DispBuf[4]=SecValue/10;
			DispBuf[5]=SecValue%10;
			if(DispBuf[4]==0)
				DispBuf[4]=Hidden;		//高位0消隐
			Sec=0;			//清除1秒到的标志
		}
	}
}
			


                    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?