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

📄 sample.c

📁 contain many examples code for I2c,UART,string ,digital convert, read/write to EEprom in microchip P
💻 C
字号:
/*
 * Sample application using LCD interface (see lcd.c) and analog input
 * on a 16C71 (see adc.c)
 * 
 * 1) Read channel 0 of the ADC and write it to the LCD
 * 2) Read serial data and write it to line 2 of the LCD
 * 
 */

#define   O_FREQ		RC4		
#define	O_LED		RC5		
#define	O_POS		RC6	
#define	O_NEG		RC7


#define TMR_STOP 	0
#define TMR_RUN		1

//#define	_16CF877
//#define   _16c62a
#include	<pic.h>

#define    INT_ON  1


void check_key(void);
void sys_initial(void);
void sys_tmr_check(void);
void sys_freq_check(void);
void sys_signal_check(void);
void set_hz03(void);
void set_hz91(void);
void set_hz30(void);
void set_hz292(void);


 
 //----the data of system------
unsigned char 	sys_freq;
unsigned char 	sys_timer;
unsigned char 	sys_signal;
unsigned char		sys_long_timer;

unsigned char 	long_timer;
unsigned char 	test_int;
unsigned long 		tr_index=0;
unsigned long 		tr_pwm_index=0;



unsigned char 	tr0_10k;
unsigned char		h_sec_index;
unsigned char		one_min_index;	
unsigned long		tran_tmr;
unsigned long 		pwm_tmr;
unsigned long		half_sec_tmr;
unsigned long		one_minute_tmr;

//----bit flags of system------static  bit
unsigned char 	sys_tmr_changed;
unsigned char 	sys_freq_changed;	
unsigned char 	sys_signal_changed;
unsigned char 	start_carry; 	//start transfer 10khz
unsigned char 	signal_st;
unsigned char 	stop_tmr; 		//LONG TIME TIMER
// tr_index=31009  freq=0.3hz  
//
//
// tr_index=34     freq=292hz  
main()
{
	
	sys_initial();

	
	//set_hz292();
	for(;;)
	{
	//start_carry=12;
	asm("clrwdt");
	
	if(stop_tmr==TMR_RUN)
	{
			
		if(tr_index >tran_tmr )
			{			
			tr_index=0;
			tr_pwm_index=0;
			start_carry=1;
			}
	
	
		if(tr_pwm_index>pwm_tmr)
			{
		
			tr_pwm_index=0;
			start_carry=0;
			tr0_10k=0;
			O_FREQ=0;
			}
		if(half_sec_tmr > 5000)
			{
			if(signal_st)
				{
				h_sec_index=~h_sec_index;
				if(!h_sec_index){
				O_POS=0; 
				O_NEG=1;}
				else { 
				O_POS=1; 
				O_NEG=0;}
				}
			half_sec_tmr=0;
		
			}
		// one minute = 600000
		if( one_minute_tmr > 600000 )
			{
			//one_min_index=~one_min_index;
			//if(!one_min_index) O_LED=0;
			//else O_LED=1;
			
			
			long_timer++;
			if  (sys_long_timer ==0xff ) long_timer=0;
			if  (long_timer == sys_long_timer )  stop_tmr=TMR_STOP;
				
			
			one_minute_tmr=0;
			}
		}
	//   TIMER COUNT FINISH AND CLRAN ALL DATA
	if(	stop_tmr==TMR_STOP){
			O_FREQ=0;
			O_LED=0;
			O_POS=0;
			O_NEG=0;}


	
	check_key();
	sys_tmr_check();		
	sys_freq_check();
	sys_signal_check();

	}
}

// purpose	:system setup routine 
// input 		:
//ouput		:
void sys_initial(void)
{
	//CLEAN RAM
	INTCON=0;
	PIR1=0;
	PIE1=0;
	TMR1L=0;
	TMR1H=0;
	OPTION=0;
	TRISC = 0x0F;		
	PORTC = 0x00;	// Initialise interrupt-controlled lights (upper 4 bits).
	#ifdef  _16CF877
	ADCON1=0x06;
	#endif
	ADCON1=0x06;

	TRISA =0xFF;
	PORTA=0x00;
	TRISB =0xFF;
	PORTA=0x00;
	
	// Initialise & start timer0.
	T0IE=1;
	T0CS = 0;		
	//initial timr1
	TMR1IE=1;
	TMR1ON=1;
	#ifdef  INT_ON
	GIE=1;
	PEIE=1;
	#endif
	TMR1IE=1;

	tr0_10k=0xff;
	// clean status  control flag 
	sys_tmr_changed=0;
	sys_freq_changed=0;
	sys_signal_changed=0;
	half_sec_tmr=0;
	one_minute_tmr=0;
	test_int=0xFF;
	signal_st=0;
	stop_tmr=TMR_RUN;
	start_carry=0;
	
}

//purpose	: interrupt  routine for timer0 and timer1  
// input 		:
//ouput		:
interrupt void
timer0_overflow_isr( void)
{
	

	// CONTROL TIMER-0
	if(T0IF==1)
		{
		//PORTC = 0xAA;
		TMR0=215;
		if(stop_tmr==TMR_RUN)
		{
		if(start_carry)
			{
			O_LED=1;
			tr0_10k=~tr0_10k;
			if(tr0_10k==0) O_FREQ=0;
			else	O_FREQ=1;
			}
		if(!start_carry) O_LED=0;
		}
		

		
		T0IF = 0;		// Clear Timer 0 Interrupt Flag.
		}
	
	// CONTROL TIMER-1
	if(TMR1IF==1)
		{

		TMR1L=90;
		TMR1H=0xFF;
		tr_index++;
		tr_pwm_index++;
		half_sec_tmr++;
		one_minute_tmr++;
		TMR1IF=0;
		}
	

}

// purpose		:check user press any key  
// input 		:
// output		:
void check_key(void)
{
	unsigned char data_temp;
	//check timer select in PORTA
	data_temp=PORTA;
	data_temp &= 0x0F;
	
	if(data_temp != sys_timer)
		{
		sys_tmr_changed=1;
		sys_timer=data_temp;
		}
	
	//check freqence in PORTC
	data_temp=PORTC;
	data_temp &= 0x0F;

	if(data_temp != sys_freq)
		{
		sys_freq_changed=1;
		sys_freq=data_temp;
		}
	if(data_temp==0)
		{
		stop_tmr=TMR_STOP;		
		O_FREQ=0;
		O_LED=0;
	//	O_POS=0;
	//	O_NEG=0;
		start_carry=0;
		asm("sleep");
		asm("nop");
		asm("sleep");
		asm("nop");
	
		
		}

	//check signal in PORTB
	data_temp=PORTB;
	data_temp &= 0x07;
	if(data_temp != sys_signal)
		{
		sys_signal_changed=1;
		sys_signal=data_temp;
		}
	

}

//purpose	:check timer selecr have ever change 
//input 	:
//output	:

void sys_tmr_check(void)
{
	if(sys_tmr_changed)
		{
		switch(sys_timer)
			{
			
			case 0x01 :	//RA0 PRESS ,1OMIN
			sys_long_timer=10;
			
			break;

			case 0x02 :	//RA1 PRESS ,20MIN
			sys_long_timer=20;
			
			break;

			case 0x04:	//RA2 PRESS ,60MIN
			sys_long_timer=60;
			break;

			case 0x08 : //CONTINUOUS
			sys_long_timer=0xFF;
			break;
			
			default :	//NON SELECT
			sys_long_timer=0xFF;

			break;
			}
			long_timer=0;
			sys_tmr_changed=0;
			one_minute_tmr=0;
			tr_index=0;
			tr_pwm_index=0;
			half_sec_tmr=0;
			
		}

}


// purpose	:check timer selecr have ever change 
//input 		:
//output		:
void sys_freq_check(void)
{
	if(sys_freq_changed)
		{
		switch(sys_freq)
			{
			case 0x01 :	//0.3HZ (PW=1.8S)
			//RC4	=1;
			set_hz03();
			stop_tmr=TMR_RUN;		

			break;
			case 0x02 :	//9.1HZ (PW=64MS)
			//RC5=1;
			set_hz91();
			stop_tmr=TMR_RUN;		

			break;
			case 0x04:	//30HZ	(PW=20MS)
			//RC6=1;
			set_hz30();
			stop_tmr=TMR_RUN;		

			break;
			case 0x08 : //292HZ (PW=16MS)
			//RC7=1;
			set_hz292();
			stop_tmr=TMR_RUN;		

			break;
			//case 0x00 :
			default:	
			stop_tmr=TMR_STOP;		
			O_FREQ=0;
			O_LED=0;
			//O_POS=0;
			//O_NEG=0;
			start_carry=0;
			break;
			}
		sys_freq_changed=0;
		}
	// 2003.3.24 changed here 
	asm("clrwdt");
	asm("clrwdt");
	asm("clrwdt");
	asm("clrwdt");


	
	data_temp=PORTB;
	data_temp &= 0x07;
	sys_signal=data_temp;
	sys_signal_changed=1;
	sys_signal_check();
	// stop....

}

//purpose	:check timer selecr have ever change 
//input 		:
//ouput		:
void sys_signal_check(void)
{

	if(sys_signal_changed)
	{
		switch(sys_signal)
			{
			case 0x6 :	//POSITIVE
			O_POS=1;
			O_NEG=0;
			signal_st=0;
			//RC4=1;
			break;
			case 0x05 :	//NEGATIVE
			//RC5=1;
			//PORTC=0xAA;
			O_POS=0;
			O_NEG=1;
			signal_st=0;
			break;
			case 0x03:	//BI-PHASIC
			//RC6=1;
			signal_st=1;
			break;
			case 0x0f :
			//PORTC=00;
			
		
			
			break;
		}
	sys_signal_changed=0;
	}
}

// purpose : setup in 0.3hz


void set_hz03(void)
{
	tr_index=31008;
 	tran_tmr=31009;
 	pwm_tmr=18000;
}
//purpose : setup  in 9.1hz


void set_hz91(void)
{
	tr_index=1108;
 	tran_tmr=1100;
 	pwm_tmr=640;
}
//purpose : setup in 30hz

void set_hz30(void)
{
	tr_index=329;
 	tran_tmr=330;
 	pwm_tmr=200;
}

//purpose : setup in 30hz

void set_hz292(void)
{
	tr_index=33;
 	tran_tmr=33;
 	pwm_tmr=16;
}

⌨️ 快捷键说明

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