150G红外对管计数器

#include	"extern.h"
#include    "counter.h"
#include   	"timer.c"
#include 	"smg.c"
#include  	"sleep.c"
#include  	"gpio.c"


void	FPPA0 (void)
{
	.ADJUST_IC	SYSCLK=IHRC/4, Init_RAM, VDD=3.3V;


	gpio_init();
	systick_init();


	ENGINT;

	show_state = 0;
	total_num = 0;
	unit_num = 0;
	decade_num = 0;
	time_cnt = 0;
	ir_flag = 0;
	ir_time = 400;
	sleep_flag = 1;
//	led_cycle = 0;

	while (1)
	{
		while (systick_update == 0){}; 
			systick_update = 0;

//	sleep_task();

				key_time_cnt++;
			if(key_time_cnt > 15){
				key_time_cnt   = 0 ;
				if(IO_KEY == 0){
						key_cnt++;
					if(key_cnt == 16){
						
						if(sleep_flag == 0){
							sleep_flag = 1;
						}else{
							sleep_flag = 0;
						}
						
					//	
					}else if(key_cnt > 16){
						key_cnt = 128;
					}
					key_state = 1;
				
				}else {

					if(key_cnt>0 && key_cnt < 8){
						if(key_state == 1){
							total_num = 0;
						}
					}
				
					key_state = 0;
					key_cnt	= 0;
					}
			}

			//IR_TX
		if(sleep_flag == 0){

				time_cnt++;
				if(time_cnt == 9){
					tx1_on();
					tx2_on();
				}else if(time_cnt == 10){
					tx1_off();
					tx2_off();
				}else if(time_cnt >= 11){
					time_cnt = 0;
				}
		
/*			if(time_cnt == 0){
				tx1_on();
				tx2_on();
				time_cnt = 1;
			}else{
				tx1_off();
				tx2_off();
				time_cnt = 0;
			}*/
			
		if(ir_time > 0){
			ir_time--;
		}
		
			//IR_RX
	
			

			if(show_state == 0){

				show_state = 1;
			}else{

				show_state = 0;
			}


			

			
			



			if(total_num > 99){

				total_num = 99;
			}

			num_show();

			led_task();
		}else{
	/*		tx1_off();
			tx2_off();
			IO_A = 0;
			IO_B = 0;
			IO_C = 0;
			IO_D = 0;
			IO_E = 0;
			IO_F = 0;
			IO_G = 0;
			IO_DP = 0;
			IO_DIG1 = 0;
			IO_DIG2 = 0;
			IO_LED = 0;*/
			sleep_task();
		}	
			


		
			
	}
}


void	Interrupt (void)
{
	pushaf;

	if (Intrq.T16)
	{	
		 stt16 reload_T16;
		 systick_cnt++;
		 if(systick_cnt >= 50){
 			systick_update = 1;
			systick_cnt=0;		
		 }
	
		
       		if(IR_RX ){

			ir_cnt++;
			if(ir_cnt >= 600 ){
				recv_flag = 1;
			}

			if(recv_flag){
				recv_flag = 0;
				if(ir_time  < 380){
					total_num++;
					led_flag = 1;
		
				}
				ir_time = 400;
			}
								

		}else{
			ir_cnt = 0;
		}


        Intrq.T16	=	0;
	}


	popaf;
}

c.h

#ifndef __COUNTER_H
#define __COUNTER_H



typedef byte   				uint8_t;
typedef word   				uint16_t;
typedef dword   			uint32_t;


uint8_t 	fun_in8_1;
uint8_t 	fun_out8_1;
uint16_t 	fun_in16_1;
uint16_t 	fun_out16_1;
uint16_t	 reload_T16;
uint8_t   systick_update;
uint8_t  systick_cnt;
uint8_t  time_cnt;
uint8_t  total_num;
uint8_t  unit_num;
uint8_t	 decade_num;
uint8_t  show_state;
uint8_t   ir_flag;
uint16_t  ir_cnt;
uint16_t  ir_time;
uint8_t  led_cnt;
uint8_t  led_on_1s;
uint8_t sleep_flag;
uint8_t key_cnt;
uint8_t key_state;
uint8_t led_flag;
uint8_t key_time_cnt;
uint8_t  led_flash;
uint8_t recv_flag;
uint16_t led_5_cnt;
uint8_t CLKMD_BK;
uint8_t wakeup_cnt;
uint8_t wakeup_flag;
void gpio_init(void);


#define	IO_A	PA.0
#define	IO_B	PC.0
#define	IO_C	PA.7
#define	IO_D	PB.7
#define	IO_E	PC.2
#define	IO_F	PB.1
#define	IO_G	PB.6
#define	IO_DP	PC.3
#define	IO_DIG1		PC.1
#define	IO_DIG2		PB.0

#define IO_LED 	PB.3

//#define	IR_TX1		PA.4
#define TR_XT2 		 PB.4

#define IR_RX		PA.4
#define IO_KEY      PB.2

#define	tx1_on()	{TM2CT = 0;TM2B = 51;$ TM2C SYSCLK,PB4,Period;	$ TM2S 8BIT,/1,/1;}
#define tx1_off()	{$ TM2C STOP;}


#define  tx2_on() 	//{$ LPWMGCLK Enable,/1,IHRC; LPWMGCUBL = 0b00_000000; LPWMGCUBH = 0b0110_1001; $ LPWMG1C LPWMG1,PA4;	LPWMG1DTL = 0b001_00000;	LPWMG1DTH = 0b0011_0101;}
#define tx2_off()	//{$ LPWMG1C ;}

#define display_0()		{IO_A= 1;	IO_B = 1;	IO_C = 1;	IO_D = 1;	IO_E = 1;	IO_F = 1;	IO_G = 0;	IO_DP = 0;}
#define display_1()		{IO_A= 0;	IO_B = 1;	IO_C = 1;	IO_D = 0;	IO_E = 0;	IO_F = 0;	IO_G = 0;	IO_DP = 0;}
#define display_2()		{IO_A= 1;	IO_B = 1;	IO_C = 0;	IO_D = 1;	IO_E = 1;	IO_F = 0;	IO_G = 1;	IO_DP = 0;}
#define display_3()		{IO_A= 1;	IO_B = 1;	IO_C = 1;	IO_D = 1;	IO_E = 0;	IO_F = 0;	IO_G = 1;	IO_DP = 0;}
#define display_4()		{IO_A= 0;	IO_B = 1;	IO_C = 1;	IO_D = 0;	IO_E = 0;	IO_F = 1;	IO_G = 1;	IO_DP = 0;}
#define display_5()		{IO_A= 1;	IO_B = 0;	IO_C = 1;	IO_D = 1;	IO_E = 0;	IO_F = 1;	IO_G = 1;	IO_DP = 0;}
#define display_6()		{IO_A= 1;	IO_B = 0;	IO_C = 1;	IO_D = 1;	IO_E = 1;	IO_F = 1;	IO_G = 1;	IO_DP = 0;}
#define display_7()		{IO_A= 1;	IO_B = 1;	IO_C = 1;	IO_D = 0;	IO_E = 0;	IO_F = 0;	IO_G = 0;	IO_DP = 0;}
#define display_8()		{IO_A= 1;	IO_B = 1;	IO_C = 1;	IO_D = 1;	IO_E = 1;	IO_F = 1;	IO_G = 1;	IO_DP = 0;}
#define display_9()		{IO_A= 1;	IO_B = 1;	IO_C = 1;	IO_D = 1;	IO_E = 0;	IO_F = 1;	IO_G = 1;	IO_DP = 0;}

#endif

timer

#include    "counter.h"


void systick_init(void){

	//SYSTICK_INIT
	$ T16M SYSCLK,/16,bit11;																	
	reload_T16 = 2048 - 25; //100us					
	stt16 reload_T16;			
	$ INTEGS BIT_R;								
	INTEN.T16 = 1;				
	INTRQ.T16 = 0;	
}

void delay_ms(void)
{
	uint8_t count_time;
	
	do
	{
		count_time = 0;
		while(count_time < 20)////80
		{
			.delay 200
			count_time++;
		}
		fun_in8_1--;
	}while(fun_in8_1);
}

//=========================
void delay_800us(void)
{	
    .delay 3400
}
void delay_100us(void)
{	
    .delay 400
}
void delay_20us(void)
{	
    .delay 80
}
void wdt_init(void)
{
	.wdreset;
	CLKMD.En_ILRC = 1;//打开低频
	clkmd.En_WatchDog	=	1;		//	WatchDog Enable
	$ MISC WDT_64K;//看门狗时钟超时时间设定
}


#include    "counter.h"




void num_swich(void)
{
	switch(fun_in8_1){
		 case 0:
			display_0();
			break;
		 case 1:
			display_1();
			break;
		 case 2:
			display_2();
			break;
		 case 3:
			display_3();
			break;
		 case 4:
			display_4();
			break;
		 case 5:
			display_5();
			break;
		 case 6:
			display_6();
			break;
		 case 7:
			display_7();
			break;
		 case 8:
			display_8();
			break;
		 case 9:
			display_9();
			break;		
	}
	
}


void num_show(void){
	uint8_t num_total;
    num_total = total_num;

    if (num_total >= 100) 
    {
        num_total = 99;
    }
    fun_in8_1 = 0;
    while(num_total >= 10)
    {
	num_total = num_total - 10;
	fun_in8_1++;
    }

	decade_num = fun_in8_1;	
    unit_num  = num_total;

	if(show_state){
		fun_in8_1 =  decade_num;
		IO_DIG1 =0;
		IO_DIG2 =1;
		num_swich();			
	}else{
		fun_in8_1 =unit_num;
		IO_DIG1 =1;
		IO_DIG2 =0;
		num_swich();
	}
}

void led_task(void){

	if(led_flag == 1){
	
		led_on_1s++;
		if(led_on_1s > 200){
			led_flash = 1;
			led_on_1s = 0;
		}		
		if(led_flash){
			led_cnt++;
			led_5_cnt++;
			if(led_5_cnt >= 500){
				led_flash = 0;
				led_flag=0;
				led_5_cnt = 0;
				led_on_1s = 0;
			}
			if(led_cnt <= 50){
			  	IO_LED = 1;
				
			}else if(led_cnt <= 100){
				IO_LED = 0;	
			}else{
				led_cnt = 0;
			}			
		}else{
			IO_LED = 1;
		}

	}else{
		IO_LED = 0;
	}
	
			
}

#include "counter.h"


void sleep_task(void){

	

/*			$ CLKMD ILRC/1,En_IHRC,En_ILRC;	//系统时钟选择,是否启用IHRC,是否启用ILRC,(En_IHRC和En_ILRC不写为停用,写为启用)
			CLKMD.En_IHRC = 0;
			T16M =0;
			PAC = 0b0000_0000;
			PBC = 0b0000_0000;
			PCC = 0b0000_0000;
			PADIER = 0b0000_0000;
			PBDIER = 0b0000_0100;
			PCDIER = 0b0000_0000;
			PBPH = 0b0000_0100;
			
			while(1){
			stopexe;
			if(IO_KEY == 0){
					fun_in8_1 = 20;
					delay_ms();
					if(IO_KEY == 0){
						break;
					}				
				}
			}


			$ CLKMD	SYSCLK=IHRC/4;		//	SYSCLK=IHRC/4
			CLKMD.En_IHRC = 1;
			nop;

			systick_init();
	
			gpio_init();	


		

			show_state = 0;
			total_num = 0;
			unit_num = 0;
			decade_num = 0;
			time_cnt = 0;
			ir_flag = 0;
			ir_time = 400;
			sleep_flag = 0;
			key_state = 0;*/

			CLKMD_BK = CLKMD;
			PBDIER = 0b0000_0100;
				PAC = 0b0000_0000;
			PBC = 0b0000_0000;
			PCC = 0b0000_0000;
			$ CLKMD ILRC/1,En_IHRC,En_ILRC;
			CLKMD.En_IHRC = 0;
			nop;
			while(1){
				stopsys;
				if(IO_KEY == 0){
					fun_in8_1 = 30;
					delay_ms();
					if(IO_KEY == 0){
						break;
					}
				}
			}
			$ CLKMD ILRC/1,EN_IHRC,EN_ILRC;	
			nop;
			CLKMD = CLKMD_BK;

			systick_init();
			gpio_init();
			show_state = 0;
			total_num = 0;
			unit_num = 0;
			decade_num = 0;
			time_cnt = 0;
			ir_flag = 0;
			ir_time = 400;
			sleep_flag = 0;
			key_state = 0;
}

#include    "counter.h"


void gpio_init(void){
		//IO_INIT
	PA = 0b1100_0001;
	PAC = 0b1110_1001;//0 输入  1输出
	PAPH = 0b0000_0000;////2F
	
	PB = 0b0000_0000;
	PBC = 0b1111_1011;
	PBPH = 0b0000_0100;
	
	PC = 0b0000_0000;
	PCC = 0b0000_1111;
	PCPH = 0b1111_0000;////f0
	
}



你可能感兴趣的:(应广单片机,单片机,嵌入式硬件)