m12232a.c

来自「DS1302显示时钟」· C语言 代码 · 共 1,809 行 · 第 1/4 页

C
1,809
字号
				break;

			case vKeyVal_8:
SBUF=0x08;
//				lcdfill(0);    //清屏
				break;

			default:
				break;
		}
	}
}

/**************************************************************************
*    函数原型: uchar BcdToHex(uchar cCh);
*    功    能: 一个BCD码转化为十六进制数
**************************************************************************/
/*
uchar BcdToHex(uchar cCh){

	if((cCh&0xf0)<0xa0){
		if((cCh&0x0f)<0x0a){
			return((cCh>>4)*10+(cCh&0x0f));
			}
		else{
			return(cCh>>4);
			}
		}
	else{
		if((cCh&0x0f)<0x0a){
			return(cCh&0x0f);
			}
		else{
			return(0);
			}
		}
}

/**************************************************************************
*    函数原型: uchar HexToChar(uchar cCh);
*    功    能: 一个HEX字节转化为字符
**************************************************************************/
/*
uchar HexToChar(uchar cCh){

	if(cCh>=0&&cCh<10){
		return(0x30+cCh);
		}
	else{
		return(0x57+cCh);
		}
}

/**************************************************************************
*    函数原型: void CursorFlash(void);
*    功    能: 光标闪动
**************************************************************************/
/*
void CursorFlash(void){

	if(bFlash){
		WriteString(1, 0, "_");
		}
	else{
		WriteString(1, 0, " ");
		}
}

/**************************************************************************
*    函数原型: void Sector_Erase(uint addres)
*    功    能: 扇区擦除
**************************************************************************/
void Sector_Erase(uint addres){
//	uchar i;
	ISP_ADDRL=addres;     //低位地址
	ISP_ADDRH=addres>>8;  //高位地址
	ISP_CONTR=0x01;
	ISP_CONTR|=0x80; //设时间与充ISP操作。
	ISP_CMD=0x03;         //扇区命命令
	ISP_TRIG=0x46;        //触发
	ISP_TRIG=0xb9;        //触发启动。
	_nop_();
//	for(i=0;i<3;i++);
	ISP_ADDRL=0xff;
	ISP_ADDRH=0xff;
	ISP_CONTR=0x00;
	ISP_CMD=0x00;
	ISP_TRIG=0x00;
}

/**************************************************************************
*    函数原型: void Byte_Write(uint addres,uchar write_data)
*    功    能: 单字节写数据
**************************************************************************/
void Byte_Write(uint addres,uchar write_data){
//	uchar i;
	ISP_DATA=write_data;   //要写入的数据。
	ISP_ADDRL=addres;     //低位地址
	ISP_ADDRH=addres>>8;  //高位地址
	ISP_CONTR=0x01;
	ISP_CONTR|=0x80; //设时间与充ISP操作。
	ISP_CMD=0x02;         //写命令
	ISP_TRIG=0x46;        //触发
	ISP_TRIG=0xb9;        //触发启动。
	_nop_();
//	for(i=0;i<3;i++);
	ISP_ADDRL=0xff;
	ISP_ADDRH=0xff;
	ISP_CONTR=0x00;
	ISP_CMD=0x00;
	ISP_TRIG=0x00;
}

/**************************************************************************
*    函数原型: void Byte_Read(uint addres)
*    功    能: 单字节读数据
**************************************************************************/
uchar Byte_Read(uint addres){
//	uchar i;
	uchar caData;
	ISP_ADDRL=addres;     //低位地址
	ISP_ADDRH=addres>>8;  //高位地址
	ISP_CONTR=0x01;
	ISP_CONTR|=0x80; //设时间与充ISP操作。
	ISP_CMD=0x01;         //写命令
	ISP_TRIG=0x46;        //触发
	ISP_TRIG=0xb9;        //触发启动。
	_nop_();
//	for(i=0;i<3;i++);
	ISP_ADDRL=0xff;
	ISP_ADDRH=0xff;
	ISP_CONTR=0x00;
	ISP_CMD=0x00;
	ISP_TRIG=0x00;
	caData=ISP_DATA;
	return(caData);
}

/***********************************************************************************
函数名:void timeRead(void)
功能:保存参数
返回值:
***********************************************************************************/
void timeRead(void){
	vSecond=Byte_Read(vSecondAddr)+1;
	vMinute=Byte_Read(vMinuteAddr);
	vHour=Byte_Read(vHourAddr);
}

/***********************************************************************************
函数名:void TimeSave(void)
功能:保存参数
返回值:
***********************************************************************************/
/*
void TimeSave(void){
	Sector_Erase(UseAddr);
	Byte_Write(vSecondAddr, vSecond);
	Byte_Write(vMinuteAddr, vMinute);
	Byte_Write(vHourAddr, vHour);
}

/***********************************************************************************
函数名:void CountRead(void)
功能:保存参数
返回值:
***********************************************************************************/
/*
void CountRead(void){
	Count=Byte_Read(CountAddr);
}

/***********************************************************************************
函数名:void CountSave(void)
功能:保存参数
返回值:
***********************************************************************************/
/*
void CountSave(void){

	CountRead();
	Sector_Erase(CountAddr);
	if(Count++>50){
		Count=0;
	}
	Byte_Write(CountAddr, Count);
}

/**************************************************************************
*    函数原型: void DisplayTime(void);
*    功    能: 时间显示
**************************************************************************/
void DisplayTime(void){

	uchar cTemp[9];
	uchar ReadValue;

	ReadValue = ReadDs(SEC_READ);
	ReadValue = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	cTemp[0] = ReadValue/10 + '0';
	cTemp[1] = ReadValue%10 + '0';

	cTemp[2]=0x3a;

	ReadValue = ReadDs(MIN_READ);
	ReadValue = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	cTemp[3] = ReadValue/10 + '0';
	cTemp[4] = ReadValue%10 + '0';

	cTemp[5]=0x3a;

	ReadValue = ReadDs(HR_READ);
	ReadValue = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
	cTemp[6] = ReadValue/10 + '0';
	cTemp[7] = ReadValue%10 + '0';
	
	cTemp[8]='\n';

	put_str_xy(40, 0, cTemp);

}

/**************************************************************************
*    函数原型: void DisplayCount(void);
*    功    能: 时间显示
**************************************************************************/
/*
void DisplayCount(void){

	uchar cTemp[3];

	cTemp[0]=HexToChar(Count/10);
	cTemp[1]=HexToChar(Count%10);

	cTemp[2]=0x0a;

	put_str_xy(40, 16, cTemp);

}

/***********************************************************************************
函数名:void RecordSave(uchar number)
功能:保存每次具体参数
返回值:
***********************************************************************************/
/*
void RecordSave(void){

	uchar cTemp[3];

	cTemp[0]=vSecondST;
	cTemp[1]=vMinuteST;
	cTemp[2]=vHourST;

	Sector_Erase(RecordBaseAddr+0x1ff*Count);
	Byte_Write(RecordBaseAddr+0+0x1ff*Count, cTemp[0]);
	Byte_Write(RecordBaseAddr+1+0x1ff*Count, cTemp[1]);
	Byte_Write(RecordBaseAddr+2+0x1ff*Count, cTemp[2]);
}

/***********************************************************************************
函数名:void DisplayRecord(uchar number)
功能:显示每次具体参数
返回值:
***********************************************************************************//*
void DisplayRecord(uchar number){

	uchar cTemp[9];
	uchar i;
	uchar cNum[3];

	for(i=0;i<3;i++){
		cNum[i]=Byte_Read(RecordBaseAddr+i+0x1ff*number);
	}

	cTemp[0]=HexToChar(cNum[2]/10);
	cTemp[1]=HexToChar(cNum[2]%10);

	cTemp[2]=0x3a;

	cTemp[3]=HexToChar(cNum[1]/10);
	cTemp[4]=HexToChar(cNum[1]%10);

	cTemp[5]=0x3a;

	cTemp[6]=HexToChar(cNum[0]/10);
	cTemp[7]=HexToChar(cNum[0]%10);

	cTemp[8]=0x0a;

	put_str_xy(40, 0, cTemp);
}

/**************************************************************************
*    函数原型: void ChipInit(void);
*    功    能: 对CPU及外部的硬件资源进行初始化
**************************************************************************/
void ChipInit(void){

	IE=0;

	// 使用外部扩展RAM,允许ALE输出
	AUXR=0x00;						// 禁止使用外部扩展RAM,允许ALE输出

	// 定时器控制字初始化
	TMOD=0x21;						// 定时器1为方式1,定时器0为方式1
	T2CON=0x0d;						// 选择定时器1为波特率发生器,T2为捕获工作方式

	ET0=1;
	TH0=vT0HVal;					// 启动定时器0
	TL0=vT0LVal;
	TR0=1;

	// UART全双工串口的初始化
	SCON = 0x50;                    // 串口模式1,8位UART,接收使能
	TH1 = vBaudTime;					// 波特率目前为19200
	PCON&=0x7f;						// 串口通信速率倍数为1

	TR1=1;							// 启动波特率发生器
	ES=1;							// 允许串口中断
	// 优先级设置
	IPH = 0x02;
	IP  = 0x02;
	EA=1;
	// 系统看门狗设定
//	Dog_Init();
//	lcdreset();
}
/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void systeminitial(void){

	ChipInit();
/*	lcdfill(0xff);   //整屏显示
	delay_ms(100);
	lcdfill(0);    //清屏
	delay_ms(100);
*/
	vSecond=0;
	vMinute=0;
	vHour=0;

	vSecondST=0;
	vMinuteST=0;
	vHourST=0;

	FlashTime=250;

	DsInit();

	lcdreset();
	
}
/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void main(void){

	systeminitial();
	
	while(1){				
		DogReset();
		KeyHandle();
		DisplayTime();
	}
}

/**************************************************************************
*    函数原型: void Trint0(void) interrupt 1 using 1;
*    功    能: 全局定时
**************************************************************************/
void Trint0(void) interrupt 1 using 1{

	TR0=0; 									// 时基1MS
	TH0=vT0HVal;
	TL0=vT0LVal;
	TR0=1;
	TF0=0;

	if(!(--cT01ms)){
		cT01ms=vT01MS;

		if(iDY_Timer!=0xffff){					// 定时器标准定时
			if(iDY_Timer!=0x0000){
				--iDY_Timer;
			}
			else{
				iDY_Timer=0xffff;
			}
		}
		if(!(--cT010ms)){
	 		cT010ms=vT010MS;
			
vCurTime= ReadDs(SEC_READ);	
if(vPreTime!= vCurTime){
	vPreTime= vCurTime;
	SBUF= ReadDs(SEC_READ);
}
			if(FlashTime!=0xff){					// 定时器标准定时
				if(FlashTime!=0x00){
					--FlashTime;
				}
				else{
					bFlash=!bFlash;
				}
			}

			if(!(--cT01s)){
				cT01s=vT01S;
				
				b_1Min=1;

				if(++vSecondST>59){
					vSecondST=0;
					if(++vMinuteST>59){
						vMinuteST=0;
						if(++vHourST>99){
							vHourST=0;
						}
					}
				}

				if(++vSecond>59){
					vSecond=0;
//					b_1Min=1;
					if(++vMinute>59){
						vMinute=0;
						if(++vHour>99){
							vHour=0;
						}
					}
				}

			}
		}
	}
}
/************************************************************************
END
************************************************************************/


⌨️ 快捷键说明

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