📄 fan.c
字号:
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
#define OUTBS0OFF PORTD|=0x04 //PD2
#define OUTBS0ON PORTD&=~0x04
#define OUTBS1OFF PORTD|=0x08 //PD3
#define OUTBS1ON PORTD&=~0x08
#define OUTBS2OFF PORTD|=0x10 //PD4
#define OUTBS2ON PORTD&=~0x10
#define OUTBS3OFF PORTB|=0x20 //PB5
#define OUTBS3ON PORTB&=~0x20
#define OUTQN1ON PORTD|=0x40 //PD6 OUT
#define OUTQN1OFF PORTD&=~0x40
#define OUTQN1Pulse PORTD^=0x40
#define OUTQN2OFF PORTD|=0x80 //For LED
#define OUTQN2ON PORTD&=~0x80
#define OUTQN2Pulse PORTD^=0x80
////KB///////////////
#define KeyMenu (PINB&0x10)
#define KeyAdd (PINB&0x08)
#define KeyDcc (PINB&0x04)
unsigned char StatusVB[4]={115,109,119,124};
unsigned char BS3V=124;//b 第四位的值
unsigned char DispVB[16]={63,6,91,79,102,109,125,7,127,111,119,124,88,94,121,56};
unsigned char LEDbitV[4];
unsigned int LEDint=0;
unsigned int LEDdot=0;
unsigned char LEDrfTime=15;
unsigned char T0_1msFlag=0;
//EEPROM
unsigned char SetupADDbase=1;
unsigned char ParaTnum=3;
unsigned int MenuSet[3];
unsigned int MenuSetTemp[3];
unsigned int MenuSetMax[3]={1000,1000,1000};
unsigned int MenuSetMin[3]={0,0,0};
unsigned int MenuSetDefault[3]={100,100,100};
unsigned int ActiveV;
void watchdog_init(void)
{
WDR();
WDTCR=0x0F ;
}
void Delay_1ms(void)
{
unsigned int i;
for (i = 1; i<1140; i++)
;
}
void delayXms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{
Delay_1ms();
i++;
}
}
void port_init(void)
{
PORTB=0xFF;
DDRB=0xE2;
DDRC=0xFF;
PORTC=0xFF;
PORTD=0xFF;
DDRD=0xDF;
OUTQN1OFF;
OUTBS0OFF;
OUTBS1OFF;
OUTBS2OFF;
OUTBS3OFF;
//delayXms(2000); //delay 1s
}
///////////////Timer init
void timer_init(void)
{
TCCR0=0x00; //stop T2
TCNT0=131; //clk=8Mhz/64 tccr0=3 t=1ms
TIMSK|=(1<<TOIE0); //enable T0 INT
TCCR0=0x03;
TCCR1A=0;
TCCR1B=0;
TCNT1=0;
}
unsigned int T1CKCR=0;
// Timer0 INT servo program
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0=131; ////clk=8Mhz tccr0=3 t=1ms
T1CKCR++;
if(T1CKCR>2000)
{
MenuSet[0]=TCNT1;
TCNT1=0;
T1CKCR=0;
}//if(T1CKCR>2000)
T0_1msFlag=1;
//Q0MOTOR3Pulse;
}//void timer0_ovf_isr(void)
void LEDsegOUT(unsigned char DPBB)
{
PORTC=((PORTC&0xC0) | (DPBB & 0x3F));
PORTD=((PORTD&0xFC) | ((DPBB>>6) & 0x03));
}
void LEDdisp(void)
{
unsigned char LightTime;
LightTime=1;
OUTBS0ON;
LEDsegOUT(LEDbitV[0]);
delayXms(LightTime);
OUTBS0OFF;
OUTBS1ON;
LEDsegOUT(LEDbitV[1]);
delayXms(LightTime);
OUTBS1OFF;
OUTBS2ON;
LEDsegOUT(LEDbitV[2]);
delayXms(LightTime);
OUTBS2OFF;
OUTBS3ON;
LEDsegOUT(LEDbitV[3]);
delayXms(LightTime);
OUTBS3OFF;
}//void LEDdisp(void)
void LEDputSign(unsigned int LINT,unsigned int LDOT)
{
unsigned char dpb=0;
unsigned char sp[6],i,j;
unsigned char spdp[6];
unsigned int x;
if(LEDint<1000)
{
x=1000;
for(i=0;i<4;i++)
{
sp[i]=LINT/x;
spdp[i]=LDOT/x;
LINT=LINT%x;
LDOT=LDOT%x;
x=x/10;
} //for
LEDbitV[3]=BS3V;
dpb=4;
for(i=1;i<4;i++) //取得小数点位
{
if(sp[i]>0)
{
dpb=i;
break;
}//if(sp[i]>0)
}//for(i=1;i<4;i++)
//dpb--;
j=3;
for(i=dpb;i<4;i++) //写整数位
{
j--;
LEDbitV[j]=DispVB[sp[i]];
}//for(i=dpb;i<4;i++)
LEDbitV[j]=LEDbitV[j]+128;
for(i=0;i<j;i++) //写小数位
{
LEDbitV[i]=DispVB[spdp[j-i]];
}//for
}//if(di<1000)
else
{
for(i=0;i<3;i++)
LEDbitV[i]=56;
}//else
}//LCDputUint(void)
//;*****************************************************************
//////////////read a int from EEPROM///
unsigned int ReadEEPint(unsigned int uAddr)
{
unsigned char edh,edl;
unsigned int eev;
while(EECR&(1<<EEWE));
EEAR=uAddr;
EECR|=(1<<EERE);
edh=EEDR;
EEAR=uAddr+1;
EECR|=(1<<EERE);
edl=EEDR;
eev=edh;
eev=(eev<<8)+edl;
return eev;
}
void WriteEEPint(unsigned int uAddr,unsigned int eev)
{
unsigned char edh,edl;
//unsigned int eev;
edh=(eev>>8);
edl=eev;
while(EECR&(1<<EEWE));
EEAR=uAddr;
EEDR=edh;
CLI();
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
SEI();
while(EECR&(1<<EEWE));
EEAR=uAddr+1;
EEDR=edl;
CLI();
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
SEI();
}
void LoadPG(void)
{
unsigned char i;
for(i=0;i<ParaTnum;i++)
{
MenuSet[i]=ReadEEPint(SetupADDbase+i*2);
if((MenuSet[i]>MenuSetMax[i]) || (MenuSet[i]<MenuSetMin[i]))
MenuSet[i]=MenuSetDefault[i];
MenuSetTemp[i]=MenuSet[i];
}
}
void SavePG(unsigned char MP)
{
if(MenuSetTemp[MP] != MenuSet[MP])
{
WriteEEPint((SetupADDbase+MP*2),MenuSet[MP]);
MenuSetTemp[MP]=MenuSet[MP];
}
}// void SavePG(void)
unsigned char MenuStep=10;
unsigned char MenuPos=0;
unsigned char KeyAddCR=0;
unsigned char KeyDccCR=0;
unsigned char KeyAddFastCR=0;
unsigned char KeyDccFastCR=0;
unsigned char KeySpeed=100;
void MenuAction(void)
{
switch(MenuStep)
{
case 10:
if(KeyMenu==0)
{
MenuPos++;
if(MenuPos>2)
MenuPos=0;
BS3V=StatusVB[MenuPos];
LEDputSign(MenuSet[MenuPos],0);
MenuSetTemp[MenuPos]=MenuSet[MenuPos];
MenuStep=20;
KeyAddCR=0;
KeyAddCR=0;
KeyAddFastCR=0;
KeyDccFastCR=0;
}//if(KeyMenu==0)
break;
case 20:
if(KeyMenu>0)
MenuStep=30;
break;
case 30:
if(MenuPos>0)
{
if(KeyAdd==0) //++
{
KeyAddCR++;
if(KeyAddCR>KeySpeed)
{
if(MenuSet[MenuPos]<MenuSetMax[MenuPos])
MenuSet[MenuPos]++;
LEDputSign(MenuSet[MenuPos],0);
KeyAddFastCR++;
if(KeyAddFastCR>10)
KeySpeed=20;
KeyAddCR=0;
}//if(KeyAddCR>50)
}//if(KeyAdd==0)
else
{
KeyAddCR=0;
KeyAddFastCR=0;
KeySpeed=100;
SavePG(MenuPos);
}//else if(KeyAdd==0)
if(KeyDcc==0) //-
{//OUTQN2Pulse;
KeyDccCR++;
if(KeyDccCR>KeySpeed)
{
if(MenuSet[MenuPos]>MenuSetMin[MenuPos])
MenuSet[MenuPos]--;
LEDputSign(MenuSet[MenuPos],0);
KeyDccFastCR++;
if(KeyDccFastCR>10)
KeySpeed=20;
KeyDccCR=0;
}//if(KeyDccCR>50)
}//if(KeyDcc==0)
else
{
KeyDccCR=0;
KeyDccFastCR=0;
KeySpeed=100;
SavePG(MenuPos);
}//else if(KeyDcc==0)
}// if(MenuPos>0)
if(KeyMenu==0)
MenuStep=10;
break;
case 40:
if(KeyMenu>0)
MenuStep=10;
break;
}//switch(MenuStep)
}//void MenuAction(void)
unsigned char LEDCR=0;
void main()
{
unsigned char i=0;
port_init();
LoadPG();
timer_init();
SEI();
TCCR1B=0x06; //start T1 Ext CLK
//LEDint=9;
//LEDdot=260;
//LEDputSign();
LEDrfTime=15;
//LEDint=999;
//LEDdot=0;
//MenuSet[1]=111;
//MenuSet[2]=222;
BS3V=StatusVB[0];
MenuSet[0]=0;
LEDputSign(MenuSet[0],0);
while(1)
{
if(T0_1msFlag)
{
MenuAction();
if(MenuSet[0]<MenuSet[1])
OUTQN1ON;
else
OUTQN1OFF;
////LED display
LEDCR++;
if(LEDCR>LEDrfTime)
{
LEDputSign(MenuSet[MenuPos],0);
LEDdisp();
LEDCR=0;
}//if(LEDCR>LEDrfTime)
T0_1msFlag=0;
}//if(T0_1msFlag)
//LEDbitV[3]=124;//b
//delayXms(LEDrfTime);
}//while
}//MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -