?? 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 + -