📄 cxy.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 + -