www.pudn.com > FM_GTG602_rs300.rar > FM_GTG602_rs300.c
/******************************************************/ /********* 系统时钟:8M **** AVR16l ******************/ #include#include #define uchar unsigned char #define uint unsigned int /********* PA7-RS PA6-RW PA5-EN *** PC-DATA *************/ #define RS_CLR PORTA&=~BIT(PA5) #define RS_SET PORTA|=BIT(PA5) #define RW_CLR PORTA&=~BIT(PA6) #define RW_SET PORTA|=BIT(PA6) #define EN_CLR PORTA&=~BIT(PA7) #define EN_SET PORTA|=BIT(PA7) /************FM_MONO_STEREO 立体声 FM_POWER_DOWN 降电 ******/ #define FM_MONO_STEREO 1 #define FM_POWER_DOWN 1 /************ 使能 时钟 数据 静音 ***************************/ #define FM_CE_SET PORTA|=BIT(PA3) #define FM_CE_CLR PORTA&=~BIT(PA3) #define FM_CLK_SET PORTA|=BIT(PA2) #define FM_CLK_CLR PORTA&=~BIT(PA2) #define FM_DAT_SET PORTA|=BIT(PA1) #define FM_DAT_CLR PORTA&=~BIT(PA1) #define FM_MUT_SET PORTA|=BIT(PA0) #define FM_MUT_CLR PORTA&=~BIT(PA0) uint iFrequency; uchar iFM_MONO_CTL,iFM_PWD_CTL; uchar display[]={"0123456789"};//1602显示数据 /*----------------------------------------------------------------------- 延时函数 -----------------------------------------------------------------------*/ void delay_1us(void) //1us延时函数 { asm("nop"); } void delay_nus(unsigned int n) //N us延时函数 { unsigned int i=0; for (i=0;i 0;i++) { num[i]=display[number%10];//每位以字符表示 number/=10; } for(j=0;j> i ) & 0x01 ) FM_DAT_SET; else FM_DAT_CLR; FM_CLK_SET; //下降沿触发发送数据 同步方式 delay_nus(10); FM_CLK_CLR; } kFrequency= 0x00CC; // 发送测试数据 for ( i = 0; i < 8; i++ ) { if ( (kFrequency >> i ) & 0x01 ) FM_DAT_SET; else FM_DAT_CLR; FM_CLK_SET; delay_nus(10); FM_CLK_CLR; } FM_CE_CLR; //关FM 接收数据 } void FM_RS300A_WRITER_24bit_display(uint jFrequency,uchar jFM_MONO_CTL,uchar jFM_PWD_CTL){ LCD_clear(); iFM_MONO_CTL=jFM_MONO_CTL; iFM_PWD_CTL=jFM_PWD_CTL; iFrequency=jFrequency; if (jFM_MONO_CTL==FM_MONO_STEREO ) //判断 音频模式 {jFrequency|= 0x0800; LCD_write_str(0,0," stereo");} else LCD_write_str(0,0,"manaural"); if ( jFM_PWD_CTL==FM_POWER_DOWN ) //判断 供电模式 {jFrequency|= 0x4000; LCD_write_str(9,0,"pwd");} else LCD_write_str(9,0,"pwo"); FM_RS300A_WRITER(jFrequency); LCD_write_number(3,1,iFrequency/10); } void FM_RS300A_INIT(void) { DDRA|=BIT(PA0)|BIT(PA1)|BIT(PA2)|BIT(PA3); FM_MUT_CLR; //静音关 LCD_write_str(13,0,"ado"); FM_RS300A_WRITER_24bit_display(1000,0,0); //发送数据设置频率 //100M 非立体声 上电 } /****************键盘扫描部分////*****************/////// //D是键盘口 低行 高列 D0-D3 行 D4--D7列 uchar key_scan() { uchar n=0; DDRD=0xf0;PORTD=0x0f; if(PIND!=0x0f){; } else return 0; delay_nms(1); //消抖延时 if((PIND&0x01)==0){n +=10;} else if((PIND&0X02)==0){n +=20;} else if((PIND&0X04)==0){n +=30;} else if((PIND&0X08)==0){n +=40;} //行扫描 else return 0; DDRD=0x0f;PORTD=0xf0; delay_nms(1); if((PIND&0X10)==0){n +=1;} else if((PIND&0X20)==0){n +=2;} else if((PIND&0X40)==0){n +=3;} else if((PIND&0X80)==0){n +=4;} //列扫描 else return 0; while(PIND!=0Xf0); //检测按键弹起 return n; //返回键值 0时 无按下 } void key_manage(uchar n){ switch(n){ case 41://LCD_clear(); FM_RS300A_WRITER_24bit_display(iFrequency,iFM_MONO_CTL,0); break; // dianyuan kai case 42: //LCD_clear(); FM_RS300A_WRITER_24bit_display(iFrequency,iFM_MONO_CTL,1); break; // dianyuan guan case 43: //LCD_clear(); FM_RS300A_WRITER_24bit_display(iFrequency,0,iFM_PWD_CTL); break; // 非立体声 case 44: //LCD_clear(); FM_RS300A_WRITER_24bit_display(iFrequency,1,iFM_PWD_CTL); break; //立体声 case 31:if(iFrequency<1200)iFrequency+=20; //LCD_clear(); FM_RS300A_WRITER_24bit_display(iFrequency,iFM_MONO_CTL,iFM_PWD_CTL); break; //2M步进 case 32:if(iFrequency>880)iFrequency-=20; FM_RS300A_WRITER_24bit_display(iFrequency,iFM_MONO_CTL,iFM_PWD_CTL); //LCD_clear(); break; //2M步退 case 33:FM_MUT_SET;break; case 34:FM_MUT_CLR;break; default:break; } } /**********************************************/ void main(){ LCD_init(); FM_RS300A_INIT(); while(1){ key_manage(key_scan()); } }