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;i0;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()); 
} 
}