// -------------------------------------- // DIY-A1 Frequency Display Module // MCU Code Version 1.00 // 2002.07.08 // Designed by Rong Xinhua, BD6CR // E-mail: bd6cr@qsl.net // -------------------------------------- // Hardware: DIY-A1 REV A // http://www.qsl.net/bd6cr/fc // Order: http://www.qsl.net/bd6cr/store // AT89C2051 + 74HC390 + C-284CI // Clock: 12MHz // -------------------------------------- // Compiler: // KEIL 8051 C Compiler V5.20 (DLL: 1.24) // (uVision/51 for Windows Version 1.24) // Download: http://www.mcu51.com // -------------------------------------- #include //pin definition #define MHZ_BUTT P3_3 #define OFFSET P3_2 #define SEG1 P3_7 #define SEG2 P3_4 #define SEG3 P3_1 #define SEG4 P3_0 #define FINPUT P3_5 #define LEDDATA P1 //constant definition //frequency offset for 139A receiver #define offset1 -4650 //default, usually set to 0. -4650 means f(rx) = f(vfo)-465.0kHz #define offset2 4650 //variable definition unsigned char convert[10] = {0x3F,0x21,0x5B,0x73,0x65,0x76,0x7E,0x23,0x7F,0x77}; unsigned char digits[4] = {0xFF,0xFF,0xFF,0xFF}; unsigned char timer0_count = 0, timer1_count = 0; unsigned char temp1, temp2, temp3; unsigned char tag = 0, mhz = 0; //subroutines void timer0() interrupt 1 using 1 { timer0_count ++; if (timer0_count == 16) { EA = 0; tag = 1; TR1 = 0; TR0 = 0; temp1 = timer1_count; temp2 = TH1; temp3 = TL1; timer0_count = 0; TH0 = 189; TL0 = 208; timer1_count = 0; TH1 = 0; TL1 = 0; TR0 = 1; TR1 = 1; EA = 1; } } void timer1() interrupt 3 using 2 { timer1_count ++; } unsigned char bcd_seg(unsigned char n) { if (n < 10) return(convert[n]); return(0); } void delay() { int j; for (j=0; j< 120; j++) { if (MHZ_BUTT == 0) mhz = 1; //MHZ_BUTT pressed? } //delay some time } void display() { LEDDATA = digits[3]; SEG4 = 0; delay(); SEG4 = 1; LEDDATA = digits[2]; SEG3 = 0; delay(); SEG3 = 1; LEDDATA = digits[1]; SEG2 = 0; delay(); SEG2 = 1; LEDDATA = digits[0]; SEG1 = 0; delay(); SEG1 = 1; } //main goes here main() { unsigned long count; TMOD = 0X51; //TMR1 external input: 0x51 IE = 0X8A; IP = 0X08; //Timer1 piority higher than timer0 TH0 = 189; TL0 = 208; TH1 = 0; TL1 = 0; TR0 = 1; //start TMR0 here TR1 = 1; while (1) { if (tag) { display(); display(); count = temp1 * 65536; display(); display(); count = count + temp2 * 256; display(); display(); count = count + temp3; display(); display(); if (OFFSET) count = count + (offset1); else count = count + (offset2); display(); display(); if (mhz) count = count / 100; else count = count % 10000; display(); display(); digits[3] = bcd_seg(count / 1000); if (mhz) digits[3] = digits[3] + 128; display(); display(); count = count % 1000; display(); display(); digits[2] = bcd_seg(count / 100); display(); display(); count = count % 100; display(); display(); digits[1] = bcd_seg(count / 10); if (mhz == 0) digits[1] = digits[1] + 128; display(); display(); count = count % 10; digits[0] = bcd_seg(count); tag = 0; mhz = 0; } display(); display(); } }