/* * File: main.c * Author: yunana * * Created on 2016/12/25, 19:42 */ #include #include #include "lcd.h" #include "si5351a.h" #pragma config FOSC = IRC #pragma config WDTEN = OFF #pragma config FCMEN = OFF #pragma config PWRTEN = ON #pragma config BOREN = ON #pragma config BORV = 30 #pragma config LVP = OFF #pragma config MCLRE = OFF #pragma config HFOFST = ON #pragma config PLLEN = OFF #define DEBUG 0 #define _XTAL_FREQ 16000000 #define MAX_FREQ 99000000 // max frequency #define MIN_FREQ 1000000 // min frequency #define DEF_FREQ 17273800 // default frequency #define FIX_FREQ 10243800 // IF frequency unsigned long freq; // VFO frequency unsigned long step; // frequency up down step unsigned char renc_now, renc_old; // value of rotary encoder unsigned char mode; // 0:normal 1:RIT mode unsigned char cflag; // frequency change flag unsigned char diff; // frequency up down flag void delay_ms(unsigned int t) { for(; t > 0; t--) // 16MHz clock __delay_ms(1); // 1ms: 0.001 / ((1 / (16000000 / 4)) * 1000) = 12 } void interrupt isr(void) { if(INTCONbits.RABIF) { if(PORTBbits.RB5 == 1) { if(PORTBbits.RB7 == 0) renc_now = 0; else renc_now = 1; } else { if(PORTBbits.RB7 == 1) renc_now = 2; else renc_now = 3; } if((renc_now + 3 + 1) % 3 == renc_old) diff = 0; if((renc_now + 3 - 1) % 3 == renc_old) diff = 1; renc_old = renc_now; INTCONbits.RABIF = 0; } cflag = 1; } void long2comma(unsigned long data, unsigned char keta) { int i; char buf[10]; sprintf(buf, "%7ld", data); for(i = 0; i < keta; i++) { lcd_putch(buf[i]); if(i == 0 || i == 3) lcd_putch('.'); } } void lcd_update() { char buf[10]; if(mode == 0) { lcd_gotopos(0, 0); long2comma(freq - FIX_FREQ, 6); sprintf(buf, "RIT OFF ", step); lcd_gotopos(0, 1); lcd_puts(buf); } else { lcd_gotopos(0, 0); long2comma(freq - FIX_FREQ, 6); sprintf(buf, "RIT ON ", step); lcd_gotopos(0, 1); lcd_puts(buf); } } void main(void) { unsigned char sw0_state; unsigned int tim; unsigned char sendflag; unsigned long ftmp; OSCCON = 0b11110111; // 16MHz internal clock TRISA = 0b00110000; // RA4,5 sw input TRISB = 0b11110000; // RB5,7 rotary encoder TRISC = 0b00000000; // LCD control ADCON0bits.ADON = 0; // ad converter off ANSEL = 0; ANSELH = 0; INTCONbits.RABIE = 1; // PortA,B pin change interrupt enable INTCON2bits.RABPU = 0; // PortA,B pull-up enable INTCON2bits.RABIP = 0; // PortA,B interruput priority low WPUB = 0b10100000; // RB5,7 pull-up WPUA = 0b00110000; // RA3,5 pull-up IOCBbits.IOCB5 = 1; // RB5 pin change interrupt enable IOCBbits.IOCB7 = 1; // RB7 pin change interrupt enable // sidetone /* CCP1CONbits.CCP1M = 0b1100; T2CONbits.T2CKPS1 = 1; // timer2 prescaler 1/16 PIE1bits.TMR2IE = 0; TMR2 = 0; PR2 = 250; // about 1kHz CCPR1L = PR2 / 2; // duty 50% T2CONbits.TMR2ON = 0; */ sw0_state = 0; mode = 0; step = 50; diff = 0; tim = 0; cflag = 0; sendflag = 0; freq = DEF_FREQ; PORTAbits.RA2 = 0; lcd_init(); lcd_update(); delay_ms(100); i2c_init(); si5351_init(); si5351_setfreq(0, freq); INTCONbits.GIE = 1; // general interrupt enable while(1) { // RIT if(PORTAbits.RA5 == 0) { sw0_state = 1; delay_ms(20); tim++; } if(sw0_state && PORTAbits.RA5 == 1) { sw0_state = 0; tim = 0; if(step == 50) { ftmp = freq; step = 10; mode = 1; lcd_update(); } else { freq = ftmp; step = 50; mode = 0; lcd_update(); } } // change transmit and recive if(PORTAbits.RA4 == 0) { if(sendflag == 0) { if(mode == 1) { si5351_setfreq(1, ftmp - FIX_FREQ); } else { si5351_setfreq(1, freq - FIX_FREQ); } delay_ms(1); T2CONbits.TMR2ON = 1; // sidetone on PORTAbits.RA2 = 1; sendflag = 1; } } else { if(sendflag) { T2CONbits.TMR2ON = 0; // sidetone off PORTAbits.RA2 = 0; si5351_setfreq(0, freq); sendflag = 0; } } if(tim > 100) { sw0_state = 0; tim = 0; } // frequency changed if(cflag) { if(diff) { if((freq + step) <= MAX_FREQ) freq += step; } else { if((freq - step) >= MIN_FREQ) freq -= step; } si5351_setfreq(0, freq); lcd_update(); cflag = 0; } } }