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

📄 tele_control.c

📁 基于PIC单片机的智能电话控制系统
💻 C
📖 第 1 页 / 共 2 页
字号:
		dot=0x50;
	}
	else
	{
		dsbuf[0]=year;
		dsbuf[1]=month;
		dsbuf[2]=day;
		dsbuf[3]=((week<<4)&0xf0)|0x02;
		dot=0x54;
	}
	if(key.b.k1)
	{	
		flash++;
		if(flash>0x0d)flash=0x00;
		if(flash==0x07)flash++;
	}
	if(key.b.k0)
	{
		flash--;
		if(flash&0xf0)flash=0x0d;
		if(flash==0x07)flash--;
	}
	if(key.b.k2){timechange();}
	flash|=0x80;
	if(key.b.kk3)
	{
		flash=STA=0x00;
		if(time_change==1)	//time change?
		{
			time_change=0;
			ds1302_write_time();
		}
	}
}
//**************************************************
//timechange is change,call one add one.
//**************************************************
void timechange(void)
{
	unsigned char i;
	time_change=1;		//time have changed
	i=(flash>>1)&0x03;
	if(flash&0x01)
	{
		dsbuf[i]++;
		if((dsbuf[i]&0x0f)>=0x0a){dsbuf[i]&=0xf0;}
	}
	else
	{
		dsbuf[i]+=0x10;
		if(dsbuf[i]>=0xa0){dsbuf[i]&=0x0f;}
	}
	if(flash&0x08)
	{
		hour=dsbuf[0];
		minute=dsbuf[1];
		second=dsbuf[2];
		if(hour>0x23){hour=dsbuf[0]=0x00;}
		if(minute>0x59){minute=dsbuf[1]=0x00;}
		if(second>0x59){second=dsbuf[2]=0x00;}
	}
	else
	{
		year=dsbuf[0];
		month=dsbuf[1];
		day=dsbuf[2];
		week=(dsbuf[3]>>4)&0x0f;
		if(month>0x12){month=dsbuf[1]=0x01;}
		if(month==0x00){month=dsbuf[1]=0x01;}
		if(day>0x31){day=dsbuf[2]=0x01;}
		if(day==0x00){day=dsbuf[2]=0x01;}
		if((month==0x04)|(month==0x06)|(month==0x09)|(month==0x11))
		{if(day>0x30){day=dsbuf[2]=0x01;}}
		if(month==0x02)
		{
			if(year&0x03){if(day>0x28){day=dsbuf[2]=0x01;}}
			else{if(day>0x29){day=dsbuf[2]=0x01;}}
		}
		if(week>0x07){week=0x01;dsbuf[3]=0x10|(dsbuf[3]&0x0f);}
		if(week==0x00){week=0x01;dsbuf[3]=0x10|(dsbuf[3]&0x0f);}
	}
}
//************************
//control key for STA=0
//************************
void key_control(void)
{
	unsigned char i;
	if(key.halfkey[1]&0x0f)
	{
		i=ds1302_read(adr_jdqsta);
		if(key.b.kk0)
		{
			if(i&0x01){i&=0xfe;}
			else{i|=0x01;}
			i&=0xef;
		}
		if(key.b.kk1)
		{
			if(i&0x02){i&=0xfd;}
			else{i|=0x02;}
			i&=0xdf;
		}
		if(key.b.kk2)
		{
			if(i&0x04){i&=0xfb;}
			else{i|=0x04;}
			i&=0xbf;
		}
		if(key.b.kk3)
		{
			if(i&0x08){i&=0xf7;}
			else{i|=0x08;}
			i&=0x7f;
		}
		ds1302_write(ds1302_control,0x00);	//close write protect
		ds1302_write(adr_jdqsta,i);			//jdq indect control
		ds1302_write(ds1302_control,0x80);	//open write protect
	}
	if(key.halfkey[0]&0xf0)
	{
		if(key.b.lk0)			//if keytimer>=1s,then set time
		{
			timedelay0++;
			if(timedelay0==0xfa)
			{
				time_change=0;	//time change reclear
				flash=0x00;
				STA=0X03;
			}
		}
		else{timedelay0=0x00;}
		if(key.b.lk1)			//if keytimer>=1s,then set time
		{
			timedelay1++;
			if(timedelay1==0xfa)
			{
				ANALOGUP=1;			//
				voice(0xa1);
				password_buf[0]=0xaa;
				password_buf[1]=0xaa;
				password_buf[2]=0xaa;
				password_buf[3]=0xaa;
				password_buf[4]=0xaa;
				password_buf[5]=0xaa;
				password_buf[6]=0xaa;
				password_buf[7]=0x00;
				Tel_num_change=0;
				STA=0X04;
			}
		}
		else{timedelay1=0x00;}
		if(key.b.lk2)			//if keytimer>=1s,then set time
		{
			timedelay2++;
			if(timedelay2==0xfa)
			{
				ANALOGUP=1;			//
				voice(0xa1);
				password_buf[0]=0xaa;
				password_buf[1]=0xaa;
				password_buf[2]=0xaa;
				password_buf[3]=0xaa;
				password_buf[4]=0xaa;
				password_buf[5]=0xaa;
				password_buf[6]=0xaa;
				password_buf[7]=0x00;
				Tel_num_change=0;
				STA=0X04;
			}
		}
		else{timedelay2=0x00;}
		if(key.b.lk3)			//if keytimer>=1s,then reset all data
		{
			timedelay3++;
			if(timedelay3==0xfa)
			{
				dsbuf[0]=0xff;
				dsbuf[1]=0xff;
				dsbuf[2]=0xff;
				dsbuf[3]=0xf0;
				dot=0x00;
				STA=0X02;
			}
		}
		else{timedelay3=0x00;}
	}
	i=ds1302_read(adr_jdqsta);
	dsbuf[3]=(dsbuf[3]&0xf0)|(i&0x0f);
	i&=0x0f;
	PORTB=(LED4[i])|(PORTB&0x0f);
}
//************************
//2ms Timer
//************************
void Time(void)
{
	while(!TMR0IF);					//2mS out?
	TMR0=0x07;						//249*8+6=1998
	asm("clrwdt");
	while(TMR0IF==1)				//clear TMR0IF
	{TMR0IF=0;}	
}
//******************
//set when power up
//******************
void Initial(void)			
{
	if(POR==0)
	{
		PORTA=0x00;
		PORTB=0x00;
		PORTC=0x80;
		password1_buf[0]=0xaa;		//reload
		password1_buf[1]=0xaa;
		password1_buf[2]=0xaa;
		password1_buf[3]=0xaa;
		password1_buf[4]=0xaa;
		password1_buf[5]=0xaa;
		password1_buf[6]=0xaa;
		password_buf[0]=0xaa;		//reload
		password_buf[1]=0xaa;
		password_buf[2]=0xaa;
		password_buf[3]=0xaa;
		password_buf[4]=0xaa;
		password_buf[5]=0xaa;
		password_buf[6]=0xaa;
		password_buf[7]=0x00;
	}	
	while(POR==0){POR=1;}
}
//***************************
//reset special function registers
//***************************
void SFRSET(void)		
{
	TRISA=0x13;					//
	TRISB=0x01;
	TRISC=0x0F;					//
	PIE1=0x00;
	ADCON1=0x06;				//shut down all AD
	PCLATH=0x00;
	OPTION=0xc2;				//timer0,RBPU=1,Interrupt on rising edge of RB0/INT pin
	INTE=1;						//enable INT
	PEIE=1;						//enable peie
	GIE=1;
	T2CON=0X25;					//timer2 /(5*4)
	PIR1=0x00;
	ADCON0=0x00;
	TMR0=0x06;					//2mS Timer 250*8
    STA=0X00;
	STA1=0X00;
	STA2=0X00;
}
//****************************
//reset system
//****************************
void system_reset(void)
{
	ds1302_write(ds1302_control,0x00);	//close write protect
	ds1302_write(ds1302_charger,0xa9);	//trickle charger
	ds1302_write(adr_ringtimes,0x04);	//ring times,4 times
	ds1302_write(adr_jdqsta,0x00);		//jdq state,all close
	ds1302_write(adr_password,0x31);	//password0,31
	ds1302_write(adr_password+2,0x5f);	//password1,5#
	ds1302_write(adr_password+4,0xaa);	//password2,aa
	ds1302_write(adr_password+6,0xaa);	//password3,aa
	ds1302_write(adr_password+8,0xaa);	//password4,aa
	ds1302_write(adr_password+10,0xaa);	//password5,aa
	ds1302_write(adr_password+12,0xaa);	//password6,aa
	ds1302_write(ds1302_control,0x80);	//open write protect
}
//****************************
//Display program
//****************************
void Display(void)
{
	unsigned char i,j,k;
	k=Bit_Select>>1;
	j=dsbuf[k];
	if(Bit_Select^0x07)			//
		{if(Bit_Select&0x01)	//btfsc Bit_Select,0
			{j&=0X0f;}			//get low 4 bit
		else{j=j>>4&0X0f;}		//get high 4 bit
		k=LED7[j];
		}				//get ledcode
	else{k=j&0x0f;}				//get ledscode
	if(flash&0x80)
	{
		if(Bit_Select==(flash&0x07))
		{if(inc4ms&0x80){k=0x00;}}
	}
	if(dot<<Bit_Select&0x80){k|=0x02;}
	j=bitcode[Bit_Select&0x07];	
	Bit_Select++;
	if(Bit_Select==0x08){Bit_Select=0x00;}
	RCK595=0;				//put out 2*8 bit data
	i=0x08;
	do{
		SCK595=0;
		SEC595=0;
		if(j&0x01)SEC595=1;	//put out the lowest  bit of ledbit
		j>>=1;
		SCK595=1;	
	}while(--i);
	i=0x08;
	do{
		SCK595=0;
		SEC595=0;
		if(k&0x01)SEC595=1;	//put out the lowest bit of ledcode
		k>>=1;
		SCK595=1;	
	}while(--i);
	RCK595=1;
}
//*****************************
//Keyscan program
//*****************************
void KEYScan(void)
{
	unsigned char i,j,k;
	//blow is key scan
		HANG1=0;					//
		i=0x05;while(i--){;}		//8+3*(i-1)=delay 20uS
		k=(PORTC^0X0f)&0x0f;
		HANG1=1;
		k=k|(key.halfkey[0]&0xf0);
	//blow is cut the key vibration
		for(i=0;i<4;i++)
		{
			kcap[i]+=(kcap[i]<<1)+(kcap[i]<<2);
			if(k&0x01){kcap[i]+=0x10;}
			kcap[i]>>=3;
			k>>=1;
			if(kcap[i]>=6){k|=0x80;}	//set
			else{k&=0x7f;}			//clear
		}
		j=k;
		k=(k<<4)|(k>>4);	//==swap k
	//blow is border test,before border=Key		
	key.halfkey[0]=(((j^k)&k)&0x0f)|(j&0xf0);
	key.halfkey[1]=((j^k)&j)&0x0f;
}
//*****************************
//
//*****************************
void jdq_indect(void)
{
	if(Tel_num_change)
	{
		unsigned char i;
		i=ds1302_read(adr_jdqsta);
		Tel_num_change=0;
		voice(0x7c);
		if(Tel_num==0x01)
		{
			jdq_delay=1;
			if(i&0x01){i&=0xfe;voice(0x58);}
			else{i|=0x01;voice(0x40);}
		}
		if(Tel_num==0x02)
		{
			jdq_delay=1;
			if(i&0x02){i&=0xfd;voice(0x58);}
			else{i|=0x02;voice(0x40);}
		}
		if(Tel_num==0x03)
		{
			jdq_delay=1;
			if(i&0x04){i&=0xfb;voice(0x58);}
			else{i|=0x04;voice(0x40);}
		}
		if(Tel_num==0x04)
		{
			jdq_delay=1;
			if(i&0x08){i&=0xf7;voice(0x58);}
			else{i|=0x08;voice(0x40);}
		}
		if(Tel_num==0x0e)
		{
			VOICE=0;
			voice(0x60);
			jdq_delay=0;
			INTE=1;
			STA=0x01;
		}
		if(jdq_delay)
		{
			ds1302_write(ds1302_control,0x00);	//close write protect
			ds1302_write(adr_jdqsta,i);			//jdq indect control
			ds1302_write(ds1302_control,0x80);	//open write protect
			i&=0x0f;
			PORTB=(LED4[i])|(PORTB&0x0f);
		}
		dsbuf[0]=dsbuf[2]=0xee;
		dsbuf[1]=Tel_num;
		dsbuf[3]=(dsbuf[3]&0x0f)|0xa0;
		Tel_num=0x00;
	}
	if(jdq_delay)			//wait for 1S
	{
		timedelay++;
		if(timedelay==0xfa)
		{
			jdq_delay=0;
			INTE=1;
		}
		else{INTE=0;}
	}
	else
	{
		INTE=1;
		timedelay=0x00;
	}
}
//*****************************
//
//*****************************
void jdq_check(void)
{
	if(Tel_num_change)
	{
		unsigned char i;
		Tel_num_change=0;
		voice(0x7c);
		i=ds1302_read(adr_jdqsta);
		dsbuf[0]=dsbuf[2]=0xee;
		dsbuf[1]=0xff;
		dsbuf[3]=(dsbuf[3]&0x0f)|0xa0;
		if(Tel_num==0x01)
		{
			dsbuf[1]=Tel_num;
			if(i&0x01){voice(0x40);}
			else{voice(0x58);}
		}
		if(Tel_num==0x02)
		{
			dsbuf[1]=Tel_num;
			if(i&0x02){voice(0x40);}
			else{voice(0x58);}
		}
		if(Tel_num==0x03)
		{
			dsbuf[1]=Tel_num;
			if(i&0x04){voice(0x40);}
			else{voice(0x58);}
		}
		if(Tel_num==0x04)
		{
			dsbuf[1]=Tel_num;
			if(i&0x08){voice(0x40);}
			else{voice(0x58);}
		}
		if(Tel_num==0x05)
		{
			dsbuf[1]=Tel_num;
			if(VOICE){VOICE=0;voice(0x58);}
			else{VOICE=1;voice(0x40);}
		}
		if(Tel_num==0x0e)
		{
			VOICE=0;
			voice(0x60);
			STA=0x01;
		}
		Tel_num=0x00;
	}

}
//*****************************
//
//*****************************
void reset_password(void)
{
	if(Tel_num_change)
	{	
		unsigned char i,j;
		Tel_num_change=0;
		i=Tel_num&0x0f;
		j=0xf0;
		if(password_buf[7]&0x01)
		{;}
		else
		{
			i=(i>>4)|(i<<4);
			j=(j<<4)|(j>>4);
		}
		if(check_bit0)
		{
			password_buf[(password_buf[7]>>1)&0x07]&=j;
			password_buf[(password_buf[7]>>1)&0x07]|=i;
		}
		else
		{
			password1_buf[(password_buf[7]>>1)&0x07]&=j;
			password1_buf[(password_buf[7]>>1)&0x07]|=i;
		}
		password_buf[7]++;
		if(password_buf[7]==0x0e)
		{
			password_buf[7]=0x0d;
		}
		if(Tel_num==0x0f)		//Tel_num==#?
		{	
			Tel_num=0x00;
			password_buf[7]=0x00;
			if(check_bit0){check_bit1=1;}
			check_bit0=1;
			voice(0x40);
		}
		if(check_bit1)
		{
			check_bit0=0;
			check_bit1=0;
			for(i=0;i<7;i++)
			{
				if(password_buf[i]==password1_buf[i])
				{;}
				else
				{	password_times|=0x80;}
			}
			if(password_times&0x80)
			{
				password_times&=0x7f;
				voice(0x7c);
			}
			else
			{
				ds1302_write(ds1302_control,0x00);	//close write protect
				ds1302_write(adr_password,password_buf[0]);	//password0
				ds1302_write(adr_password+2,password_buf[1]);	//password1
				ds1302_write(adr_password+4,password_buf[2]);	//password2
				ds1302_write(adr_password+6,password_buf[3]);	//password3
				ds1302_write(adr_password+8,password_buf[4]);	//password4
				ds1302_write(adr_password+10,password_buf[5]);	//password5
				ds1302_write(adr_password+12,password_buf[6]);	//password6
				ds1302_write(ds1302_control,0x80);	//open write protect
				voice(0x60);
				STA=0X01;
			}
			password1_buf[0]=0xaa;		//reload
			password1_buf[1]=0xaa;
			password1_buf[2]=0xaa;
			password1_buf[3]=0xaa;
			password1_buf[4]=0xaa;
			password1_buf[5]=0xaa;
			password1_buf[6]=0xaa;
			password_buf[0]=0xaa;		//reload
			password_buf[1]=0xaa;
			password_buf[2]=0xaa;
			password_buf[3]=0xaa;
			password_buf[4]=0xaa;
			password_buf[5]=0xaa;
			password_buf[6]=0xaa;
			password_buf[7]=0x00;	
		}
		if(Tel_num==0x0e)
		{
			check_bit0=0;
			check_bit1=0;
			password_times&=0x7f;
			password1_buf[0]=0xaa;		//reload
			password1_buf[1]=0xaa;
			password1_buf[2]=0xaa;
			password1_buf[3]=0xaa;
			password1_buf[4]=0xaa;
			password1_buf[5]=0xaa;
			password1_buf[6]=0xaa;
			password_buf[0]=0xaa;		//reload
			password_buf[1]=0xaa;
			password_buf[2]=0xaa;
			password_buf[3]=0xaa;
			password_buf[4]=0xaa;
			password_buf[5]=0xaa;
			password_buf[6]=0xaa;
			password_buf[7]=0x00;
			voice(0x60);
			STA=0x01;
		}
		if(check_bit0)
		{
			if((password_buf[7]&0x0f)>0x06)
			{
				dsbuf[0]=password_buf[3];
				dsbuf[1]=password_buf[4];
				dsbuf[2]=password_buf[5];
				dsbuf[3]=(password_buf[6]&0xf0)|(dsbuf[3]&0x0f);
			}
			else
			{
				dsbuf[0]=password_buf[0];
				dsbuf[1]=password_buf[1];
				dsbuf[2]=password_buf[2];
				dsbuf[3]=0x20|(dsbuf[3]&0x0f);
			}
		}
		else
		{
			if((password_buf[7]&0x0f)>0x06)
			{
				dsbuf[0]=password1_buf[3];
				dsbuf[1]=password1_buf[4];
				dsbuf[2]=password1_buf[5];
				dsbuf[3]=(password1_buf[6]&0xf0)|(dsbuf[3]&0x0f);
			}
			else
			{
				dsbuf[0]=password1_buf[0];
				dsbuf[1]=password1_buf[1];
				dsbuf[2]=password1_buf[2];
				dsbuf[3]=0x10|(dsbuf[3]&0x0f);
			}
		}
	}	
}
//*****************************
//
//*****************************
void reset_ringtimes(void)
{
	if(Tel_num_change)
	{
		Tel_num_change=0;
		dsbuf[0]=0xee;
		dsbuf[1]=0xff;
		dsbuf[2]=0xee;
		dsbuf[3]=0xa0|(dsbuf[3]&0x0f);
		if(Tel_num==0x0e)
		{
			voice(0x60);
			STA=0x01;
		}
		else if(Tel_num==0x00)
		{
			voice(0x7c);
		}
		else if(Tel_num==0x0f)
		{
			voice(0x7c);
		}
		else
		{
			dsbuf[1]=Tel_num;
			voice(0x40);
			ds1302_write(ds1302_control,0x00);	//close write protect
			ds1302_write(adr_ringtimes,Tel_num);//ring times,n times
			ds1302_write(ds1302_control,0x80);	//open write protect
		}
		Tel_num=0x00;
	}
}

⌨️ 快捷键说明

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