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

📄 main.c

📁 salvo 一个功能和效率并重的操作系统 适合各种8-BIT的MCU
💻 C
📖 第 1 页 / 共 2 页
字号:


void	Task_Keypad(void)
{	
		static char pot;
	for(;;)
	{	
		OS_WaitBinSem(DISPLAY, task_keypad1);
		PORTD = 0x0F;				//LED'S OFF
		TRISB = 0xF0;				//RB7:RB4 = INPUTS,RB3:RB0 = OUTPUTS
		
		switch(ButtonPress(0b00001110) )	
		{
		case 0x7E:				//SET LOW AND HIGH TEMPS
			PORTD = 0x00;			//TURN ON DIGITS TO
			TRISB = 0x00;			//  SHOW TEMP SETTING
			PORTB = 0x00;			//   ACTIVATION
			OS_Delay(200, task_keypad2);
	
		//GET LOW TEMPERATURE LIMIT	
			PEIE = 0;			//INTERRUPT DISABLED

			Low_Hi = 0;		
			BcdConv(Keys());		//GET 1ST DIGIT			
			while( PORTB != 0xF0 );
								
			BcdConv(Keys());		//GET 2ND DIGIT			
			while( PORTB != 0xF0 );	
								
			BcdConv(Keys());		//GET 3RD DIGIT		
			low = Low_Hi;

			Display(low);			//DISPLAY LOW TEMP
			PORTD = 0x0F;			//LED'S OFF
			TRISB = 0xF0;			//RB7:RB4 = INPUTS,RB3:RB0 = OUTPUTS

		//GET HIGH TEMPERATURE LIMIT
			
			Low_Hi = 0;		
			BcdConv(Keys());		//GET 1ST DIGIT		
			while( PORTB != 0xF0 );
									
			BcdConv(Keys());		//GET 2ND DIGIT			
			while( PORTB != 0xF0 );
									
			BcdConv(Keys());		//GET 3RD DIGIT			
			high = Low_Hi;
			Display(high);			//DISPLAY HIGH TEMP
			PEIE = 1;			//INTERRUPT RE-ENABLED
			break;
		
				//POTENTIOMETER SELECTION
	
		case 0xEE:				//#1
			pot = 1;
			OSSignalMsg(POTVAL,(OStypeMsgP)&pot);	//SIGNAL task_pots() W/ POT-1
			break;
	
		case 0xDE:				//#4	
			pot = 4;
			OSSignalMsg(POTVAL,(OStypeMsgP)&pot);	//SIGNAL task_pots() W/ POT-4
			break;
			
		default:
			break;
		}

	
		if(ButtonPress(0b00001101) == 0xED)	//#2
		{	
		
			pot = 2;		
			OSSignalMsg(POTVAL,(OStypeMsgP)&pot);	//SIGNAL task_pots() W/ POT-2
		}	
			
		
		switch(ButtonPress(0b00001011) )	
		{
		case 0xEB:
			pot = 3;			//#3		
			OSSignalMsg(POTVAL,(OStypeMsgP)&pot);	//SIGNAL task_pots() W/ POT-3
			break;
		
				//EEPROM BUTTON
		case 0x7B:
			OSSignalBinSem(REEPROM);	//SIGNAL task_reeprom()
			break;
		
		default:
			break;
		}
		

				//ZONE BUTTONS

		switch(ButtonPress(0b00000111))
		{
		case 0xE7:
			zone_dis = &temp1;		//ZONE 1 BUTTON
			break;
	
		case 0xD7:
			zone_dis = &temp2;		//ZONE 2 BUTTON
			break;

		case 0xB7:
			zone_dis = &temp3;		//ZONE 3 BUTTON
			break;
	
		case 0x77:
			zone_dis = &temp4;		//ZONE 4 BUTTON
			break;
		default:
			break;
		}
		OSSignalBinSem(DISPLAY);
		OS_Delay(10,task_keypad3);		//DELAYED FOR 20mS
	}
}


void	 Task_Display(void)
{		
		unsigned char v1,v2,v3;
		unsigned char dis_temp;
	
	for(;;)
	{	
		OS_WaitBinSem(DISPLAY, task_display1);

		dis_temp = *zone_dis;
		v1 = dis_temp/0x64;			//FIND FIRST DISPLAY DIGIT
		v2 = (dis_temp-(v1*0x64))/10;		//FIND SECOND DIGIT
		v3 = (dis_temp-(v1*0x64)-(v2*10));	//FIND THIRD DIGIT 
		WriteSevenSegment(0, 1);		//SEND SEGMENT VALUE AND DIGIT 1
		Delay(100);				//DIGIT-ON DELAY
		WriteSevenSegment(v1, 2);		
		Delay(100);			
		WriteSevenSegment(v2, 3);		
		Delay(100);				
		WriteSevenSegment(v3, 4);		
		Delay(100);				
		PORTB = 0xFF;				//TURN OFF LAST DIGIT
		
		OSSignalBinSem(DISPLAY);
		OS_Delay(1, task_display2);		//DELAYED FOR 2mS
		
	}
}


void  Task_Usart(void)
{		
		unsigned char v1,v2,v3,v2A,v3A,v2B,v3B,v2C,v3C,v2D,v3D;
	for(;;)
	{
		ReadUSART();
		if(ReadUSART() == 0x7A)			//ASCII CHARACTER z
		{
		v1 = temp1 / 0x64;			//CONVERT TEMP1 FOR DISPLAY
		v2 = (temp1 - (v1*0x64))/10;
		v3 = (temp1 - (v1*0x64) - (v2*10));
		v2A = v2, v3A = v3;

		v1 = temp2 / 0x64;			//	  TEMP2 
		v2 = (temp2 - (v1*0x64))/10;
		v3 = (temp2 - (v1*0x64) - (v2*10));
		v2B = v2, v3B = v3;

		v1 = temp3 / 0x64;			//	  TEMP3 
		v2 = (temp3 - (v1*0x64))/10;
		v3 = (temp3 - (v1*0x64) - (v2*10));
		v2C = v2, v3C = v3;

		v1 = temp4 / 0x64;			//	  TEMP4 
		v2 = (temp4 - (v1*0x64))/10;
		v3 = (temp4 - (v1*0x64) - (v2*10));
		v2D = v2, v3D = v3;

			Z1[15] = v2A + '0';
			Z1[16] = v3A + '0';
			Z1[21] = v2B + '0';
			Z1[22] = v3B + '0';
			Z1[27] = v2C + '0';
			Z1[28] = v3C + '0';
			Z1[33] = v2D + '0';
			Z1[34] = v3D + '0';
			WriteUSARTBuffer(Z1,39);	//WRITE STRING Z1 FOR 39 BYTES
		}
	
	OS_Delay(400, task_usart1);			//DELAYED FOR 800mS
	}
}


void Task_Weeprom(void)					//WAITING TASK
{
		OStypeMsgP	alarm_zoneP;
		char word;
		
	for(;;)
	{			
		OS_WaitMsg(WEEPROM, &alarm_zoneP, task_weeprom1);
		word = *(const unsigned char*) alarm_zoneP;

		SEN = 1;			//START ENABLED
		while(SEN);			//WAIT UNTIL START IS OVER
		SSPBUF = 0b10100000;		//CONTROL BYTE			
		Idle();				//ENSURE MODULE IS IDLE
		if(!ACKSTAT);			//LOOK FOR ACK
		else
			break;

		SSPBUF = data_address;		//ADDRESS BYTE
		Idle();				//ENSURE MODULE IS IDLE
		if(!ACKSTAT);			//LOOK FOR ACK
		else
			break;

		SSPBUF = word;			//DATA BYTE (ZONES: 1,2,3 or 4)
		Idle();				//ENSURE MODULE IS IDLE
		if(!ACKSTAT)			//LOOK FOR ACK
		{ 	PEN = 1;		//STOP ENABLED
			while(PEN);		//WAIT UNTIL STOP IS OVER
		}
		else
			break;
	}
}


void Task_Reeprom(void)
{		
		char word;	
	for(;;)					//WAITING TASK
	{
		OS_WaitBinSem(REEPROM,task_reeprom1);
		
		Idle();				//ENSURE MODULE IS IDLE
		SEN = 1;			//START ENABLED
		while(SEN);			//WAIT UNTIL START IS OVER

		SSPBUF = 0b10100000;		//CONTROL BYTE (write)
		Idle();				//ENSURE MODULE IS IDLE
		if(!ACKSTAT);			//LOOK FOR ACK
		else
			break;

		SSPBUF = data_address;		//ADDRESS BYTE (write)
		Idle();				//ENSURE MODULE IS IDLE
		if(!ACKSTAT);			//LOOK FOR ACK
		else
			break;
		RSEN = 1;			//REPEAT START CONDITION
		while(RSEN);			//WAIT UNTIL RESTART IS OVER

		SSPBUF = 0b10100001;		//CONTROL BYTE (read)
		Idle();				//ENSURE MODULE IS IDLE
		if(!ACKSTAT);			//LOOK FOR ACK
		else
			break;

		RCEN = 1;			//ENABLE RECEIVE
		while(RCEN);			//WAIT UNTIL RECEIVE IS OVER

		ACKDT = 1;			//NO ACK
		ACKEN = 1;			
		while(ACKEN);			//WAIT UNTIL ACK IS FINISHED

		PEN = 1;			//STOP ENABLED
		while(PEN);			//WAIT UNTIL STOP IS OVER

		word = SSPBUF;			//WRITE DATA TO VARIABLE
		++data_address;			//MOVE ADDRESS TO NEXT SPACE

		OS_WaitBinSem(DISPLAY, task_reeprom2);	
		WriteSevenSegment(word, 3);	//DISPLAY ZONE OF LAST ALARM
		OS_Delay(200, task_reeprom3);
		OSSignalBinSem(DISPLAY);
	}
}


void Task_Pots(void)				//WAITING TASK
{
		OStypeMsgP pot_valP;
		char pot_val;
	for(;;)
	{	
		OS_WaitMsg(POTVAL, &pot_valP, task_pots1);
		pot_val = *(char*) pot_valP;
		OS_WaitBinSem(DISPLAY, task_pots2);

		switch(pot_val)
			{
		case 1:
			CHS2=0, CHS1=0, CHS0=0;		//AN0 - PIEZO "TONE" (PWM PERIOD)			
			PotDisplay();
			PR2 = ADRESH;
			break;			
		case 2:
			CHS2=0, CHS1=0, CHS0=1;		//DISPLAY A/D VALUE							
			PotDisplay();
			break;	
		case 3:
			CHS2=0, CHS1=1, CHS0=0;		//DISPLAY A/D VALUE				
			PotDisplay();
			break;	
		case 4:
			CHS2=0, CHS1=1, CHS0=1;		//AN3 - FOR PIZO DUTY CYCLE				
			PotDisplay();
			CCPR1L = ADRESH;
			break;
			}
		OSSignalBinSem(DISPLAY);
	}	
}


//*****************************(  MAIN  )****************************************
//*******************************************************************************

void	main(void)
{
	TXSTA = 0b10100100;			//TRANSMIT 
	RCSTA = 0b10010000;			//RECEIVE 
	SPBRG = 0x81;				//BAUD RATE
	TRISC6 = 0,TRISC7 = 1;			//TXD OUTPUT & RXD INPUT
	
	TRISC3 = 1,TRISC4 = 1;			//SCL & SDA - I2C
	SSPADD = 0x32;				//I2C BAUD RATE (MASTER MODE)
	SSPCON = 0b00101000;			//ENABLE SDA & SCL,S-PORT MODE-MASTER

	ADCON0 = 0b01000001;			//A/D CONFIG
	
	OPTION = 0b10000101;			//TIMER0 CONFIG

	T1CON = 0b00010101;			//TIMER1 CONFIG (system tick rate)	
	TMR1IE = 1;				//ENABLE INTERRUPT
	TMR1IF = 0;				//CLEAR FLAG

	TRISC2 = 0;				//PIEZO
	CCPR1L = 0x80,CCP1X=0,CCP1Y=0;		//PWM DUTY CYCLE
	T2CON = 0b00000101;			//TIMER2 PRESCALE = 4 (PWM)		

	GIE = 1, PEIE = 1;			//ENABLE GLOBAL & PERIPHERAL INTERRUPTS

	TRISD = 0x00;				//PORTD OUTPUT-DIGITS
	low=20,	high=170;			//INITIAL TEMPERATURE RANGE
	data_address = 0x00;			//FIRST EEPROM WRITE

	OSInit();  
					//ID	PRIORITY
	OSCreateTask(Task_Convert,	  0,	1);
	OSCreateTask(Task_Alarm_On,	  1,	1);	
	OSCreateTask(Task_Keypad,	  2,	3);
	OSCreateTask(Task_Display,	  3,	2);
	OSCreateTask(Task_Usart,	  4,	4);
	OSCreateTask(Task_Weeprom,	  5,	5);	
	OSCreateTask(Task_Reeprom,	  6,	6);	
	OSCreateTask(Task_Pots,		  7,	7);	

	OSCreateMsg	(ALARM,  (OStypeMsgP) 0);
	OSCreateMsg	(WEEPROM,(OStypeMsgP) 0);
	OSCreateBinSem	(REEPROM,             0);
	OSCreateMsg	(POTVAL, (OStypeMsgP) 0);
	OSCreateBinSem	(DISPLAY,             1);

	for(;;)
		OSSched();
}



⌨️ 快捷键说明

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