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

📄 lhj.c

📁 自己单片机板c程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			}
		break;
		case 0x01://按1键设置跳变时间
			ET1=0;
			l_key=0xff;
			while(1){
				l_tmpdisplay[0]=l_timer/10;
				l_tmpdisplay[1]=l_timer%10;
				display(l_tmpdisplay,2);
				if(l_key==0x0a){
					l_key=0xff;
					if(l_timer<255)
						l_timer++;
				}
				if(l_key==0x0b){
					l_key=0xff;
					if(l_timer>1)
						l_timer--;
				}
				if(l_key==0x0c){
					l_key=0xff;
					ET1=1;
					break;
				}
			}
		break;
		case 0x0e:				//按#键调入写数据处理,可对相应段的64字节进行修改保存
			ET1=0;
			l_key=0xff;
			_24c02wdate(tmp);
			l_key=0xfe;
	   	break;
		case 0xfe:
			ET1=0;
			l_key=0xff;		
			for(j=0;j<8;j++){
			I2C_start();
			I2C_write(W24C02);
			I2C_ACK(0);
			I2C_write(tmp*64+j*8);
			I2C_ACK(1);
			I2C_stop();

			I2C_start();
			I2C_write(R24C02);			
			for(i=0;i<8;i++){
				I2C_ACK(0);
				l_lhj[j*8+i]=I2C_read();
			}		
			I2C_ACK(1);
			I2C_stop();
			for(i=0;i<50;i++){}
		 	}
			l_tmpdate[0]=0;
			l_tmpdate[1]=0;
			l_tmpdate[2]=0;
			TMOD&=0X2F;
			TL1=0x01;
			TH1=0x01;
			ET1=1;
			TR1=1;
		break;
		}
		
	}
}
void _24c02wdate(unsigned char tmp)//对数据的修改保存处理
{
unsigned char i,j,tmp2=0;
	while(1){
	P2=~l_lhj[tmp2];
	if (l_key==0x0c){
		l_key=0xff;
		break;
		}
	if(l_key==0x0e){
		l_key=0xff;
		for(j=0;j<8;j++){
		I2C_start();
		I2C_write(W24C02);
		I2C_ACK(0);
		I2C_write(tmp*64+j*8);	
		for(i=0;i<8;i++){
			I2C_ACK(0);
			I2C_write(l_lhj[j*8+i]);
		}
		I2C_ACK(1);
		I2C_stop();
		for(i=0;i<100;i++){
			leday();
		}
		}
		break;
	}
	if(l_key==0x0b){
		l_key=0xff;
		if(tmp2<63)
			tmp2++;
	}
	if(l_key==0x0a){
		l_key=0xff;
		if(tmp2>0)
			tmp2--;
	}
	if((l_key<0x09)&&(l_key>0)){		//每一字节可按相应的位来改相应某位的值
		i=1;
		l_key--;
		i<<=l_key;
		l_lhj[tmp2]=l_lhj[tmp2]^i;
		l_key=0xff;
	}
	}
}
void I2C_write(unsigned char tmp)
{
	unsigned char i;
	for(i=0;i<8;i++){
		SCL=0;
		_nop_();
		_nop_();
		_nop_();
		SDA=(bit)(tmp&0x80);
		tmp<<=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();	
		SCL=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();		
	}
	SCL=0;
}
unsigned char I2C_read(void)
{
	unsigned char i,tmp;
	tmp=0;
	for(i=0;i<8;i++){
		SCL=0;
		_nop_();
		_nop_();
		_nop_();
		SDA=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();	
		SCL=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();	
		tmp<<=1;
		if(SDA==1)
			tmp++;
	}
	SCL=0;
	return tmp;		
		
}
void I2C_ACK(bit tmp)
{
	SDA=tmp;		
	 _nop_();_nop_();_nop_();_nop_();_nop_();	
	 SCL=1;	
	 _nop_();_nop_();_nop_();_nop_();_nop_();	
	 SCL=0;		
}
void I2C_start(void)
{
	 SDA=1;		
	 _nop_();
	 SCL=1;  	
	 _nop_();
	 SDA=0;	
	 _nop_();
	 SCL=0;		
	 _nop_();
}

/*********/
void I2C_stop(void)
{
	 SDA=0;		
	 _nop_();
	 SCL=1;		
 	 _nop_();
	 SDA=1;		
	 _nop_();
	 SCL=0;		
	 _nop_();
}


void ad0831menu(void)//数模转换器的数据采集
{
	unsigned char i,tmp;
	tmp=0;
	while (1){
	
		if(l_key==0x0c){
			l_key=0xff;
			break;
		}
		i++;
		if(i==255){
		tmp=ad0831read();		
		i=0;
		l_tmpdate[0]=tmp/100;
		tmp=tmp%100;
		l_tmpdate[1]=tmp/10;
		l_tmpdate[2]=tmp%10;
		}
		display(l_tmpdate,3);
	}
}
unsigned char ad0831read(void)
{
	unsigned char i=0,tmp=0;
		SDA2=1;
		CS2=0;
		_nop_();
		_nop_();
		SCL2=0;
		_nop_();
		_nop_();
		SCL2=1;
		_nop_();
		_nop_();
		SCL2=0;
		_nop_();
		_nop_();
		SCL2=1;
		_nop_();
		_nop_();
		SCL2=0;
		_nop_();
		_nop_();
		for(i=0;i<8;i++){
			tmp<<=1;
			if(SDA2)
				tmp++;			
			SCL2=1;
			_nop_();
			_nop_();
			SCL2=0;
			_nop_();
			_nop_();
		}
		CS2=1;
	return tmp;
}
void ds1302menu(void)//时钟读取,可修改,按A、B键更改显示时间还是日期,再按#键可对其做修改
{
	unsigned char i,tmp,temp,oldtimer=0;
	tmp=0;
	while (1){	
		Read_RTC();
		if((tmp==0)&&(oldtimer!=l_tmpdate[0])){
			oldtimer=l_tmpdate[0];
			l_tmpdisplay[0]=l_tmpdate[2]/16;
			l_tmpdisplay[1]=l_tmpdate[2]&0x0f;
			l_tmpdisplay[2]=10;
			l_tmpdisplay[3]=l_tmpdate[1]/16;
			l_tmpdisplay[4]=l_tmpdate[1]&0x0f;
			l_tmpdisplay[5]=10;
			l_tmpdisplay[6]=l_tmpdate[0]/16;
			l_tmpdisplay[7]=l_tmpdate[0]&0x0f;
		}
		if((tmp==1)&&(oldtimer!=l_tmpdate[3])){
			oldtimer=l_tmpdate[3];
			l_tmpdisplay[0]=l_tmpdate[6]/16;
			l_tmpdisplay[1]=l_tmpdate[6]&0x0f;
			l_tmpdisplay[2]=10;
			l_tmpdisplay[3]=l_tmpdate[4]/16;
			l_tmpdisplay[4]=l_tmpdate[4]&0x0f;
			l_tmpdisplay[5]=10;
			l_tmpdisplay[6]=l_tmpdate[3]/16;
			l_tmpdisplay[7]=l_tmpdate[3]&0x0f;
		}
		display(l_tmpdisplay,8);
		display(l_tmpdisplay,8);
		display(l_tmpdisplay,8);
		display(l_tmpdisplay,8);
		if(l_key==0x0c){
			l_key=0xff;
			break;
		}
		if(l_key==0x0e){
			l_key=0xff;			
			for(i=0;i<7;i++){
			temp=l_tmpdate[i]/16;		//数据处理,在前程序讲过,时钟IC它是以十进制对数据存储,所以要将它转为二进制
			l_tmpdate[i]=l_tmpdate[i]%16;
			l_tmpdate[i]=temp*10+l_tmpdate[i];
			}
			i=0;
			while(1){		
				if(l_key==0x0c){
					l_key=0xff;
					break;
				}
				if(l_key==0x0e){			//按#键对修改的数据进行写入时钟IC1302
					l_key=0xff;
					Set_RTC();
					break;
				}
				switch(l_key){
				case 0x01:				//按1键对小时,或年的加1
					l_key=0xff;
					if(tmp==0){
						if(l_tmpdate[2]<23)
							l_tmpdate[2]++;
						}
					else{
						if(l_tmpdate[6]<99)
							l_tmpdate[6]++;
						}
				break;
				case 0x02:					//按2键对分钟,或月的加1
					l_key=0xff;
					if(tmp==0){
						if(l_tmpdate[1]<59)
							l_tmpdate[1]++;
						}
					else{
						if(l_tmpdate[4]<12)
							l_tmpdate[4]++;
						}
				break;
				case 0x03:					//按3键对秒,或日的加1
					l_key=0xff;
					if(tmp==0){
						if(l_tmpdate[0]<59)
							l_tmpdate[0]++;
						}
					else{
						if(l_tmpdate[3]<31)
							l_tmpdate[3]++;
						}
				break;
				case 0x04:					//按4键对小时,或年的减1
					l_key=0xff;
					if(tmp==0){
						if(l_tmpdate[2]>0)
							l_tmpdate[2]--;
						}
					else{
						if(l_tmpdate[6]>0)
							l_tmpdate[6]--;
						}
				break;
				case 0x05:				//按5键对分钟,或月的减1
					l_key=0xff;
					if(tmp==0){
						if(l_tmpdate[1]>0)
							l_tmpdate[1]--;
						}
					else{
						if(l_tmpdate[4]>0)
							l_tmpdate[4]--;
						}
				break;
				case 0x06:					//按6键对秒,或日的减1
					l_key=0xff;
					if(tmp==0){
						if(l_tmpdate[0]>0)
							l_tmpdate[0]--;
						}
					else{
						if(l_tmpdate[3]>0)
							l_tmpdate[3]--;
						}
				break;
				}
				ds1302play(tmp);
				}
			}
		if(l_key==0x0a){
			l_key=0xff;
			tmp=0;
		}
		if(l_key==0x0b){
			l_key=0xff;
			tmp=1;
		}
		
	}
}

void Write_Ds1302_Byte(unsigned  char temp) 
{
 unsigned char i;
 for (i=0;i<8;i++)     	//循环8次 写入数据
  { 
   SCL2=0;
     SDA2=temp&LSB;     	//每次传输低字节 
     temp>>=1;  		//右移一位
     SCL2=1;
   }
}   

/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )     
{
 	RST=0;
	_nop_();
 	SCL2=0;
	_nop_();
 	RST=1;	
   	_nop_();   //启动
 	Write_Ds1302_Byte(address);	//发送地址
 	Write_Ds1302_Byte(dat);		//发送数据
 	RST=0;  		//恢复
}
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;
	_nop_();
 	SCL2=0;
	_nop_();
 	RST=1;
	_nop_();
 	Write_Ds1302_Byte(address);
 	for (i=0;i<8;i++) 		//循环8次 读取数据
 	{
		SCL2=1;	
		_nop_();	
 		if(SDA2)
 		temp|=0x80;			//每次传输低字节
		SCL2=0;
		temp>>=1;			//右移一位
	} 
 	RST=0;
	_nop_();
	SCL2=1;	
	SDA2=0;

	return (temp);			//返回
}
/****************************************************************************/
void Read_RTC(void)		//读取 日历
{
 unsigned char i,*p;
 p=read_rtc_address; 	//地址传递
 for(i=0;i<7;i++)		//分7次读取 年月日时分秒星期
 {
  l_tmpdate[i]=Read_Ds1302(*p);
  p++;
 }
}
/***********************************************************************/
void Set_RTC(void)		//设定 日历
{
	unsigned char i,*p,tmp;
	for(i=0;i<7;i++){
		tmp=l_tmpdate[i]/10;
		l_tmpdate[i]=l_tmpdate[i]%10;
		l_tmpdate[i]=l_tmpdate[i]+tmp*16;
	}
 	Write_Ds1302(0x8E,0X00);
	
 	p=write_rtc_address;	//传地址	
 	for(i=0;i<7;i++)		//7次写入 年月日时分秒星期
 	{
		  Write_Ds1302(*p,l_tmpdate[i]);
 		 p++;  
	 }
	 Write_Ds1302(0x8E,0x80);
}
void ds1302play(unsigned char tmp)
{
	if(tmp==0){
			l_tmpdisplay[0]=l_tmpdate[2]/10;
			l_tmpdisplay[1]=l_tmpdate[2]%10;
			l_tmpdisplay[2]=10;
			l_tmpdisplay[3]=l_tmpdate[1]/10;
			l_tmpdisplay[4]=l_tmpdate[1]%10;
			l_tmpdisplay[5]=10;
			l_tmpdisplay[6]=l_tmpdate[0]/10;
			l_tmpdisplay[7]=l_tmpdate[0]%10;
		}
		else{
		l_tmpdisplay[0]=l_tmpdate[6]/10;
			l_tmpdisplay[1]=l_tmpdate[6]%10;
			l_tmpdisplay[2]=10;
			l_tmpdisplay[3]=l_tmpdate[4]/10;
			l_tmpdisplay[4]=l_tmpdate[4]%10;
			l_tmpdisplay[5]=10;
			l_tmpdisplay[6]=l_tmpdate[3]/10;
			l_tmpdisplay[7]=l_tmpdate[3]%10;
		}
		display(l_tmpdisplay,8);
}
void jdq(void)			//继电器
{
	while(1){
		if(JDQ){
			displaystr(OFF,3);
			}
		else{
			displaystr(ON,2);
			}
		if(l_key==0x0c){
			l_key=0xff;
			break;
		}
		if(l_key==0x01){		//按1键开关继电器
			l_key=0xff;
			JDQ=~JDQ;
		}
	}
}

⌨️ 快捷键说明

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