📄 fm_gtg602_rs300.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 + -