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

📄 led(20071020).c

📁 本人写的STC单片机EEPROM功能程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			else{
				cBtnValPre=cBtnVal;
				cBtnVal=cButton;
				return(vBtnAct_Push);
			}
		}
	}
}

/**************************************************************************
*    函数原型: bit ButtonKeep(uint iTime);
*    功    能: 检测按钮按下是否保持了指定的时间,单位为毫秒
	 返 回 值: 在指定时间内,按钮弹起,则返回0
	           否则返回1
*************************************************************************/
/*
bit keyKeep(uint iTime){

	uint iNum;

	for(iNum=0;iNum<iTime/50;iNum++){
		delay_ms(50);
		if(keyAction()==vBtnAct_Pop){
			return(0);
			}
		}
	return(1);
}
/***********************************************************************************
函数名:void keyhandle(void)
功能:按键处理
返回值:
***********************************************************************************/
void keyhandle(void){
	uchar cKeyType;

	// 按键单按时取值
	cKeyType=keyAction();
	if(cKeyType==vKeyAct_Push){
		cDY_KeyKeep=0xff;
		switch(cBtnVal){
			case vBtnVal_ST:
				eeprom_eares(UseAddr);
				eeprom_write(UseAddr, 0x01);
				b_Run=!b_Run;
//				cDY_KeyKeep=50;
				break;
			case vBtnVal_Up:
				eeprom_eares(UseAddr);
				eeprom_write(UseAddr, 0x02);
//				cDY_KeyKeep=50;
				break;
			case vBtnVal_Down:
				eeprom_eares(UseAddr);
				eeprom_write(UseAddr, 0x03);
//				cDY_KeyKeep=50;
				break;
			default:
				break;
		}
	}
}

/***********************************************************************************
函数名:void DisplayNum(uchar cNumber)
功能:显示子程序
返回值:
***********************************************************************************/
/*
void DisplayNum(uchar cNumber){
	Led_Data[cNumber];
}

/***********************************************************************************
函数名:uchar getcode(uchar i)
功能:根据共阴极字型编码表获取0~9,A~B字型代码
返回值:
***********************************************************************************/
/*
uchar getcode(uchar i){
	uchar cTemp;
	switch (i){
		case 0:  cTemp=0x05; break;   //
		case 1:  cTemp=0xDD; break;   //
		case 2:  cTemp=0x46; break;   //
		case 3:  cTemp=0x54; break;   //
		case 4:  cTemp=0x9C; break;   //
		case 5:  cTemp=0x34; break;   //
		case 6:  cTemp=0x24; break;   //
		case 7:  cTemp=0x5D; break;   //
		case 8:  cTemp=0x04; break;   //
		case 9:  cTemp=0x14; break;   //

		default:    break;
	}
	return(cTemp);
}

/***********************************************************************************
函数名:void display(void)
功能:显示函数
返回值:
***********************************************************************************/
void display(void){
	uchar i;

	wordbuf[3] = vSecond%10;
	wordbuf[2] = vSecond/10;
	wordbuf[1] = vMinute%10;
	wordbuf[0] = vMinute/10;

	switch (digbit){
		case 1: i=0;break;
		case 2: i=1;break;
		case 4: i=2;break;
		case 8: i=3;break;
		default:  break;
	}

//	DIGPORT = 0;      // 关闭显示
//	WORDPORT = getcode(wordbuf[i]);  // 送字型码
	WORDPORT = Led_Data[wordbuf[i]];  // 送字型码
	DIGPORT = ~ digbit;     // 送字位码

	if (digbit < 0x09){
		digbit <<= 1;
	}
	else{
		digbit = 0x01;
	}
	DogReset();
}

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

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

/***********************************************************************************
函数名:void Display(uchar cBit, uchar cNumber)
功能:显示子程序
返回值:
***********************************************************************************/
/*
void Display(uchar cBit, uchar cNumber){
//	uchar i;
	uchar cTemp;

	switch(cBit){
		case 0:
			cTemp=~0x08;
			break;

		case 1:
			cTemp=~0x04;
			break;

		case 2:
			cTemp=~0x02;
			break;

		case 3:
			cTemp=~0x01;
			break;
	}
//	for(i=0;i<4;i++){
		P1&=cTemp;
		P0=Led_Data[cNumber];
		delay_ms(5);
//	}
}

/**************************************************************************
*    函数原型: void IO_Init(void);
*    功    能: 对扩展IO口的状态进行初始化
**************************************************************************/
void IO_Init(void){
	P0=0x00;
	P1=0xFF;
	P2=0xff;
	P3=0x00;
}

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

	IE=0;

	// 使用外部扩展RAM,允许ALE输出
#if STC89C58
//	AUXR=0x02;						// 使用外部扩展RAM,允许ALE输出
	AUXR=0x00;						//使用内部扩展RAM(===========开始为0x02,结果一直出错)
#elif W77E58
	CKCON=0xc1;						// CKCON.2-0 = 100, MOVX指令用6个机器周期;CKCON.2-0 = 001, MOVX指令用3个机器周期
#endif
	// 定时器控制字初始化
	TMOD=0x21;						// 定时器1为方式2,定时器0为方式1
	TCON=0x05;						// 设置外部中断类型
	T2CON=0x0d;						// 选择定时器1为波特率发生器,T2为捕获工作方式
//	ET2=1;
	ET0=1; 					// 允许定时器0、定时器2中断


	// 外部中断设置
	EX0=0;							// FFSK中断初始时关闭,有载波时再开启
	EX1=0;
	IT1=1;							// 外部中断0、1均为下降沿触发
	IT0=1;

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

	// UART全双工串口的初始化
	SCON = 0x50;                     		// 串口模式1,8位UART,接收使能
/*
PCON|=0x80;

TH1 = 0xfa;//19200
TH1 = 0xfd;//38400
TH1 = 0xfe;//57600实际上11.0592M的晶振达不到
TH1 = 0xff;//115200实际上11.0592M的晶振达不到
*/
//	PCON|=0x80;
//	TH1 = 0xfd;					//SMOD=1,波特率为38400

	TH1 = vBaudTime;					// 波特率目前为9600Hz
	PCON&=0x7f;						// 串口通信速率倍数为1

//	TR1=1;							// 启动波特率发生器
//	ES=1;							// 允许串口中断

	// 优先级设置
//	PX0 = 1;
//	PT2 = 1;					// 解信令及接收FFSK为最高优先级,二者间不会引起冲突
	IP=0x02;					//PT2=1
	IPH=0x02;					//PT2H=1,PT0H=1
	EA=1;
/*
TCON=0x50;
IE=0xb2;
*/
	// 系统看门狗设定
	Dog_Init();

	// 外部芯片初始化
	IO_Init();

//	FK_RxEnable();					// CMX469初始化为接收
	delay_ms(10);					// 延时是为了避免定时器0无法产生中断的问题

}

/***********************************************************************************
函数名:void initial(void)
功能:初始化
返回值:
***********************************************************************************/
void SystemInitial(void){

	b_Run=0;
	digbit=0x01;
	timeRead();
	IO_Init();
	ChipInit();
}

/***********************************************************************************
函数名:void main(void)
功能:主程序
返回值:
***********************************************************************************/
void main(void){
	SystemInitial();
    while(1){
		DogReset();
		keyhandle();
		vEEprom=eeprom_read(UseAddr);
/*		if(vEEprom==0x01){
			Display(0,1);
		}
		else if(vEEprom==0x02){
			Display(0,2);
		}
		else{
			Display(0,3);
		}*/
//		Display(1,vSecond/10);
	}
}

/**************************************************************************
*    函数原型: void Trint0(void) interrupt 1 using 1;
*    功    能: 全局定时
**************************************************************************/
void Trint0(void) interrupt 1 using 1{
/*
// 2ms 定时设置
 time0_tmp = 65536-time0*fosc/12;
 TH0 = (time0_tmp/256);
 TL0 = (time0_tmp%256);
 */
	TR0=0; 									// 时基500uS
	TH0=vT0HVal;
	TL0=vT0LVal;
	TR0=1;
	TF0=0;

	if(!(--cT01ms)){
		cT01ms=vT01MS;
	display();
		if(iDY_Timer!=0xffff){					// 定时器标准定时
			if(iDY_Timer!=0x0000){
				--iDY_Timer;
			}
			else{
				iDY_Timer=0xffff;
			}
		}
		if(!(--cT010ms)){
	 		cT010ms=vT010MS;
			if(cDY_LedFlash!=0xff){				// 灯闪烁控制启动
	 			if(cDY_LedFlash!=0x00){
					--cDY_LedFlash;
	 			}
				else{
					cDY_LedFlash=vLedFlashTimeVal;
				}
	 		}
			if(cDY_KeyKeep!=0xff){				// 键盘扫描延时
	 			if(cDY_KeyKeep!=0x00){
					--cDY_KeyKeep;
	 				}
	 			}

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

				timeSave();

//				if(b_Run){
					if(vSecond++>59){
						vSecond=0;
						if(vMinute++>59){
							vMinute=0;
							if(vHour++>23){
								vHour=0;
							}
						}
					}
//				}
			}
		}
	}
}

⌨️ 快捷键说明

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