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

📄 cxy.c

📁 油煙機程序內含目前市面上所有油煙機之主要功能有興趣就好好研究吧
💻 C
字号:
#include<pic16f716.h>
#define uchar unsigned char 
#define uint unsigned int
#define FAN_HI RB0
#define FAN_MI RB1
#define FAN_LO RB2
#define BUZZ   RB3
#define LAMP   RB4
#define DSP_EN RB5
#define KINA   RA0
#define KINB   RA1
#define COMA   RA2
#define COMB   RA3
#define COMC   RA4
#define K_MASK 0B00000011
#define T_CYCLONE  5
#define T_DELAY    3
#define B_TIMES    3//延时到蜂鸣器响的次数
uchar LED_UBFF[8];//第一个为有效数据数,后面为LED扫描码
uchar S_DATA,M_DATA;//定义秒、分、和毫秒数据
uint  T_DATA,T_BUZZ,TB_SPACE;
uchar T_KEY,T_DIS;//10MS和75hz的显示扫描
uchar S_SPEED,LED_DATA,KEY_DATA,BUZZE_T;//风速、LED、键值
volatile bit DIS_OFF,DK_FLAG;
bit  DEL_FLAG,KEY_FLAG,DIS_FLAG,S_FLAG,B_FLAG,T_FLAG;//延时、按键、显示、飓风标志
void DataToBuff();
//*********************************************************************
//函数名:T0_Int()
//输入:无
//输出:无
//功能描述:定时器T0中断函数
//**********************************************************************
void interrupt T0_Int()
{
	if(T0IF)//中断一次延时为1MS
	{		
		T0IF=0;
		TMR0=131;
	    OPTION=0x04;
		T_DATA++;
		if(T_KEY>=8)KEY_FLAG=1;
		else T_KEY++;
		if(T_DIS>=2)DIS_FLAG=1;
		else T_DIS++;
		if(T_BUZZ>1)T_BUZZ--;
		else 
		{
				TMR2ON=0;
				B_FLAG=0;
		}
		if(T_DATA>=1000)
		{
			T_DATA=0;
			S_DATA++;            
		    if(S_DATA>=60)
		    {
		 		S_DATA=0;
				if(M_DATA>0)M_DATA--;
				else 
				{
					DEL_FLAG=1;
				    S_FLAG=1;
				}
			}				
		}
	}
}
//*********************************************************************
//函数名:T0_Init()
//输入:无
//输出:无
//功能描述:定时器T0及IO口初始化
//**********************************************************************
void T0_Init()
{
	TMR0=131;
	OPTION=0x04;
	INTCON=0Xe0;
}
//*********************************************************************
//函数名:PWM_Init()
//输入:无
//输出:无
//功能描述:定时器T2及PWM初始化
//**********************************************************************
void PWM_Init()
{
	PR2=0X7C;
	CCPR1L=0X3E;
	CCP1CON=0X2F;
	TRISB3=0;
	T2CON=0X01;
	TMR2ON=1;
	RB3=0;

}
//*********************************************************************
//函数名:I0_Init()
//输入:无
//输出:无
//功能描述:定时器T0及IO口初始化
//**********************************************************************
void IO_Init()
{
	TRISA=0X03;
	PORTA=0X00;
	TRISB=0X00;
	PORTB=0X00;
}
//*********************************************************************
//函数名:Data_Init()
//输入:无
//输出:无
//功能描述:定时器T0及IO口初始化
//**********************************************************************
void Data_Init()
{
	uchar i;
    for(i=0;i<8;i++)LED_UBFF[i]=0;
	S_DATA=0;M_DATA=0;T_DATA=0;T_BUZZ=0;T_KEY=0;
	T_DIS=0;S_SPEED=2;LED_DATA=0;KEY_DATA=0;
	DEL_FLAG=0;KEY_FLAG=0;DIS_FLAG=0;S_FLAG=0;B_FLAG=0;DIS_OFF=0;
}
//*********************************************************************
//函数名:DataToBuff()
//输入:无
//输出:无
//功能描述:显示数据的处理
//**********************************************************************
void DataToBuff()
{
	DIS_FLAG=1;//打开显示标志
	DIS_OFF=1;
	switch (LED_DATA)
	{
		case 0:
			LED_UBFF[0]=6;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X04;
			LED_UBFF[3]=0X00;
			LED_UBFF[4]=0X0C;
			LED_UBFF[5]=0X10;
			LED_UBFF[6]=0X18;
			break;
		case 1:
			LED_UBFF[0]=2;
			LED_UBFF[1]=0X04;
			LED_UBFF[2]=0X00;
			break;
		case 2:
			LED_UBFF[0]=5;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X04;
			LED_UBFF[3]=0X0C;
			LED_UBFF[4]=0X10;
			LED_UBFF[5]=0X14;
			break;
		case 3:
			LED_UBFF[0]=5;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X04;
			LED_UBFF[3]=0X00;
			LED_UBFF[4]=0X0C;
			LED_UBFF[5]=0X14;
			break;
		case 4:
			LED_UBFF[0]=4;
			LED_UBFF[1]=0X04;
			LED_UBFF[2]=0X00;
			LED_UBFF[3]=0X18;
			LED_UBFF[4]=0X14;
			break;
		case 5:
			LED_UBFF[0]=5;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X00;
			LED_UBFF[3]=0X0C;
			LED_UBFF[4]=0X18;
			LED_UBFF[5]=0X14;
			break;
		case 6:
			LED_UBFF[0]=6;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X00;
			LED_UBFF[3]=0X0C;
			LED_UBFF[4]=0X10;
			LED_UBFF[5]=0X18;
			LED_UBFF[6]=0X14;
			break;
		case 7:
			LED_UBFF[0]=3;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X04;
			LED_UBFF[3]=0X00;
			break;
		case 8:
			LED_UBFF[0]=7;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X04;
			LED_UBFF[3]=0X00;
			LED_UBFF[4]=0X0C;
			LED_UBFF[5]=0X10;
			LED_UBFF[6]=0X18;
			LED_UBFF[7]=0X14;
			break;
		case 9:
			LED_UBFF[0]=6;
			LED_UBFF[1]=0X08;
			LED_UBFF[2]=0X04;
			LED_UBFF[3]=0X00;
			LED_UBFF[4]=0X0C;
			LED_UBFF[5]=0X18;
			LED_UBFF[6]=0X14;
			break;           
	}
}
//*********************************************************************
//函数名:Key_Read()
//输入:无
//输出:无
//功能描述:键值读取,键值存入KEY_DATA
//**********************************************************************
void  Key_Read()
{
	static uchar key_state=0,key_line,key_value;
	uchar i;
	switch (key_state)
	{
		case 0:
		key_line=0B00000100;
		for(i=0;i<=3;i++)
		{
			PORTA=~key_line;
			key_value=K_MASK&PORTA;
			if(	key_value==K_MASK)key_line<<=1;
			else 
			{
				key_state++;
				break;
			}
		}break;
		case 1:
		if(key_value==(K_MASK&PORTA))
		{
			TMR2ON=1;
			T_BUZZ=200;
			B_FLAG=1;
			switch(key_line|key_value)
			{
				case 0b00000110:
					KEY_DATA=1;
					key_state++;
					break;
				case 0b00000101:
					KEY_DATA=2;
					DIS_OFF=1;
					key_state++;
					break;
				case 0b00001010:
					KEY_DATA=3;
					key_state++;
					break;
				case 0b00001001:
					KEY_DATA=4;
					DIS_OFF=1;
					key_state++;
					break;
				case 0b00010010:
					KEY_DATA=5;
					DIS_OFF=1;
					key_state++;
					break;
				case 0b00010001:
					KEY_DATA=6;
					DIS_OFF=1;
					key_state++;
					break;
				default: key_state=0;
			}
			
		}
		else 
		{
			key_state=0;
			break;	
		}
		case 2:
			PORTA=0X03;
			if((K_MASK&PORTA)==K_MASK)key_state=0;
			break;
		default :key_state=0;
	}
}
//***************************************************************
//函数名:M_State()
//输入:无
//输出:无
//功能描述:功能主状态机
//************************************************************
void M_State()
{
	static uchar m_state=0;
	switch(m_state)
	{
		case 0:
			m_state=KEY_DATA;
			break;
		case 1:
			if(	S_SPEED==3)
					{
						FAN_LO=0;
						FAN_MI=0;
						FAN_HI^=1;
					}
					else if(S_SPEED==2)
					{
						FAN_LO=0;
						FAN_HI=0;
						FAN_MI^=1;
					}
					else 
					{
						FAN_HI=0;
						FAN_MI=0;
						FAN_LO^=1;
					}
			m_state=0;
			KEY_DATA=0;
			break;
		case 2:
			S_DATA=0;	
			M_DATA=T_DELAY;
			DEL_FLAG=0;
			FAN_HI=0;
			FAN_MI=0;
			FAN_LO=1;
			m_state=7;
			KEY_DATA=7;
			break;
		case 3:
			LAMP^=1;
			m_state=0;
			KEY_DATA=0;
			break;
		case 4:
			FAN_LO=0;
			FAN_MI=0;
			FAN_HI=1;
			S_DATA=0;
			S_SPEED=3;
			M_DATA=T_CYCLONE;
			S_FLAG=0;
			m_state=8;
			KEY_DATA=8;
			break;
		case 5:
       	 	FAN_HI=0;
			FAN_LO=0;
			FAN_MI=1;
			S_SPEED=2;
			LED_DATA=2;
			m_state=0;
			KEY_DATA=0;
			break;
		case 6:
			FAN_HI=0;
			FAN_MI=0;
			FAN_LO=1;
			S_SPEED=1;
			LED_DATA=1;
			m_state=0;
			KEY_DATA=0;
			break;
		case 7:
			if(DEL_FLAG)
			{
				FAN_HI=0;
				FAN_MI=0;
				FAN_LO=0;
			}
			LED_DATA=M_DATA;
			m_state=0;
			break;
		case 8:
			if(S_FLAG)
			{
				FAN_HI=0;
				FAN_LO=0;
				FAN_MI=0;
			}
			LED_DATA=M_DATA;
			m_state=0;
			break;
		default:
		 	m_state=0;
			KEY_DATA=0;
		}	
}
//************************************************
//函数名:M_State()
//输入:无
//输出:无
//功能描述:显示功能
//************************************************
void Disp()
{
	uchar i;
	DataToBuff();
	for(i=1;i<=LED_UBFF[0];i++)
	{
		PORTA=LED_UBFF[i];
	}
}
void main()
{
	 Data_Init();
	 IO_Init();
	 T0_Init();
	 PWM_Init();
	while(1)
	{
		if(KEY_FLAG)
		{
			KEY_FLAG=0;
			DSP_EN =1;
			Key_Read();
		}
		if(DIS_FLAG)
		{
		if(DIS_OFF)
		{
				DIS_FLAG=0;
				DSP_EN =0;
				Disp();
		}
		}
		M_State();
	}
}

⌨️ 快捷键说明

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