⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 proteus 数字时钟 ds1302
💻 C
字号:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:数字时钟。																 		 **
//**<功能>:可以显示时实时间,同时可以用按键进行设置。			 								 **
//**<版本说明>:这是第1.2版。 	 																 **
//**<作者>:程沛																				 **
//**<完成时间>:2007年8月7日																	 **
//**<联系方式>:superyongzhe@163.com															 **
//*************************************************************************************************
//*************************************************************************************************
#include "includes.h"


#define TIME1H 0x3C
#define TIME1L 0xB0		//定时器1溢出时间:50ms

#define SCANPORT P2		//4×4键盘扫描端口,低4位是行线,高4位是列线。


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0;	  				//键盘防抖动标志位。
									//当按键中断产生时,首先判断此位。
									//0--执行键盘扫描及键码处理程序;1--不执行。

bit b_KillShock=0;					//防抖标志清除位:0--不清除;1--清除。

unsigned char uc_KillCount=1;		//抖动标志清除计数,使用定时器1。


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<键盘扫描开启标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyScan=0;					//0--不扫描;
									//1--扫描。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD定时刷新时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TIME stCurrentTime;					  //存储从DS1302获取的时间,以及显示字符串。

bit b_TimeRefresh=0;				  //定时刷新标志。

unsigned char uc_TimeRefresh=0;		  //定时刷新计数。



void main()
{

	vdInitialize();					   //初始化LCD。

	vDSInitialize();				   //初始化DS1302。

	SCANPORT=0x0F;					   //初始化键盘。

	vWriteCMD(0x81);
	vShowChar("Date:");
	vWriteCMD(0xC1);
	vShowChar("Time:");
	
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	IT0=1;			 //	中断方式:下降沿。
	EX0=1;			 //	开启外部中断。


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	TH1=TIME1H;
	TL1=TIME1L;
	TR1=1;			 //开启定时器1
	ET1=1;			 //开定时器1中断


	EA=1;
	

	
	while(1)
	{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD定时刷新时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	if(b_TimeRefresh==1)						//没900ms执行1次,刷新LCD时间显示。
		{
		b_TimeRefresh=0;						//恢复标志。
		vDSGetTime(&stCurrentTime);				//获取当前时间并将其存入指定数组。

		vDateString(&stCurrentTime);			//生成日期字符串。
		vTimeString(&stCurrentTime);			//生成时间字符串。

		vWriteCMD(0x86);						//向LCD写入当前时间。
		vShowChar(stCurrentTime.ucaDateString);
		vWriteCMD(0xC6);
		vShowChar(stCurrentTime.ucaTimeString);
		}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<键盘扫描及键码处理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	if(b_KeyScan==1)		   //如果有按键按下,则进行按键扫描和键码处理。
		{
		b_KeyScan=0;
		vKeyProcess(ucKeyScan());
		}
	}
}

//*************************************************************************************************
//*																								  *
//*		******************************外部中断0,用于开启键盘扫描及键码处理******************	  *
//*																								  *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
	if(b_KeyShock==0)
		{
			b_KeyScan=1;			//开启键盘扫描标志。
			b_KeyShock=1;			//设置防抖动标志。
		}
	else b_KeyShock=0;				//如果有抖动则不执行键扫描,恢复防抖动标志。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>	
	if(b_KeyShock==1)
		b_KillShock=1;				//如果防抖动标志位开启则开启防抖动标志清除位,
									//300ms后清除防抖动标志。

}


//*************************************************************************************************
//*																								  *
//*		****************定时器1中断,用于计时功能和防抖动标志清除以及显示报告****************	  *
//*																								  *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	if(b_KillShock==1)
		{
		if(uc_KillCount==16)			 //当防抖动标志位为1时,计时300ms后清除抖动标志位。
			{
			b_KeyShock=0;
			b_KillShock=0;
			uc_KillCount=1;
			}
		else uc_KillCount++;
		}

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD定时刷新时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	if(uc_TimeRefresh==18)			   //900ms刷新显示1次。
		{
		b_TimeRefresh=1;
		uc_TimeRefresh=0;
		}
	else
		uc_TimeRefresh++;


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1溢出时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	TH1=TIME1H;
	TL1=TIME1L;
} 

⌨️ 快捷键说明

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