⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm_gtg602_rs300.c

📁 主控芯片RS300A 的GTG602模块 FM调频发射源程序
💻 C
字号:
/******************************************************/
/********* 系统时钟:8M  **** AVR16l ******************/                    
#include<iom16v.h>
#include<macros.h>
#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<n;i++) 
   delay_1us(); 
  } 
   
void delay_1ms(void)                 //1ms延时函数 
  { 
   unsigned int i; 
   for (i=0;i<1140;i++); 
  } 
   
void delay_nms(unsigned int n)       //N ms延时函数 
  { 
   unsigned int i=0; 
   for (i=0;i<n;i++) 
   delay_1ms(); 
  } 

//命令写入
void LCD_write_com(uchar com) 
{delay_nms(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 PORTC = com; 
 delay_nus(5); 
 EN_CLR;
}
//数据写入
void LCD_write_data(uchar data) 
{delay_nms(5);
RS_SET;
 RW_CLR; 
 EN_SET; 
 PORTC = data;
 delay_nus(5);
 EN_CLR;
}
//单字符写入
void LCD_write_char(uchar x,uchar y,uchar data) 
{
if(y==0) {LCD_write_com(0x80 + x);}    
 else  {LCD_write_com(0xC0 + x);}      
 LCD_write_data(data); 
}
//显示屏清空显示
void LCD_clear(void) 
 { LCD_write_com(0x01); 
 delay_nms(5);}
 void LCD_write_str(uchar x,uchar y,uchar *s)   
{if(y==0)
 {while (*s)
  {if(x<16)
  {LCD_write_com(0x80 + x);
  LCD_write_data(*s);  
  s++;
  x++;}
  else {LCD_write_com(0xc0 + x-16);
        LCD_write_data(*s);
		s++;
		x++;
		}
        
  
 }
}
 else {LCD_write_com(0xC0 + x);
      while (*s) 
      {LCD_write_data(*s);  
      s++;}
      }
}

//n位整数显示
void LCD_write_number(uchar x,uchar y, uint number)
{uchar num[32]={""},i,j,k;
if(number==0)                   //number 0 时候
LCD_write_char(x,y,'0');
else
{for(i=0;number>0;i++)
{
num[i]=display[number%10];//每位以字符表示
number/=10; 
}
for(j=0;j<i/2;j++){k=num[j];num[j]=num[i-1-j];num[i-1-j]=k;}
 LCD_write_str(x,y,num);
}
}
/*显示屏初始化函数*/
void LCD_init(void) 
{ 
 DDRC=0xFF;    /*方向输出*/
 PORTC=0xFF;    /*电平设置*/
 DDRA|=BIT(PA5)|BIT(PA6)|BIT(PA7); 
 LCD_write_com(0x3c);    /*显示模式设置*/  
 LCD_write_com(0x01);    //显示清屏 
 LCD_write_com(0x06);    //显示光标移动设置
 LCD_write_com(0x0C);    //显示开及光标设置
}
/********************************************************************/
/***************** FM_GTG_300A **************************************/


void FM_RS300A_WRITER( uint kFrequency )
{
    uchar	i;
    FM_CE_SET;                      //始能FM 接收数据
    FM_CLK_CLR; 
for ( i = 0; i < 16; i++ ) {          // 发送前11位为频率设置位 12位为音频模式 15位为供电模式
    if ( (kFrequency>> 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());
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -