📄 fm80110.c
字号:
#include <BasType.h>
#include <FM80110.h>
#include <RegDefs.h>
#include <intrins.h>
#include <TM1616.h>
#define FM80110_Delay() _nop_();_nop_();_nop_();_nop_();_nop_()
FLAG flag;
UINT8 CurFreq_Low,CurFreq_high;
//UINT16 g_CurFreq=8900;
//*****************寄存器设置*************************//
#define Register0 0x14
#define Register1 0x15
#define Register2 0x16
#define Register3 0x17
#define Register4 0x18
#define Register5 0x19
#define Register6 0x1A
#define Reg2_Data 0x00
#define Reg3_Data 0xCC
#define Reg4_Data 0x01 //静音关闭
#define Reg4_Data_mute 0x21 //静音打开
#define Reg5_Data 0x00
/**
MCU写FM80110模式下,写寄存器地址
**/
void FM80110_SPI_Write_adr(UINT8 Address_val){
UINT8 i;
FM80110_Data_in();//把DATA口设置为输入
for(i=0;i<8;i++)
{
FM80110_clk0();
if(Address_val & 0x80)
{
FM80110_da1();
}
else
{
FM80110_da0();
}
FM80110_Delay();
FM80110_clk1();
FM80110_Delay();
if(i==2)
{
FM80110_Delay();
FM80110_clk0();
FM80110_da0();// 写数据入FM80110的时候4和5位之间为0
FM80110_Delay();
FM80110_clk1();
FM80110_Delay();
}
Address_val <<=1;
}
}
/**
MCU读FM80110模式下,写入寄存器地址
**/
void FM80110_SPI_Reads_adr(UINT8 Address_val){
UINT8 i;
FM80110_Data_in();//把DATA口设置为输出
for(i=0;i<8;i++)
{
FM80110_clk0();
if(Address_val & 0x80)
{
FM80110_da1();
}
else
{
FM80110_da0();
}
FM80110_Delay();
FM80110_clk1();
FM80110_Delay();
if(i==2)
{
FM80110_clk0();
FM80110_da1();// 写数据入FM80110的时候4和5位之间为1
FM80110_Delay();
FM80110_clk1();
FM80110_Delay();
}
Address_val <<=1;
}
}
/**
MCU写FM80110一个字节
**/
void FM80110_SPI_Write_1bitdata(UINT8 Data_val){
UINT8 i;
for(i=0;i<8;i++)
{
FM80110_clk0();
if(Data_val & 0x80)
{
FM80110_da1();
}
else
{
FM80110_da0();
}
FM80110_Delay();
FM80110_clk1();
FM80110_Delay();
Data_val <<=1;
}
}
/**
MCU读FM80110一个字节
**/
UINT8 FM80110_SPI_Reads_1bitdata(){
UINT8 i;
UINT8 Data_val;
for(i=0;i<8;i++)
{
FM80110_clk1();
if(FM80110_teat_data)
Data_val |=0x01;
FM80110_Delay();
FM80110_clk0();
if(i==7)
{
FM80110_en1();//
}
Data_val<<=1;
FM80110_Delay();
}
return Data_val;
}
/**
写一个寄存器
adr:寄存器地址
data_temp:写入寄存器数据
**/
void Write_one_register(UINT8 adr,UINT8 data_temp){
// FM80110_en0();
//FM80110_clk1();
FM80110_SPI_Write_adr(adr);
FM80110_SPI_Write_1bitdata(data_temp);
FM80110_clk0();
//FM80110_da0();
FM80110_en1();
FM80110_Delay();
FM80110_clk1();
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
FM80110_clk0();
FM80110_Delay();
FM80110_Delay();
FM80110_en0();
}
/**
读一个寄存器的数据
adr:寄存器地址
返回寄存器中的数据
**/
UINT8 Read_one_register(UINT8 adr){
UINT8 temp_val;
FM80110_en0();
FM80110_clk0();
FM80110_SPI_Reads_adr(adr);
FM80110_Data_out();//把DATA口设置为输入
FM80110_clk0();
FM80110_Delay();
temp_val=FM80110_SPI_Reads_1bitdata();
FM80110_clk1();
FM80110_Delay();
FM80110_clk0();
return temp_val;
}
/**
初始化FM80110
**/
void FM80110_Init(void){
FM80110_Data_in();
FM80110_clk1();
FM80110_en1();
FM80110_da1();
SetCurFreq(8900);
Write_one_register(Register2, Reg2_Data);
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
Write_one_register(Register3, Reg3_Data);
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
Write_one_register(Register4, Reg4_Data);
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
Write_one_register(Register5, Reg5_Data);
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
SetCurFreq(8900);
}
/**
设置写入寄存器的频率值
入口参数为:要设置的参数
**/
void SetCurFreq(UINT16 Freq_out){
UINT16 CurFreq;
CurFreq=Freq_out/Freq_ref;
CurFreq_Low=CurFreq & 0xFF;
CurFreq >>=8;
CurFreq_high=CurFreq & 0xFF;
Write_one_register(Register0, CurFreq_high);
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
Write_one_register(Register1, CurFreq_Low);
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
FM80110_Delay();
flag.CurFreq=Freq_out;
Display_Freq(Freq_out);
}
/**
改变频率
**/
void ChangeCurFreq(bit Direct){
FM80110_Mute(1);
if(Direct)
{
flag.CurFreq +=Freq_Step;
}
else
{
flag.CurFreq -=Freq_Step;
}
if(flag.CurFreq>Frequency_max)
{
flag.CurFreq=Frequency_min;
}
if(flag.CurFreq<Frequency_min)
{
flag.CurFreq=Frequency_max;
}
SetCurFreq(flag.CurFreq);
FM80110_Mute(0);
}
void delay_us (UINT8 i)
{
while (--i);
return ;
}
/*=============================
== 函数名称:delay_ms()
== 函数功能:ms delay process.
==入口参数: INT16U time
==出口参数:
==============================*/
void delay_ms (UINT8 time)
{
unsigned int Temptime = time * 2;
while (Temptime != 0)
{
delay_us(236);
Temptime--;
}
}
/**
功能:版本1:只在三个频点上选择
**/
void SetFreq(bit Direct){
if(Direct)
{
flag.CurFreq +=100;
}
else
{
flag.CurFreq -=100;
}
if(flag.CurFreq>9100)
{
flag.CurFreq=8900;
}
if(flag.CurFreq<8900)
{
flag.CurFreq=9100;
}
SetCurFreq(flag.CurFreq);
}
/**
功能:开关静音
**/
void FM80110_Mute(bit mute_temp){
if(mute_temp)
{
Write_one_register(Register4, Reg4_Data_mute);
}
if(mute_temp==0)
{
Write_one_register(Register4, Reg4_Data);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -