?? tyn-001.c
字號:
/*
THIS PRAGROM IS USE ABOUT SUNNY BATTERY LI-ION
SETUP CHIP IS PIC16F716,PRODUCE WILL USE MDT2051
CYCSTAL USE RC 110K
*/
#include <pic.h>
#define XTAL_FREQ 110KHZ
#include "delay.c"
#include <delay.h>
#define delay_ms DelayMs
#define delay_us DelayUs
#define radio RB7
#define model RB5
#define select_v RB6
#define check_a RB4
#define check_v RB3
static unsigned char time,volt_state,j;
static unsigned char radio_temp,radio_flag,model_state,model_flag,volt_flag,over_flag;
static unsigned int i;
unsigned char v42or84(unsigned char volt);
unsigned char v5or9v(unsigned char volt);
void radio_key(void);
static void interrupt timer1(void){
GIE=0;
if(TMR1IF==1)time++;
TMR1IF=0; //PIR1:0
TMR1L=0;
TMR1H=0xf0;
GIE=1;
}
void main(void)
{
PORTA=0;
ADCON1=0X07; //ALL AS OUTPUT
PORTA=0X01;
TRISA=0x0; //PORTA all as OUTPUT
PORTB=0xf8;
TRISB=0xf8; //rb3-rb7 as input other output
GIE=0;
TMR1IE=0;
PEIE=1; //T1CON=0b00000000; //fre 1:8
delay_ms(10);
TMR1IF=0;
TMR1L=0;
TMR1H=0xf0;
TMR1ON=1;
OPTION=0x0f; //enable weak pull-up wdt prescaler 1:128
CLRWDT();
time=0;
radio_temp=0;
radio_flag=0;
model_state=0;
model_flag=0;
volt_flag=0;
volt_state=0;
over_flag=0;
i=0;
j=0;
for(;;){ //@1***
///////////
CLRWDT();
if((radio==0)&&(radio_flag==0)){
radio_flag=1;
if(radio_temp==0){radio_temp=1;RB2=1;} //to radio on or off
else {radio_temp=0;RB2=0;}
}
if(radio==1)radio_flag=0; //check radio key free
////////////
if((model==0)&&(model_flag==0)){
model_flag=1;
model_state++;
if(model_state>2)model_state=0;
}
if(model==1)model_flag=0;
if(model_state==0){ //OFF MODEL
RB0=0;RB1=0;
PORTA=0x01;
}
if(model_state==2){ //LED LIGHT MODEL
RB0=0;RB1=0;
PORTA=0x03;
}
if(model_state==1){ //sunbattery discharge MODEL @2***
for(;;){
CLRWDT();
if((select_v==0)&&(volt_flag==0)){ //volt convert
TMR1IF=0;
GIE=1;
TMR1IE=1;
TMR1L=0;
TMR1H=0xf0;
time=0;
for(;;){ //sure key press time if have 3 second
volt_flag=1;
CLRWDT();
if((select_v!=0)&&(time<15)){volt_flag=0;break;}
if(time>14){volt_flag=0;volt_state++;break;}
}
GIE=0;
TMR1IE=0;
TMR1L=0;
TMR1H=0;
time=0;
}
if(volt_state>3)volt_state=0;
if(volt_flag==0){
switch(volt_state){
case 0: over_flag=v42or84(0);break;
case 1: over_flag=v5or9v(1);break;
case 2: over_flag=v42or84(2);break;
case 3: over_flag=v5or9v(3);break;
default: break;}
};
if((model==0)||(over_flag==1)) break;
if(over_flag==2){model_state=0;RA2=0;RA3=0;RB0=0;RB1=0;break;}
//SHUT OFF ALL VOLTAGE DISPLAY LED AND SHUT DOWN
///////////
if(radio==1)radio_flag=0; //check radio key free
if((radio==0)&&(radio_flag==0)){
radio_flag=1;
if(radio_temp==0){radio_temp=1;RB2=1;} //to radio on or off
else {radio_temp=0;RB2=0;}
}
////////////
}
} //@2***
} //@1***
}
unsigned char v5or9v(unsigned char volt){
TMR1IF=0;
GIE=1;
TMR1IE=1;
TMR1L=0;
TMR1H=0xf0;
time=0;
RA2=0;RA3=0;RB0=0;RB1=0; //SHUT OFF ALL VOLTAGE DISPLAY LED
if(volt==1)RA2=1;
if(volt==3)RB0=1;
while(model==0);
model_flag=0;
while(select_v==0);
volt_flag=0;
for(;;){
CLRWDT();
if(volt==1){ //OUTPUT VOLTAGE 5V
RA2=1;
delay_ms(5);
RA0=0;
if(RB4==0)time=0;
if(time>250){
RA0=1; //RA2=0;RB0=0;
GIE=0;
TMR1IE=0;
TMR1L=0;
TMR1H=0;
time=0;
return(2);
}
}
if(volt==3){ //OUTPUT VOLTAGE 9V
RB0=1;
delay_ms(5);
RA0=0;
if(RB4==0)time=0;
if(time>250){
RA0=1; //RA2=0;RB0=0;
GIE=0;
TMR1IE=0;
TMR1L=0;
TMR1H=0;
time=0;
return(2);
}
}
if(RB4==0)time=0;
if(time>3){if(select_v==0)break;}
if(model==0)break;
if(radio==1)radio_flag=0; //check radio key free
if((radio==0)&&(radio_flag==0)){
radio_flag=1;
if(radio_temp==0){radio_temp=1;RB2=1;} //to radio on or off
else {radio_temp=0;RB2=0;}
}
}
RA0=1; //RA2=0;RB0=0;
GIE=0;
TMR1IE=0;
TMR1L=0;
TMR1H=0;
time=0;
return(1);
}
unsigned char v42or84(unsigned char volt){
TMR1IF=0;
GIE=1;
TMR1IE=1;
TMR1L=0;
TMR1H=0xf0;
time=0;
RA2=0;RA3=0;RB0=0;RB1=0; //SHUT OFF ALL VOLTAGE DISPLAY LED
if(volt==0)RB1=1;
if(volt==2)RA3=1;
while(model==0); //waitting free model key
model_flag=0;
while(select_v==0); //waitting free select_v key
volt_flag=0;
for(;;){
CLRWDT();
if(volt==0){ //OUTPUT VOLTAGE 4.2V@1***
if(RB3!=0){ //@2*** no battery or battery error
RA0=1;RB1=0;
j=0;
while(j<30){
CLRWDT();
if(time>11){j++;time=0;RB1=1;RA0=0;} //EVERY a SECOND CHECK IF HAVE BATTERY
delay_ms(100);
RA0=1;RB1=0;
if(time>8){if(RB3==0)break;} //if have battery will get out
if(model==0)break;
if(select_v==0)return(1);
radio_key();
}
} //@2***
if(RB3==0){RB1=1;RA0=0;delay_ms(10);}
} //@1***
if(volt==2){ //OUTPUT VOLTAGE 8.4V@1***
if(RB3!=0){ //@2*** no battery or battery error
RA0=1;RA3=0;
j=0;
while(j<30){
CLRWDT();
if(time>11){j++;time=0;RA3=1;RA0=0;} //EVERY TWO SECOND CHECK IF HAVE BATTERY
delay_ms(100);
RA0=1;RA3=0;
if(time>9){if(RB3==0)break;}
if(model==0)break;
if(select_v==0)return(1);
radio_key();
}
} //@2***
if(RB3==0){RA3=1;RA0=0;delay_ms(10);}
} //@1***
j=0;
while(j<30){ //IF 30 SECOND NO CURRENT WILL GET OUT
CLRWDT();
delay_ms(5);
if(RB4==0)time=0;
if(time>10){j++;time=0;}
if(j>5){RA0=1;GIE=0;
TMR1IE=0;
TMR1L=0;
TMR1H=0;
time=0;
return(2);
}
//if(select_v==0)break;
if(model==0)break;
radio_key();
}
/*
delay_ms(1);
if(RB4==0)time=0;
if(select_v==0)break;
if(time>20)break;
if(model==0)
*/
RA0=1; //RA3=0;RB1=0;
GIE=0;
TMR1IE=0;
TMR1L=0;
TMR1H=0;
time=0;
return(1);
}
RA0=1; //RA3=0;RB1=0;
GIE=0;
TMR1IE=0;
TMR1L=0;
TMR1H=0;
time=0;
return(1);
}
void radio_key(void){
if(radio==1)radio_flag=0; //check radio key free
if((radio==0)&&(radio_flag==0)){
radio_flag=1;
if(radio_temp==0){radio_temp=1;RB2=1;} //to radio on or off
else {radio_temp=0;RB2=0;}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -