/*************************************** //////////// M A R K E R //////// ***************************************/ //use special funcion registers #pragma sfr #pragma DI #pragma EI #include "trgbios.h" #define NULL ((void *)0) unsigned char state; unsigned short code; unsigned char key; unsigned char mode; unsigned char tone; unsigned char freq; unsigned char sw_mode; unsigned char sw_freq; const unsigned char cw[] = { 0x2a, 0xe0, 0x2a, 0xe0, 0x2a, 0xe0, 0x00, 0x00 }; //////////////////////////////////////// //////////// I N I T ////////////// //////////////////////////////////////// //initialize timer 51 //statemachine interupt timer void init_tim51(void) { // trg_puts("TIM 51\n"); TMC51 = 0x00; //timer mode control stop CR51 = 15; //timer compare register 1/16 TCL51 = 0x05; //timer clock 250k TMC51 = 0x84; //start compare clear inhi dis TMC51.6 = 0; //not PWM LVS51 = 0; //FF set LVR51 = 1; //FF reset TMC51.1 = 0; //not INV TOE51 = 0; //disable TMIF51 = 0; //interuput flag TMMK51 = 0; //interuput mask flag TCE51 = 1; //start } //initialize timer H1 //carrier generator void init_timH1(void) { // trg_puts("TIM H1\n"); TMHMD1 = 0x05; //timer mode control TMCYC1 = 0x07; //carrier TMIFH1 = 0; //interuput flag TMMKH1 = 1; //interuput mask flag CMP01 = 32; //compare 1/64 CMP11 = 30; //output 16M/64=250k TMHE1 = 1; //start PM1.6 = 0; //output P1.6 = 0; //latch } //initialize after reset void init_set(void) { // trg_puts("INIT\n"); PM6.1 = 0; // LED on board PM1.0 = 0; // LED FRQ-R PM1.1 = 0; // LED FRQ-G PM1.2 = 0; // LED KEY-R PM1.7 = 0; // LED KEY-G PU0.1 = 1; // SW MODE PU3.0 = 1; // SW FREQ P6.1 = 0; // LED on board/L-act P1.0 = 1; // LED FRQ-R P1.1 = 1; // LED FRQ-G P1.2 = 1; // LED KEY-R P1.7 = 1; // LED KEY-G init_tim51(); init_timH1(); state = 0; code = 0; freq = 2; mode = 1; tone = 1; sw_freq = 0x55; sw_mode = 0x55; } //exit program void exit_set(void) { TMMK51 = 1; //interuput mask flag TCE51 = 0; //stop TMHE1 = 1; //stop TMCYC1 = 0x00; //Low PM1.6 = 1; //RF OUT PM6.1 = 1; // LED on board PM1.0 = 1; // LED FRQ-R PM1.1 = 1; // LED FRQ-G PM1.2 = 1; // LED KEY-R PM1.7 = 1; // LED KEY-G } //////////////////////////////////////// /////////// C A R R I E R //////////// //////////////////////////////////////// //set 1MHz void set_1M(void) { // trg_puts("Output 1MHz\n"); TMCYC1 = 0x07; //carrier CMP01 = 8; //compare 1/16 CMP11 = 6; //output 16M/16=1M TMHE1 = 1; //start PM1.6 = 0; //output P1.0 = 0; //FRQ-R P1.1 = 1; //FRQ-G } //set 250kHz void set_250k(void) { // trg_puts("Output 250kHz\n"); TMCYC1 = 0x07; //carrier CMP01 = 32; //compare 1/64 CMP11 = 30; //output 16M/64=250k TMHE1 = 1; //start PM1.6 = 0; //output P1.0 = 1; //FRQ-R P1.1 = 1; //FRQ-G } //set 100kHz void set_100k(void) { // trg_puts("Output 100kHz\n"); TMCYC1 = 0x07; //carrier CMP01 = 80; //compare 1/160 CMP11 = 78; // output 16M/160=100k TMHE1 = 1; //start PM1.6 = 0; //output P1.0 = 1; //FRQ-R P1.1 = 0; //FRQ-G } //////////////////////////////////////// ////////// M O D U R A T E /////////// //////////////////////////////////////// unsigned char send_tone(void) { return(1); } unsigned char send_rept(void) { unsigned char ret=0; unsigned char send; code++; if((code >> 4) & 0x01) { ret = 1; } else { ret = 0; } return(ret); } unsigned char send_code(void) { unsigned char ret=0; unsigned char send; code++; send = cw[((code >> 5) & 0x07)]; if((send << ((code >> 2) & 0x07)) & 0x80) { ret = 1; // trg_puts("1"); } else { ret = 0; // trg_puts("0"); } return(ret); } //////////////////////////////////////// /////////// S W I T C H ////////////// //////////////////////////////////////// //mode switch void set_mod(void) { if(P3.0) { sw_mode = (sw_mode << 1) & 0xf7; } else { sw_mode = (sw_mode << 1) | 0x01; } if(sw_mode == 0xc0) { mode++; if(mode > 3){ mode = 1; if(tone){ tone = 0; } else { tone = 1; } } } } //freq switch void set_frq(void) { if(P0.1) { sw_freq = (sw_freq << 1) & 0xf7; } else { sw_freq = (sw_freq << 1) | 0x01; } if(sw_freq == 0xc0) { freq++; if(freq > 3){ freq = 1; } switch(freq){ case 1: set_100k(); break; case 2: set_250k(); break; case 3: set_1M(); break; default: set_250k(); } } } //key void set_key(void) { switch(mode){ case 1: key = send_tone(); break; case 2: key = send_rept(); break; case 3: key = send_code(); break; default: key = send_rept(); } } //////////////////////////////////////// //////////// T I M E R /////////////// //////////////////////////////////////// //CLK 16MHz/64(2**6)=>250k INT 250k/(15+1)=>16kHz void int_tim(void) { state++; switch(state){ case 0: set_key(); break; case 1: set_mod(); break; case 2: set_frq(); break; // default: } if(key) { // trg_puts("1"); P1.2 = 1; //KEY-R if(tone == 0) { TMCYC1 = 0x07; //carrier P1.7 = 0; //KEY-G }else if((state >> 3) & 0x01) { //1kHz TMCYC1 = 0x07; //carrier P1.7 = 1; //KEY-G } else { TMCYC1 = 0x05; //Low P1.7 = 0; //KEY-G } } else { // trg_puts("0"); P1.2 = 0; //KEY-R P1.7 = 0; //KEY-G if(tone == 0) { TMCYC1 = 0x05; //Low } else if(state & 0x01) { //8kHz TMCYC1 = 0x07; //carrier } else { TMCYC1 = 0x05; //Low } } TMIFH1 = 0; //flag clear } //////////////////////////////////////// //////////// M A I N ////////////// //////////////////////////////////////// void main() { trg_usbopen(); init_set(); trg_regintsrv(TRG_INTID_BSITM51,int_tim); set_frq(); P6.1 = 1; // LED on board while(1) {} exit_set(); }