/*
	Camera Release system for PENTAX K20D
	PIC16F1938
  	V1.01    2025/8/23
  
Manual Mode:Releas(START) keyを押すとカメラのシャッターボタンと同じ動き（カメラのBポジションも可）
	One Time Mode:B-OPENに表示される秒間シャッターをオープン（カメラのBポジションに限る）
	Multi Times Mode:B-OPENの秒間シャッターをopenした後、Intervalの秒間シャッター閉じる
	シャッターON/OFFのシーケンスを1回とし、TIMESに示す回数繰り返す。
	いずれもの数値も0-255の範囲に設定可能。（カメラのBポジションに限る）
	最長シャッタopen時間：18時間3分45秒
	最短シャッターopen時間：0.1秒 or 1秒
 	シャッター時間0.1秒：STARTキーを押しながらPOWER ON



*/

// PIC16F1938 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection (XT Oscillator, Crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF     // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#pragma config PLLEN = ON       // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
//#pragma config DEBUG = OFF      // In-Circuit Debugger Mode (In-Circuit Debugger disabled, ICSPCLK and ICSPDAT are general purpose I/O pins)
#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <string.h>

#include "Font9.h"
#include "Font12.h"

#define _XTAL_FREQ 28800000//Fosc 7.2 x4 MHz
#define REA PORTBbits.RB1 //REinput A 
#define REB PORTBbits.RB0 //REinput B INT0
#define LCD_CS LATCbits.LATC7
#define LCD_DC LATCbits.LATC2
#define LCD_RES LATCbits.LATC6
#define RLED LATAbits.LATA5
#define RELEZIN PORTAbits.RA0
#define MLTImode PORTAbits.RA1
#define MODEkey PORTAbits.RA2
#define RELEZOUT LATBbits.LATB5
#define ADGO ADCON0bits.GO_nDONE //ADC START/DONE
#define us unsigned

us char lastLEREZIN,CNTstart,ADcnt,BKflg;
us char lastmodekey,MODE,MMODE,TimeBaseH,TimeBaseL,TimeBase0;
us char BOPEN1set,BOPEN2set,BOPENcnt,INTERVALset,INTERVALcnt,TIMESset,TIMEScnt;
us char lastBOPEN1set,lastBOPEN2set,lastINTERVALset,lastTIMESset,lastMLTImode,lastBOPENcnt,lastINTERVALcnt;

us char mojicolor,backcolor;
us int VDD;
unsigned int FX,FY;//フォント表示の開始座標
unsigned int F_col,F_row;
us char lcd_digi[10];
us char lcd_data[32];
us char color[17][3];//18bit color data
const unsigned char color0[16][3]= {//24bit color data RBG
	{0,0,0},//0 黒
	{255,0,0},//1赤､
	{0,255,0},//2　緑
	{0,100,255},//3　青
	{255,255,0},//4　黄
	{0,255,255},//5　シアン
	{255,0,255},//6　紫
	{255,255,255},//7　白
	{0,0,120},//8　紺
	{120,0,0},//9　茶
	{0,50,0},//10
	{120,120,0},//11
	{0,30,50},//12
	{120,0,120},//13
	{60,60,60},//14 
	{255,165,115}//15　オレンジ
  
};
us char CC0,CC1,CC2,CC3,CC4,CC5;

//EEPROM読み込み
unsigned char eepdata_read(unsigned char adr) {
      unsigned char data;   
      EEADR = adr;//アドレス 0-255
      EECON1 = 0;
      EECON1bits.RD = 1;
      while(EECON1bits.RD == 1);
      data = EEDATA;
      return data;
 }
//EEPROM書き込み
 void eepdata_write(unsigned char adr,unsigned char data) {
      INTCONbits.GIE = 0;
      EEADR = adr;
      EEDATA = data;
      EECON1 = 0;
      EECON1bits.WREN = 1;
      EECON2 = 0x55;
      EECON2 = 0xAA;
      EECON1bits.WR = 1;
      while(EECON1bits.WR == 1);    
      INTCONbits.GIE = 1;
}


void lcd_CMD(unsigned char CM) {

    LCD_DC = 0;    
	LCD_CS = 0;
	
	SSPBUF = CM;
    __delay_us(2) ;
	LCD_CS = 1;
}
void lcd_DATA(unsigned char DA) {

    LCD_DC = 1;
	LCD_CS = 0;
	
	SSPBUF = DA;
    __delay_us(2) ;
	LCD_CS = 1;

}
void init_LCD() {
	LCD_RES = 0;

	__delay_ms(120) ;
 
	LCD_RES = 1;
	__delay_ms(120) ;

    lcd_CMD(0x01);
   
	__delay_ms(120) ;
    
	lcd_CMD(0x11);//Sleep Out
    __delay_us(50) ;
    lcd_CMD(0x28);// display off
	__delay_ms(120) ;
	lcd_CMD(0x36);
     
	lcd_DATA(0b01100100);
    lcd_CMD(0x3A);
	lcd_DATA(0x66);

	lcd_CMD(0x2A);
	lcd_DATA(0x00);
	lcd_DATA(0x00);
	lcd_DATA(0x01);//    01
	lcd_DATA(0xEF);//319 3F
	lcd_CMD(0x2B);
	lcd_DATA(0x00);
	lcd_DATA(0x00);
	lcd_DATA(0x00);//     00
	lcd_DATA(0x3F);//239  EF

	__delay_ms(100) ;
	
}

void itostring(unsigned char digit, unsigned long int data,unsigned  char *buffer) {
	unsigned char i;
	buffer += digit;
	*buffer =0;					// 最後の数字位置
	for(i=digit; i>0; i--) {			// 変換は下位から上位へ
            buffer--;					// ポインター１
            *buffer = (data % 10) + '0';	// ASCIIへ
            data = data / 10;				// 次の桁へ
	}
}
void set_col_range(unsigned int start, unsigned int end) {//行範囲の指定
	lcd_CMD(0x002A);
	lcd_DATA(start >> 8);
	lcd_DATA(start);
	lcd_DATA(end >> 8);
	lcd_DATA(end);
	}
void set_row_range(unsigned int start, unsigned int end) {//列範囲の指定
	lcd_CMD(0x002B);
	lcd_DATA(start >> 8);
	lcd_DATA(start);
	lcd_DATA(end >> 8);
	lcd_DATA(end);
	}

void set_LCDcolor(unsigned char C) {//24bitRGBto16bitRGB
	unsigned int c0;
    us int cr,cg,cb;
    c0 = 0;
	cr =255- color0[C][0];//赤
//	cr = color0[C][0];//赤
	cg =255- color0[C][1];//緑 
//	cg = color0[C][1];//緑 
    
	
	cb =255- color0[C][2];//青
//	cb = color0[C][2];//青

	color[C][0] = cr;
	color[C][1] = cg;
    color[C][2] = cb;
}



void makecolorList(){
	us char i;
	for (i = 0;i <= 15;i++){
		set_LCDcolor(i);
	}
}
void write_color(unsigned char C) {
	lcd_DATA(color[C][0]);
	lcd_DATA(color[C][1]);
    lcd_DATA(color[C][2]);
}




void select_font_mk2(unsigned int F) {
    switch (F) {
        case  7:F_col=6;F_row=9;break;//実際のフォントドットから-1した値､
        case 12:F_col=11;F_row=21;break;
        case  9:F_col=8;F_row=14;break;
    }
}
void mojidisp_mk2(us char f,us char ch,us char spn) {//BLOCK文字表示
	int k;
    //const unsigned char *fc;
	unsigned char *fc;
	int x,y,ma,mj;

	set_col_range(FX,FX+F_col);
 	set_row_range(FY,FY+F_row);
 	lcd_CMD(0x2C);//色データ書き込み

    switch (f) {
		case 9:fc = Font9_table[ch];break;
    	case 12:fc = Font12_table[ch];break;
     }

	mj = F_col;

 	for (y=0;y<=F_row;y++) {
 		mj = F_col;
 		for (x=0;x<=F_col;x++) {
 			ma = mj % 8;///ma:mjを8で割り算した余り
 			k=(*fc) & (1<< ma);
 				if (k>0) {
                    write_color(mojicolor);//文字色
 				} else {
 					write_color(backcolor);//背景色
					
 				}
                mj--;
                if (ma == 0) {if (x < F_col) {fc++;}}
 			}
                
 		fc++;
 	}
	FX=FX+F_col+spn;
}


void mojiretsudisp_mk2( us int x,us int y,us char fnt,  us char *str,us char spn) {//  文字列表示
    unsigned char i;
    char len;
	FX = x; FY =y;
	select_font_mk2(fnt);
	len = strlen(str);
	for (i=0;i<len;i++) {
        mojidisp_mk2(fnt,str[i],spn);
	}
}


void write_dots(int x,int y,int d,char c) {//x:ｘ座標　y:y座標　d:線幅　c:色番号
	int i,j;
	set_col_range(x,x+d);
 	set_row_range(y,y+d);
	lcd_CMD(0x2C);//色データ書き込み
	for (i=x;i<x+d;i++) {
 		for (j=y;j<=y+d;j++) {
 			write_color(c);//文字色
 		}
	}
}


void integerdisp(us int x, us int y,us char fnt,us char degi, us long int num,us char spn) {
    FX=x;FY=y;
    itostring(degi,num,lcd_digi);//ASCIIに変換
    mojiretsudisp_mk2(x,y,fnt,lcd_digi,spn);
}


void write_line(unsigned int xs,unsigned int ys,unsigned int xe,unsigned int ye,unsigned char c) {
    unsigned int i,j;
    set_col_range(xs,xe);
    set_row_range(ys,ye);
    lcd_CMD(0x2C);//色データ書き込み
    for (i=ys;i<=ye;i++) {
        for (j=xs;j<=xe;j++) {
            write_color(c);
        }
    }
}
void write_Rectangle(us int xs,us int ys,us int xe,us int ye,us int c) {
    us int i,j;
    write_line(xs,ys,xe,ys,c);
    write_line(xs,ys,xs,ye,c);
    write_line(xe,ys,xe,ye,c);
    write_line(xs,ye,xe,ye,c);
}

int get_colorcord(unsigned int R,unsigned int G,unsigned int B){
    int i,j;
    i=R>>3;
    i=i<<6;
    j=G>>2;
    i=i|j;
    i=i<<5;
    j=B>>3;
    i=i|j;
    return i;
}

unsigned int takeADdata() {
  	unsigned int adv,advh,advl;
	ADRESH = 0;
	ADRESL = 0;
	__delay_us(100) ;
    ADGO = 1;//AD Start
    while (ADGO);// AD変換完了まで待つ

    advh =  ADRESH;advl = ADRESL;
    adv = advh << 8;adv = adv | advl;
	return adv;
}

void takelastdata(){
	BOPEN1set = eepdata_read(0);
	BOPEN2set = eepdata_read(1);
	INTERVALset = eepdata_read(2);
	TIMESset = eepdata_read(3);
    MODE = eepdata_read(4);
}

void strset(us char *as, us char *buf) {//文字列をLCD表示用ASCII文字に変換
    while (*as) *buf++ = *as++;
    *buf = 0x00;
}
void dispTimeStep(us char t){
    mojicolor = 5;
    if (t == 1){mojiretsudisp_mk2(100,222,9,"TIMER STEP: 0.1sec",3);} else {
        mojiretsudisp_mk2(100,222,9,"TIMER STEP: 1sec",3);}
}
void dispVDD(us char c){
    us int v100,v10;
	mojicolor = c;
    v100 = VDD/100;v10 = VDD-(v100*100);
    integerdisp(177,190,9,1,v100, 3);//FX,FY,Font番号,桁数,数値,スパン
    integerdisp(196,190,9,2,v10, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispBOPEN1set(us char c){
    mojicolor = c;
    integerdisp(69,110,12,3,BOPEN1set, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispBOPEN2set(us char c){
    mojicolor = c;
    integerdisp(69,110,12,3,BOPEN2set, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispINTERVALset(us char c){
    mojicolor = c;
    integerdisp(159,110,12,3,INTERVALset, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispTIMESset(us char c){
    mojicolor = c;
    integerdisp(249,110,12,3,TIMESset, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispBOPENcnt(us char c){
    mojicolor = c;
    integerdisp(69,150,12,3,BOPENcnt, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispINTERVALcnt(us char c){
    mojicolor = c;
    integerdisp(159,150,12,3,INTERVALcnt, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispTIMEScnt(us char c){
    mojicolor = c;
    integerdisp(249,150,12,3,TIMEScnt, 3);//FX,FY,Font番号,桁数,数値,スパン
}
void dispsecdata(us char M){
	if (M == 2){dispBOPEN2set(CC1);MMODE = 0;}else{dispBOPEN1set(CC4);}
    dispINTERVALset(CC4);
    dispTIMESset(CC4);
    dispBOPENcnt(CC4);
    dispINTERVALcnt(CC4);
    dispTIMEScnt(CC4);
}
void dispBASIC(){
    us char c = 4;
    write_Rectangle(1,30,319,212,c);
    write_line(1,70,319,70,c);
    write_line(1,102,319,102,c);
    write_line(1,142,319,142,c);
    write_line(1,182,319,182,c);
    write_line(46,70,46,182,c);
    write_line(132,70,132,182,c);
    write_line(230,70,230,182,c);
    mojicolor=5;backcolor = 0;
    mojiretsudisp_mk2(10,10,9,"CAMERA RELEASE SYSTEM",3);// FX,FY,Font,Moji.span
    mojicolor=c;
    mojiretsudisp_mk2(10,43,9,"MODE",3);// 
    mojiretsudisp_mk2(49,80,9," B-OPEN",3);
    mojiretsudisp_mk2(139,80,9,"INTERVAL",3);
    mojiretsudisp_mk2(233,80,9," TIMES",3);
    mojiretsudisp_mk2(10,114,9,"SET",3);// 
    mojiretsudisp_mk2(10,154,9,"CNT",3);// 
    mojiretsudisp_mk2(10,190,9,"BATT Voltage    .  V",3);// 
    dispsecdata(MODE);
}
void dispMODE(us char m){
//    mojicolor = 4;
        switch (m) {
            case 0: mojicolor = 4;mojiretsudisp_mk2(100,43,9,"MANUAL     ",3);break;
            case 1: mojicolor = 5;mojiretsudisp_mk2(100,43,9,"ONE TIME   ",3);break;
            case 2: mojicolor = 7;mojiretsudisp_mk2(100,43,9,"MULTI TIMES",3);break;
            }
}
char getMODEkeySw(){
 	char sw,last,cnt;
 	cnt=0;
 	last= MODEkey; //MODE スイッチの接続ポート
	while(cnt < 80){
		__delay_us(500);
 		sw=MODEkey;
 		if(last == sw){ // 前回の状態と比較
			cnt++; //安定状態
 			}else{
			cnt=0; //チャタリング発生中
 			}
 		last=sw; // 今の状態を前回の状態とする
 		}
	return sw;
 	}
 	
char getMLTImodeSw(){
 	char sw,last,cnt;
 	cnt=0;
 	last= MLTImode; //MODE スイッチの接続ポート
	while(cnt < 80){
		__delay_us(500);
 		sw= MLTImode;
 		if(last == sw){ // 前回の状態と比較
			cnt++; //安定状態
 			}else{
			cnt=0; //チャタリング発生中
 			}
 		last=sw; // 今の状態を前回の状態とする
 		}
	return sw;
 	}

void MODEcheck() {
	char sw;
	if (MODEkey == 1) {lastmodekey = 1; return;}
	if (MODEkey == lastmodekey) { return; }
	
	sw = getMODEkeySw(); // チャタリング除去済のスイッチ状態
    lastmodekey = sw;
    if( (0 == sw) && (MODEkey == 0) ){ // スイッチが押されて、かつ現在ON
		MODE++;
        if (MODE > 2) {MODE = 0;}
        dispMODE(MODE);
        switch (MODE) {
            case 0: BOPEN1set = 0;INTERVALset = 0;TIMESset = 0;break;
            case 1: BOPEN1set = eepdata_read(0);break;
            case 2: BOPEN2set = eepdata_read(1);INTERVALset = eepdata_read(2);TIMESset = eepdata_read(3);break;
            }
        dispsecdata(MODE);
		}
	}
	
void MLTImodecheck(){
	char sw;
	if (MLTImode == 1) {lastMLTImode = 1; return;}
	if (MLTImode == lastMLTImode) { return; }
	if (MODE != 2){return;}
	sw = getMLTImodeSw(); // チャタリング除去済のスイッチ状態
    lastMLTImode = sw;
    if( (0 == sw) && (MLTImode == 0) ){ // スイッチが押されて、かつ現在ON
		MMODE++;
        if (MMODE > 2) {MMODE = 0;}
        switch (MMODE) {
        	case 0: dispTIMESset(CC4);dispBOPEN2set(CC1);break;
        	case 1: dispBOPEN2set(CC4);dispINTERVALset(CC1);break;
        	case 2: dispINTERVALset(CC4);dispTIMESset(CC1);break;
            }

		}
	
	}
	
void ONETimeBOPEN(){
	if (BOPEN1set == 0) {return;}
	CNTstart = 1;dispBOPEN1set(CC4);
	eepdata_write(0,BOPEN1set);eepdata_write(4,MODE);
	RELEZOUT = 1;RLED = 1;TMR1ON = 1;//TIMER1 start
	while (BOPEN1set != BOPENcnt){
		if (lastBOPENcnt != BOPENcnt){dispBOPENcnt(CC4);}
		if ((RELEZIN == 0)&&(BOPENcnt > 1)){TMR1ON = 0;BKflg = 1;break;}
	}
	RELEZOUT = 0;RLED = 0;TMR1ON = 0;//TIMER1 stop
	BOPENcnt = 0;dispBOPENcnt(CC4);
	CNTstart = 0;
}
void MLTITimeBOPEN() {
	if ((BOPEN2set == 0) || (TIMESset == 0)){return;}
	CNTstart = 1;
	switch (MMODE) {
		case 0: dispBOPEN2set(CC4);break;
		case 1: dispINTERVALset(CC4);break;
		case 2: dispTIMESset(CC4);break;
	}
	eepdata_write(1,BOPEN2set);
	eepdata_write(2,INTERVALset);
	eepdata_write(3,TIMESset);
	eepdata_write(4,MODE);
	while (TIMESset != TIMEScnt){
		MMODE = 0;
		RELEZOUT = 1;RLED = 1;TMR1ON = 1;//TIMER1 start
		
		while (BOPEN2set != BOPENcnt){
			if (lastBOPENcnt != BOPENcnt){dispBOPENcnt(CC4);}
			if ((RELEZIN == 0)&&(BOPENcnt > 1)){TMR1ON = 0;BKflg = 1;goto L001;}
		}
//        if (BKflg == 1) {goto L001;}
		if (INTERVALset != 0){RELEZOUT = 0;RLED = 0;TMR1ON = 0;}//TIMER1 stop
		if (INTERVALset != 0){
			RELEZOUT = 0;RLED = 0;TMR1ON = 1;//TIMER1 start
			BOPENcnt = 0;dispBOPENcnt(CC4);
			MMODE = 1;
			while (INTERVALset != INTERVALcnt){
				if (lastINTERVALcnt != INTERVALcnt){dispINTERVALcnt(CC4);}
				if ((RELEZIN == 0)&&(INTERVALcnt > 1)){TMR1ON = 0;BKflg = 1;goto L001;}
			}
			TMR1ON = 0;//TIMER1 stop
			INTERVALcnt = 0;dispINTERVALcnt(CC4);
		
		}
		TIMEScnt++;dispTIMEScnt(CC4);
	}
L001:    
	RELEZOUT = 0;RLED = 0;TMR1ON = 0;//TIMER1 stop
	TIMEScnt = 0;dispTIMEScnt(CC4);
	CNTstart = 0;
    if (BKflg == 1){BOPENcnt = 0;INTERVALcnt = 0;dispBOPENcnt(CC4);dispINTERVALcnt(CC4);}
}
/********************************************
 * 割り込み処理
***********************************************/
void __interrupt() InterFunction(void) {
    if (INTF == 1){
        INTE = 0;INTF = 0;
        if ((REA == 1) && (MODE == 1)){
            lastBOPEN1set = BOPEN1set;BOPEN1set++;}
        if ((REA == 0) && (MODE == 1)) {
            lastBOPEN1set = BOPEN1set;BOPEN1set--;}
        if ((REA == 1) && (MODE == 2)){
            if(MMODE == 0){
                lastBOPEN2set = BOPEN2set;BOPEN2set++;}
            if (MMODE == 1){
                lastINTERVALset = INTERVALset;INTERVALset++;}
            if (MMODE == 2){
                lastTIMESset = TIMESset;TIMESset++;}
        }
        if ((REA == 0) && (MODE == 2)){
            if (MMODE == 0){
                lastBOPEN2set = BOPEN2set;BOPEN2set--;}
            if (MMODE == 1){
                lastINTERVALset = INTERVALset;INTERVALset--;}
            if (MMODE == 2){
                lastTIMESset = TIMESset;TIMESset--;}
                
            }
        INTE = 1;
        }
        
	if (TMR1IF == 1) {

		TMR1IF = 0;TMR1IE = 0;TMR1ON = 0;
//		ADcnt++;
		if (MODE == 1){BOPENcnt++;}
		if ((MODE == 2) && (MMODE == 0)){BOPENcnt++;}
		if ((MODE == 2) && (MMODE == 1)){INTERVALcnt++;}
	
		TMR1H = TimeBaseH;TMR1L = TimeBaseL;
		TMR1IE =1;TMR1ON = 1;
		}

    }
    

/*******************************************************************************
*  MAIN 処理                                                               *
*******************************************************************************/
void main() {



OSCCON = 0b10000000;   // 7.2MHz 

PORTA = 0x00;
LATA = 0x00;
TRISA = 0b11011111;//0-4:in 5:out
ANSELA = 0x00;
PORTB = 0x00;
LATB = 0x00;
TRISB = 0b11011111;//5::out other:in
ANSELB = 0b00010000;//RB4:AD
PORTC = 0x00;
LATC = 0x00;	
TRISC = 0b00000011;//0,7:in 1-6:out

ADCON0 = 0b00101101;//AN11(RB4)
ADCON1 = 0xA0;//0b10100000	; //右詰め　ADCS 1/32 Vref=VDD
	
SSPCON1 = 0b00110000;//EN=1:SCK L act SSPM:0010 clock Fosc/4= 7.2MHz
INTCON = 0b10010000;//INT0 割り込み有効

T1CON = 0b10001000;//T1osc Pre 1/1 T1OSC EN  TMR1OFF 32.768KHz
if (RELEZIN == 0){TimeBaseH = 0xF3;TimeBaseL = 0x33;TimeBase0 = 1;} else {
    TimeBaseH = 0x80;TimeBaseL = 0x33;TimeBase0 = 0;}
TMR1H = TimeBaseH;TMR1L = TimeBaseL;
GIE = 1;PEIE = 1;
TMR1IE = 1;
TMR1IF = 0;


CC0 = 0;CC1 = 1;CC2 =2;CC3 = 3;CC4 = 4;CC5 = 5;	
makecolorList();

init_LCD();



    lcd_CMD(0x29);//Display ON

	write_line(0,0,319,239,0);//Xs,Ys,Xe,Ye,Color 
	takelastdata();

    dispBASIC();
    MMODE = 0;if (MODE == 255){MODE = 0;}
    dispMODE(MODE);
    dispTimeStep(TimeBase0);
	VDD = takeADdata();ADcnt = 0;dispVDD(CC4);
    INTE = 1;
    while(RELEZIN == 0);
    CNTstart = 0;
    BKflg = 0;
    while(1){
        if (RELEZIN == 1) {BKflg = 0;}
        ADcnt++;
    	if (ADcnt > 33){VDD = takeADdata();ADcnt = 0;dispVDD(CC4);}
    	if ((RELEZIN == 0) && (MODE == 0)) {RELEZOUT = 1;RLED = 1;__delay_ms(30);} else {
            RELEZOUT = 0;RLED = 0;__delay_ms(30); 
        }
        MODEcheck();
    	MLTImodecheck();
        if ((lastBOPEN1set != BOPEN1set) && (MODE == 1)){dispBOPEN1set(CC1);}
    	if ((lastBOPEN2set != BOPEN2set) && (MODE == 2) && (MMODE == 0)){dispBOPEN2set(CC1);}

    	if ((lastINTERVALset != INTERVALset) && (MODE == 2) && (MMODE == 1)){dispINTERVALset(CC1);}
		if ((lastTIMESset != TIMESset) && (MODE == 2) && (MMODE == 2)){dispTIMESset(CC1);}
    	
    	if ((MODE == 1) && (RELEZIN == 0) && (CNTstart == 0) && (BKflg == 0)){ONETimeBOPEN();}
    	if ((MODE == 2) && (RELEZIN == 0) && (CNTstart == 0) && (BKflg == 0)){MLTITimeBOPEN();}
    }
}

