First Programm.HF Lo Band VFO with LPC1114 and AD9851 module.Built in ELEKEY.Using ACM1602NI.

Dependencies:   mbed QEI

main.cpp

Committer:
jp1nom
Date:
2016-11-13
Revision:
0:5cdf1a556e60
Child:
1:ee890adf56ea

File content as of revision 0:5cdf1a556e60:

#include "mbed.h"
#include "I2cLCD.h"

DigitalOut DATA(dp9);
DigitalOut W_CLK(dp17);
DigitalOut FQ_UD(dp11);
DigitalOut RESET(dp26); //previously known as dp26
DigitalOut LED(dp14);
DigitalOut PTT_OUT(dp18);
DigitalIn PTT_ON(dp1);
DigitalIn DOT(dp4);
DigitalIn BAR(dp6);
DigitalOut KEY(dp13);
DigitalIn BAND_SW(dp10);
DigitalIn JOG_1(dp2);
DigitalIn JOG_2(dp28);   //previously known as dp28
DigitalIn JOG_3(dp25);
DigitalIn JOG_4(dp16);

double FQX;
double FQD;

double FQD_18 = 1810000;
double FQD_19 = 1907500;
double FQD_351 = 3500000;
double FQD_352 = 3599000;
double FQD_353 = 3680000;
double FQD_381 = 3702000;
double FQD_382 = 3745000;
double FQD_383 = 3791000;
double FQD_4 = 4630000;
double FQD_7 = 7000000;
double FQD_10 = 10100000;

double FQ;

double FQ_18 = 43191352;
double FQ_19 = 45517913;
double FQ_351 = 83519190.5;
double FQ_352 = 85881750;
double FQ_353 = 87814470;
double FQ_381 = 88339811;
double FQ_382 = 89365820;
double FQ_383 = 90463357;
double FQ_4 = 110484088;
double FQ_7 = 167038250;
double FQ_10 = 241012230;

double f1 = 7000000;
double f2 = 7200000;
double f1_CW = 7000000;
double f2_CW = 7045000;
int BAND;
double IF;
double STEPD;
double STEP = 2.386;
float wt = 0.1;
const int a=1;
int s;

Ticker deley;
float del = 0.1;

void DDS(void);
void DDS_U(void);
void DDS_D(void);
void DDS_T(void);
void GET_LCD_DATA(void);
void STEPS(void);
void QSY(void);
void STEPSS(void);
void JOG(void);
void DDS_CW(void);
void PTT_OFF(void);

I2cLCD lcd(dp5, dp27);

int main() {

    KEY = 0;
    STEPD = 10;
    BAND = 7;
    FQD = FQD_7;
    FQ = FQ_7;

    IF = 10857458;//IF 455KHz
//    IF = 255329316.50856;// IF 10.7MHz  
//    lcd.locate(1,1);
//    lcd.printf("455K");
//    lcd.locate(0,1);
//    lcd.printf("10.7M");
  

    LED = 0;
    s = 1;    
    
    RESET=0;
    RESET=1;
    wait_us(100);
    RESET=0;
    DATA=0;
    FQ_UD=0;
    W_CLK=0;
    
    W_CLK=1;
    wait_us(100);
    W_CLK=0;
    FQ_UD=1;
    wait_us(100);
    FQ_UD=0;
    wait_us(100);
    GET_LCD_DATA();

    FQX = FQ + IF;    
    DDS(); 
    DDS();
    lcd.locate(8,0);
    lcd.printf("0MHz");
    lcd.locate(12,1);
    lcd.printf("1KHz");
    lcd.locate(14,0);
    lcd.printf("RX");
    lcd.locate(0,1);
    lcd.printf("Mode:"); 

    while(1) {
        if (PTT_ON==0) {DDS_T();}
//        if (FQ_UP==0) {DDS_U();}
//        if (FQ_DOWN==0) {DDS_D();}
//        if (FSTEP==0) {STEPS();}
        if (DOT==0) {DDS_CW();}
        if (BAR==0) {DDS_CW();}
        if (BAND_SW==0) {QSY();}
        if (JOG_1==1) {JOG();}
    }
}

void DDS(void) {

    unsigned long int DDS_DATA;  
    unsigned long int BIT_DATA;

    int i = 0;

    DDS_DATA = FQX;
    
    for (i=0; i<32; i++) {
        BIT_DATA = DDS_DATA & 1;
        if(BIT_DATA==1) {
            DATA = 1;
        } else {
            DATA = 0;
        }
        W_CLK = 1;
        DDS_DATA = DDS_DATA >> 1;
        wait_us(10);
        W_CLK = 0;
        wait_us(10);
    } 
    
    DDS_DATA = a;
    
    for (i=0; i<8; i++) {
        BIT_DATA = DDS_DATA & 1;
        if(BIT_DATA==1) {
            DATA = 1;
        } else {
            DATA = 0;
        }
        W_CLK = 1;
        DDS_DATA = DDS_DATA >> 1;
        wait_us(10);
        W_CLK = 0;
        wait_us(10);
    }
    FQ_UD = 1;
    wait_us(10);
    FQ_UD = 0;
    wait_us(10);
}

void DDS_U(void) {
    
//    if (FQD <= f1 && FQD <= f2) {
        if (s==0) {
            if ((FQD + STEPD) <= f2) {
                FQD = FQD + STEPD;
                FQ = FQ + STEP * 100; 
            }    
        }else{
            if ((FQD + STEPD * 100) <= f2) {
                FQD = FQD + STEPD * 100;
                FQ = FQ + STEP * 10000;
            }
        }
//    }        
    GET_LCD_DATA();
    FQX = FQ + IF;
    DDS();
    wait(wt);
}

void DDS_D(void) {
    
//    if (FQD <= f1 && FQD <= f2) {
        if (s==0) {
            if ((FQD - STEPD) >= f1) {
                FQD = FQD - STEPD;
                FQ = FQ - STEP * 100;
            }
        }else{
            if ((FQD - STEPD * 100) >= f1) {
                FQD = FQD - STEPD * 100;
                FQ = FQ - STEP * 10000;
            }
        }
//    }
    GET_LCD_DATA();
    FQX = FQ + IF;
    DDS();
    wait(wt);
}
    
void DDS_T(void) {

    deley.detach();
      
    if (FQD > f1 && FQD < f2) {
        GET_LCD_DATA();
        lcd.locate( 14, 0 );
        lcd.printf( "T" );

        FQX = FQ;
        DDS();
        LED = 1;
        PTT_OUT = 1;
        while( PTT_ON == 0) {}
        PTT_OUT = 0;
        LED = 0;
        FQX = FQ + IF;
        DDS();
    }else{
        LED=1;
        wait(0.2);
        LED=0;
        wait(0.2);
    }
    GET_LCD_DATA();
    lcd.locate( 14,0 );
    lcd.printf( "R" );     
}

void GET_LCD_DATA(void) {

    char f[9];
    
    sprintf(f,"%8.5lf",FQD / 1000000);    
    lcd.locate( 0,0 );
    lcd.printf( f );
    if (FQD >= f1_CW && FQD < f2_CW) {
        lcd.locate( 5,1 );
        lcd.printf("CW   ");
    }else{
        if(FQD >= f2_CW && FQD < f2 ) {
            lcd.locate( 5,1 );
            lcd.printf("Phone");
    }else{
        lcd.locate( 5,1 );
        lcd.printf("none ");
        }
    }
}

void STEPS( void ) {
    if (s==1) {
        s = 0;
        lcd.locate(13,1);
        lcd.printf("0");
    }else{
        s = 1;
        lcd.locate(13,1);
        lcd.printf("K");
    }    
    wait(0.3);
}

void QSY(void) {
     switch (BAND) {
     case 7:
        BAND = 10;
        FQD_7 = FQD;
        FQD = FQD_10;
        FQ_7 = FQ;
        FQ = FQ_10;
        f1 = 10100000;
        f2 = 10150000;
        f1_CW = 10100000;
        f2_CW = 10150000;
        break;
        
    case 10:
        BAND = 18;
        FQD_10 = FQD;
        FQD = FQD_18;
        FQ_10 = FQ;
        FQ = FQ_18;
        f1 = 1810000;
        f2 = 1825000;
        f1_CW = 1810000;
        f2_CW = 1825000;
        break;
        
    case 18:
        BAND = 19;
        FQD_18 = FQD;
        FQD = FQD_19;
        FQ_18 = FQ;
        FQ = FQ_19;
        f1 = 1907500;
        f2 = 1912500;
        f1_CW = 1907500;
        f2_CW = 1912500;
        break;

    case 19:
        BAND = 351;
        FQD_19 = FQD;
        FQD = FQD_351;
        FQ_19 = FQ;
        FQ = FQ_351;
        f1 = 3500000;
        f2 = 3575000;
        f1_CW = 3500000;
        f2_CW = 3535000;
        break;
        
    case 351:
        BAND = 352;
        FQD_351 = FQD;
        FQD = FQD_352;
        FQ_351 = FQ;
        FQ = FQ_352;
        f1 = 3599000;
        f2 = 3612000;
        f1_CW = 3599000;
        f2_CW = 3599000;
        break;

    case 352:  
        BAND = 353;
        FQD_352 = FQD;
        FQD = FQD_353;
        FQ_352 = FQ;
        FQ = FQ_353;
        f1 = 3680000;
        f2 = 3687000;
        f1_CW = 3680000;
        f2_CW = 3680000;
        break;
        
    case 353:
        BAND = 381;
        FQD_353 = FQD;
        FQD = FQD_381;
        FQ_353 = FQ;
        FQ = FQ_381;
        f1 = 3702000;
        f2 = 3716000;
        f1_CW = 3702000;
        f2_CW = 3702000;
        break;

    case 381:
        BAND = 382;
        FQD_381 = FQD;
        FQD = FQD_382;
        FQ_381 = FQ;
        FQ = FQ_382;
        f1 = 3745000;
        f2 = 3770000;
        f1_CW = 3745000;
        f2_CW = 3745000;
        break;

    case 382:
        BAND = 383;
        FQD_382 = FQD;
        FQD = FQD_383;
        FQ_382 = FQ;
        FQ = FQ_383;
        f1 = 3791000;
        f2 = 3805000;
        f1_CW = 3791000;
        f2_CW = 3791000;
        break;

    case 383:
        BAND = 4;
        FQD_383 = FQD;
        FQD = FQD_4;
        FQ_383 = FQ;
        FQ = FQ_4;
        f1 = 4629999;
        f2 = 4630001;
        f1_CW = 4630000;
        f2_CW = 4630001;
        break;

    case 4:
        BAND = 7;
        FQD_4 = FQD;
        FQD = FQD_7;
        FQ_4 = FQ;
        FQ = FQ_7;
        f1 = 7000000;
        f2 = 7200000;
        f1_CW = 7000000;
        f2_CW = 7045000;
        break;
        
    default:
        BAND = 7;
        FQD = FQD_7;
        FQ = FQ_7;
        break;
    }
    GET_LCD_DATA();
    FQX = FQ + IF;
    DDS();
    wait(0.3);
}

void STEPSS( void ) {
    if (s==0) {
        lcd.locate(13,1);
        lcd.printf("0");
    }else{
        lcd.locate(13,1);
        lcd.printf("K");
    }    
//    wait(0.3);
}

void JOG( void ) {
 
    int jog;
    deley.detach();

    jog = JOG_2 * 4 +JOG_3 * 2 + JOG_4 * 1;
    
    switch( jog ) {
        
        case 2:
            wt = 0.3;
            s  = 0;
            lcd.locate(12,0);
            lcd.printf("> ");
            STEPSS();
            DDS_U();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;
        
        case 6:
            wt = 0.05;
            s  = 0;
            lcd.locate(12,0);
            lcd.printf(">>");
            STEPSS();
            DDS_U();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;
            
        case 4:
            wt = 0.3;
            s  =1;
            lcd.locate(12,0);
            lcd.printf("> ");
            STEPSS();
            DDS_U();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;

        case 0:
            wt = 0.05;
            s  =1;
            lcd.locate(12,0);
            lcd.printf(">>");
            STEPSS();
            DDS_U();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;                


        case 3:
            wt = 0.3;
            s  = 0;
            lcd.locate(12,0);
            lcd.printf(" <");
            STEPSS();
            DDS_D();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;
        
        case 7:
            wt = 0.05;
            s  = 0;
            lcd.locate(12,0);
            lcd.printf("<<");
            STEPSS();
            DDS_D();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;
            
        case 5:
            wt = 0.3;
            s  =1;
            lcd.locate(12,0);
            lcd.printf(" <");
            STEPSS();
            DDS_D();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;

        case 1:
            wt = 0.05;
            s  =1;
            lcd.locate(12,0);
            lcd.printf("<<");
            STEPSS();
            DDS_D();
            lcd.locate(12,0);
            lcd.printf("  ");
            break;                

        
        default:
            wt = 0.05;
            s  =1;
            STEPSS();
            DDS_D();
            lcd.locate(12,0);
            lcd.printf("  ");
            break; 
    }
}

void DDS_CW(void) {
    if (FQD > f1 && FQD < f2) {
        deley.detach();
        GET_LCD_DATA();
        lcd.locate( 14, 0 );
        lcd.printf( "T" );

        FQX = FQ;
        DDS();
        LED = 1;
        PTT_OUT = 1;
        KEY = 1;
        if (BAR==0) {
            wait(3.5*del);
            KEY = 0;
            wait(del);
        }else{
            if (DOT==0) {
                wait(del);
                KEY = 0;
                wait(del);
            }
        }   
        deley.attach(&PTT_OFF,4*del);
    }else{
        LED=1;
        wait(0.2);
        LED=0;
        wait(0.2);
    }

}

void PTT_OFF(void) {
    PTT_OUT = 0;
    LED = 0;
    KEY = 0;
    FQX = FQ + IF;
    DDS();
    GET_LCD_DATA();
    lcd.locate( 14,0 );
    lcd.printf( "R" );  
}