?? drh.c
字號:
#include <pic.h>
#define XTAL_FREQ 4MHZ
#include "delay.c"
#include <delay.h>
#define delay_ms DelayMs
#define delay_us DelayUs
#define key GPIO3
#define blue_led GPIO2
#define green_led GPIO4
#define red_led GPIO5
//#define set_low_value 0x4c //20-1.04-b0-130-4c
//#define set_mid_value 0x3c //28-.821-f0-3c
//#define set_high_value 0x2e //35-.642-bb-2e
//**
//#define set_low_value 0x41 //25-51.5k-0x105-41
//#define set_mid_value 0x2e //35
//#define set_high_value 0x20 //45-21.8k-0x81-20
//**
#define set_low_value 0x36 //30-40.7k-0xda-0x36
#define set_mid_value 0x27 //40-26.6k-0x9a-0x26
#define set_high_value 0x1c //50-17.7k-0x6c-0x1b
#define pwm_out GPIO1
static unsigned char time,state,have_key,key_open;
static unsigned char temperature,temp_data,pwm;
/*
void delayus(unsigned int xx) {
unsigned char j,k;
if(xx>0xfe){
k=xx/10;
for(j=0;j<10;j++)delay_us(k);
}
else delay_us(xx);
};
*/
static void interrupt gpie(void){
INTCON=0;
GPIF=0;
if(TMR1IF==1)time++;
TMR1IF=0; //PIR1:0
INTCON=0xc0;
}
void ad_init(void){
ADCON0=0x01; //
ANSEL=0x11; //AD CLOCK FOCS/8 AN0 SELECE AD CONVER REF:VDD
ADON=1; //AD Module on
}
unsigned char ad_read(unsigned char channel){
channel&=0x03;
ADCON0&=0xc3;
ADCON0|=(channel<<2);
GODONE=1;
while(GODONE)continue;
return(ADRESH);
}
void sleep_sub(void){
blue_led=1;green_led=1;red_led=1;
ADON=0;
INTCON=0x88; //GIE=1;GPIE=1;
IOCB=0x08; //GP3 CHANGE INTERRUPT
OPTION = 0x8f; // WDT prescaled by 1 - about 17 ms
CLRWDT();
asm("sleep");
CLRWDT();
// asm("nop"); //jump main
//CLRWDT();
OPTION = 0x88; // WDT prescaled by 1 - about 17 ms
asm("goto $");
asm("nop");
INTCON=0xc0;
CMCON=0x07;
}
void led(void){
blue_led=1;green_led=1;red_led=1;
if(state==1)blue_led=0;
if(state==2)green_led=0;
if(state==3)red_led=0;
}
void key_function(void){
have_key=0;
key_open=0;
if(key!=0)return;
led();
TMR1L=0;
TMR1H=0;
time=0;
GIE=1;
TMR1ON=1;
for(;;){
CLRWDT();
if(time>4)sleep_sub();
if(key!=0)break;
}
TMR1L=0;
TMR1H=0;
time=0;
while(1){
CLRWDT();
for(;;){
CLRWDT();
if(key==0){
delay_ms(10);
if(key==0){have_key=1;break;}
}
if(time>8){
blue_led=1;
green_led=1;
red_led=1;
TMR1L=0;
TMR1H=200;
time=0;
return;
}
}
TMR1L=0;
TMR1H=0;
time=0;
state++;
if(state>3)state=1;
led();
if(state==1)temperature=set_low_value;
if(state==2)temperature=set_mid_value;
if(state==3)temperature=set_high_value;
for(;;){
CLRWDT();
if(key!=0)break;
if(time>4)sleep_sub();
}
}
}
//////////////////////////////////////
void pwm_function(void){
unsigned int pwm_high,pwm_low,h,l;
TMR1L=0;
TMR1H=200; //about 100 ms check a time
time=0;
GIE=1;
TMR1ON=1;
h=2*pwm*10/10;
l=2*(100-pwm)*10/10;
for(;;){
CLRWDT();
pwm_high=h;
pwm_out=1;
if(time>0)break;
while(pwm_high--);
//delayus(pwm_high);
pwm_low=l;
pwm_out=0;
while(pwm_low--);
//delayus(pwm_low);
key_function();
}
}
//////////////////////main////////////////////////
main(){
unsigned char i,temp;
i=0;
temp_data=0;
GPIO=0x34;
CMCON=0x07;
TRISIO=0b00001001;
//as pic16f676
asm("movlw 0x01");
asm("movwf 0x91");
ANSEL=0x11; // same pic12f675 ANSEL=0X11;
OPTION = 0x0D; // WDT prescaled by 64 - about 1200 ms
GPIO=0x34; 0b00110100; //led of
TRIS2=1; /////////////
WPU2=1;
ad_init();
PEIE=0x01; //enable INTCON:6
T1CON=0x30; //timer1 1:8
PIE1=0x01; //enable timer1 intterupt TMR1IE;
TMR1ON=0; //T1CON:0 TMR1 STOP
//WPU0=1; //gpio0 weak pull-up enable
i=0;
i=0;
CLRWDT();
if((GPIO2==0)&&(key==0)){
pwm_out=1;
delay_ms(200);
temp_data=ad_read(0);
if((temp_data>0x3a)&&(temp_data<0x40)){GPIO4=0;GPIO5=0;};
test: CLRWDT();
if(GPIO2==0)goto test;
pwm_out=0;
}
TRIS2=0; //////////
GPIO=0x34; 0b00110100; //led of
GPPU=1;
if(key==1)sleep_sub(); //no key press
TMR1L=0;
TMR1H=0;
TMR1ON=1; //START TMR1 ON
GIE=1; //enable globe inttrupt
time=0;
for(;;){
CLRWDT();
if((key!=0)&&(time<5))sleep_sub();
if((key!=0)&&(time>4)){blue_led=0;break;}
if(time>4)blue_led=0;
}
state=1;
//locate_convert:
for(;;){
CLRWDT();
TMR1L=0;
TMR1H=0;
time=0;
GIE=1;
TMR1ON=1;
led();
have_key=0;
temp=0;
for(;;){
CLRWDT();
if((key!=0)&&(time>8)){have_key=0;break;}
if(key==0){
delay_ms(10);
if(key==0){have_key=1;temp=1;state++;break;}
}
}
if(state>3)state=1;
if(have_key==1)led();
TMR1L=0;
TMR1H=0;
time=0;
GIE=1;
TMR1ON=1;
key_open=0;
while(temp){
CLRWDT();
if(time>4)sleep_sub();
if(key!=0){temp=0;key_open=1;};
}
// if(key_open==1)goto locate_convert;
if(key_open==0)break;
}
blue_led=1;green_led=1;red_led=1;
if(state==1)temperature=set_low_value;
if(state==2)temperature=set_mid_value;
if(state==3)temperature=set_high_value;
while(1){
CLRWDT();
temp_data=ad_read(0);
if((temp_data>0xe0)||(temp_data<0x0f)){
if(state==1)pwm=1;
if(state==2)pwm=1;
if(state==3)pwm=1;
};
if(temp_data>temperature)pwm++;
if(temp_data<temperature)pwm--;
if(pwm<1)pwm=1;
if(pwm>100)pwm=100;
pwm_function();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -