?? ws_js000.c
字號:
#include <htc.h>
#define fan RA0
#define led_up RC2
#define led_down RC1
#define work_led RC0
#define w_on 0
#define w_off 1
#define key_up (key_tmp&(1<<3))
#define key_stop (key_tmp&(1<<4))
#define key_down (key_tmp&(1<<5))
#define testbit(var, bit) ((var)&(1<<(bit)))
#define bitset(var,bitno) ((var)|=1<<(bitno))
#define bitclr(var,bitno) ((var)&=~(1<<(bitno))
unsigned char learn_cnt,l_cnt2,key_tmp,fan_reg;
unsigned int t0_cnt;
extern unsigned char qk_cnt,dk_cnt;
extern unsigned char CSR0,CSR1,CSR2;
extern void recieve(void);
void delay_1ms(unsigned char cnt)
{
unsigned char i;
do
{
i=249;
do
asm("nop");
while(--i!=0);
}
while(--cnt!=0);
}
void Erase_120(void)
{
unsigned char i;
for(i=0;i<120;i++)
EEPROM_WRITE(i,0xff);
EEPROM_WRITE(126,0);
delay_1ms(5);
}
//*****************************************************
// verify 40 SN if there is a same CF=1,else CF=0
//*****************************************************
bit Verify_120(void)
{
unsigned char i,addr,tmp;
addr=0;
i=40;
do
{
tmp=EEPROM_READ(addr++);
if(qk_cnt!=0) // recieve a qk signal
{
if((tmp&0x01)==0)
{addr+=2;continue;};// memory is dk
if(((tmp&0x80)==0)||((CSR0&0x80)==0))
{
if(((tmp^CSR0)&0xf0)!=0)
{addr=addr+2;continue;};
}
}
else //recieve a dk signal
{
if((tmp&0x01)==1)
{addr=addr+2;continue;};//memory is qk
if(((tmp^CSR0)&0xf0)!=0)
{addr=addr+2;continue;};
}
tmp=EEPROM_READ(addr++);
if((tmp^CSR1)!=0)
{addr+=1;continue;}
tmp=EEPROM_READ(addr++);
if((tmp^CSR2)!=0)
{addr=addr+0;continue;}
return(1);
}
while(--i!=0);
return(0);
}
bit delay_1s_stop(void)
{
TMR0=0;
learn_cnt=15;
while(1)
{
recieve();
if(CARRY==1)
{
Verify_120();
if((CARRY==1)&&((CSR0&0x0f)==0x04))
{
work_led=w_off;
led_up=0;
led_down=0;
return 1;
}
}
if(T0IF)
{
T0IF=0;
if(--learn_cnt==0)
return 0;
}
}
}
Write_a_sn(void)
{
unsigned char tmp;
tmp=EEPROM_READ(126);
if(tmp>120)
tmp=0;
EEPROM_WRITE(tmp++,CSR0);
EEPROM_WRITE(tmp++,CSR1);
EEPROM_WRITE(tmp++,CSR2);
EEPROM_WRITE(126, tmp);
delay_1ms(5);
}
void init(void)
{
TMR0=0;
T0CS=0;
PS0=1;PS1=1;PS2=1; //1/256
PSA=0; //TIMER 0
RAPU=1;
T1CON=5;
PORTA=0;
CM0=1;CM1=1;CM2=1; //SET CMP AS DIGITAL I/O
WPUA =0x33; //RA2 & RA3 NEED NOT PULL UP
TRISA=0x3d; //RA1 OUT
PORTC=0;
TRISC=0x38;
}
bit read_s_port(unsigned char cnt)
{
unsigned char i;
TRISA2=1;
while(1)
{
rrr:
i=cnt;
if(RA2)
{
do
{
if(RA2==0)
goto rrr;
}
while(--i!=0);
RA2=1;
TRISA2=0;
return 1;
}
else
{
do
{
if(RA2==1)
goto rrr;
}
while(--i!=0);
RA2=1;
TRISA2=0;
return 0;
}
}
}
void do_up(void)
{
t0_cnt=3662;
if(led_down==1)
{
led_down=0;
delay_1s_stop();
if(CARRY==0)
{
work_led=w_on;
led_up=1;
}
}
else
{
work_led=w_on;
led_up=1;
}
}
void do_down(void)
{
t0_cnt=3662;
if(led_up==1)
{
led_up=0;
delay_1s_stop();
if(CARRY==0)
{
work_led=w_on;
led_down=1;
}
}
else
{
work_led=w_on;
led_down=1;
}
}
void do_stop(void)
{
work_led=w_off;
led_up=0;
led_down=0;
}
/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
main()
{
volatile unsigned char j;
OSCCAL=_READ_OSCCAL_DATA();
init();
led_up=0;
led_down=0;
work_led=w_off;
TRISA2=1;
recieve();
t0_cnt=3662;
while(1)
{
if(T0IF) //0.065536 S
{
T0IF=0;
fan_reg<<=1;
if(fan)
bitset(fan,0);
if(--t0_cnt==0) // 4 minitue
{
work_led=w_off;
t0_cnt=3662;
led_up=0;
led_down=0;
}
}
key_tmp=PORTC&0x038;
j=6;
do
{
if((PORTC&0x038)!=key_tmp)
{
j=6;
continue;
}
}
while(--j!=0);
recieve();
if(CARRY==1)
{
Verify_120();
if((CARRY==1)||(key_tmp&0x38)!=0x38)
{
if((key_stop==0)||(CSR0&0xf)==4)
{
do_stop();
}
if((key_up==0)||(CSR0&0xf)==8)
{
if(fan_reg==0)
do_up();
else
do_down();
}
if((key_down==0)||(CSR0&0xf)==1)
{
if(fan_reg==0)
do_down();
else
do_up();
}
}
}
if(RA2==1)
{
work_led=w_off;
led_up=0;
led_down=0;
TRISA2=0;
RA2=1;
TMR0=0;
learn_cnt=153;
while(1)
{
recieve();
if(CARRY==1)
{
if((CSR0&0xf)==2)
{
Write_a_sn();
learn_cnt=5;
do
{
RA2=0;
delay_1ms(250);
RA2=1;
delay_1ms(250);
}
while(--learn_cnt!=0);
TRISA2=1;
break;
}
}
if(!T0IF)
continue;
T0IF=0;
if(--learn_cnt==0)
{
TRISA2=1; //10 second reach
break;
}
TRISA2=1;
if(read_s_port(10)==1)
{
if(++l_cnt2==32)
{
TRISA2=0;
RA2=0;
Erase_120();
delay_1ms(250);
delay_1ms(250);
delay_1ms(250);
delay_1ms(250);
TRISA2=1;
break;
}
}
else
{
if(l_cnt2!=0)
l_cnt2--;
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -