📄 pic_tea5767.c
字号:
#include <pic.h>
#define portbit(add,bits) ((unsigned)(&add) * 8 + (bits))
#define BUSY 0x80
#define WRITE_DATA 0xff
#define delay_data 0xff
#define COMMAND 0x00
#define LCD_CLEAR 0x01
#define max_freq 108000
#define min_freq 87500
#define portdata PORTB
#define sla_address 0xc0
volatile bit E @ portbit(PORTD,7);
volatile bit RW @ portbit(PORTD,6);
volatile bit RS @ portbit(PORTD,5);
volatile unsigned char tea5767_write_data[5] = {0x29,0xc2,0x20,0x11,0x00};
volatile unsigned char tea5767_read_data[5];
volatile unsigned int pll;
volatile unsigned long frequency;
void delay(unsigned int delay_time)
{
unsigned char i;
while (delay_time--)
{
for (i = 0; i <0xff; i ++)
{
}
}
}
unsigned char lcd_busy(void)
{
unsigned char temp;
portdata = 0xff;
RS = 0;
RW = 1;
E = 1;
TRISB = 0xff;
temp = portdata;
TRISB = 0x00;
E = 0;
return (temp);
}
void lcd_command_writedata(unsigned char check,unsigned char data)
{
switch (check)
{
case COMMAND:
{
RS = 0;
}
break;
case WRITE_DATA:
{
RS = 1;
}
break;
default: break;
}
RW = 0;
portdata = data;
E = 1;
E = 0;
while (lcd_busy() & BUSY);
}
void lcd_disp(unsigned char adr,unsigned char disp_data)
{
lcd_command_writedata(COMMAND,adr);
lcd_command_writedata(WRITE_DATA,disp_data);
}
void lcd_init(void)
{
lcd_command_writedata(COMMAND,LCD_CLEAR);
lcd_command_writedata(COMMAND,0x38);
lcd_command_writedata(COMMAND,0x0e);
lcd_command_writedata(COMMAND,0x06);
}
void system_init(void)
{
INTCON = 0x00;
OPTION = 0x80;
TRISB = 0x00;
TRISD = 0x00;
}
void send_init(void)
{
INTCON = 0x00;
SSPSTAT = 0x00;
SSPCON = 0x00;
SSPCON2 = 0x00;
TRISC3 = 1;
TRISC4 = 1;
SSPIF = 0;
SSPIE = 0;
SSPSTAT = 0x40;
SSPCON = 0x08;
SSPCON2 = 0x00;
SSPADD = 0x04;
SSPEN = 1;
}
void get_frequency(void)
{
unsigned char hlsi;
double npll=0;
npll = (double)pll;
hlsi = tea5767_write_data[2] & 0x10;
if (hlsi)
frequency =(unsigned long)((double)(npll) * (double)8.192 - 225);
else
frequency = (unsigned long)((double)(npll) * (double)8.192 + 225);
}
void get_pll(void)
{
unsigned char hlsi;
hlsi = tea5767_write_data[2] & 0x10;
if (hlsi)
pll = (unsigned int)((double)((frequency + 225) * 4) / (double)32.768);
else
pll = (unsigned int)((double)((frequency - 225) * 4)/ (double)32.768);
}
void radio_write(void)
{
unsigned char i;
send_init();
SEN = 1;
for( i = 2; --i;);
while (!SSPIF);
SSPIF = 0;
SSPBUF = sla_address;
while (!SSPIF);
SSPIF = 0;
for (i = 0; i < 5; i ++)
{
SSPBUF = tea5767_write_data[i];
while (!SSPIF);
SSPIF = 0;
}
PEN = 1;
while (!SSPIF);
SSPIF = 0;
SSPEN = 0;
}
void radio_read(void)
{
unsigned char i;
unsigned char temp_h,temp_l;
pll = 0;
send_init();
SEN = 1;
for( i = 2; --i;);
while (!SSPIF);
SSPIF = 0;
SSPBUF = sla_address + 1;
while (!SSPIF);
SSPIF = 0;
RCEN = 1;
for (i = 0; i < 4; i ++)
{
while (!SSPIF);
SSPIF = 0;
tea5767_read_data[i] = SSPBUF;
ACKDT = 0;
ACKEN = 1;
while (!SSPIF);
SSPIF = 0;
RCEN = 1;
}
while (!SSPIF);
SSPIF = 0;
tea5767_read_data[4] = SSPBUF;
ACKDT = 1;
ACKEN = 1;
while (!SSPIF);
SSPIF = 0;
PEN = 1;
while (!SSPIF);
SSPIF = 0;
temp_l = tea5767_read_data[1];
temp_h = tea5767_read_data[0];
temp_h &= 0x3f;
pll = (temp_h << 8 | temp_l);
get_frequency();
}
void search(unsigned char find)
{
radio_read();
switch (find)
{
case 0x00:
{
frequency += 100;
if(frequency > max_freq)
{
frequency = min_freq;
}
}
break;
case 0xff:
{
frequency -= 100;
if(frequency < min_freq)
{
frequency = max_freq;
}
}
break;
default :break;
}
get_pll();
tea5767_write_data[0] = pll / 256;
tea5767_write_data[1] = pll % 256;
tea5767_write_data[2] = 0x20;
tea5767_write_data[3] = 0x11;
tea5767_write_data[4] = 0x00;
radio_write();
}
void auto_search(unsigned char mode)
{
radio_read();
get_pll();
switch(mode)
{
case 0x00:
{
tea5767_write_data[2] = 0xa0;
}
break;
case 0xff:
{
tea5767_write_data[2] = 0x20;
}
break;
default :break;
}
tea5767_write_data[0] = pll / 256 + 0x40;
tea5767_write_data[1] = pll % 256;
tea5767_write_data[3] = 0x11;
tea5767_write_data[4] = 0x00;
radio_write();
radio_read();
while((tea5767_read_data[0] & 0x80) != 0x80)
{
radio_read();
}
}
void main(void)
{
unsigned char i;
delay(2);
system_init();
lcd_init();
radio_write();
delay(10);
radio_read();
for (i = 0; i < 5; i ++)
{
lcd_disp(0x85 + i,(tea5767_read_data[i] & 0x0f) + 0x30);
}
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -