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

📄 calcfreq.c

📁 基于WINCE的FM发射程序
💻 C
字号:
#include "calcfreq.h"

char calc_pll(unsigned char* p_pll1, unsigned char* p_pll2, unsigned char freq1, unsigned char freq2 )
{
	unsigned char freq[2];								//	input frequency
	unsigned char dat[8];								//	low 4bit valid data
	unsigned char plus[4];								//	data[8] -> plus[4]
	unsigned char pll[2];								//	pll register
	unsigned char is_plus;								//	carry value
	//----	input
	freq[0] = freq1;
	freq[1] = freq2;

	//----	
	//----	((N1<<16) + (N1<<15) + (N1<<10) + (N1<<9) + (N1<<7) + (N1<<5));		//N*100000	N*0x000186A0
	//----	((N<<19) + (N<<18) + (N<<17) + (N<<16) + (N<<14) + (N<<9) + (N<<6));	//N*1000000	N*0x000F4240
	//----	

	//----	freq[0]<<6
	dat[0] =	0;
	dat[1] =	(freq[0]<<2) & 0x0C;
	dat[2] =	(freq[0]>>2) & 0x0F;
	dat[3] =	(freq[0]>>6) & 0x03;

	//----	freq[0]<<9
	dat[2] +=	(freq[0]<<1) & 0x0E;
	dat[3] +=	(freq[0]>>3) & 0x0F;
	dat[4] =	(freq[0]>>7) & 0x01;

	//----	freq[0]<<14
	dat[3] +=	(freq[0]<<2) & 0x0C;
	dat[4] +=	(freq[0]>>2) & 0x0F;
	dat[5] =	(freq[0]>>6) & 0x03;

	//----	freq[0]<<16
	dat[4] +=	(freq[0]) & 0x0F;
	dat[5] +=	(freq[0]>>4) & 0x0F;

	//----	freq[0]<<17
	dat[4] +=	(freq[0]<<1) & 0x0E;
	dat[5] +=	(freq[0]>>3) & 0x0F;
	dat[6] =	(freq[0]>>7) & 0x01;

	//----	freq[0]<<18
	dat[4] +=	(freq[0]<<2) & 0x0C;
	dat[5] +=	(freq[0]>>2) & 0x0F;
	dat[6] +=	(freq[0]>>6) & 0x03;

	//----	freq[0]<<19
	dat[4] +=	(freq[0]<<3) & 0x08;
	dat[5] +=	(freq[0]>>1) & 0x0F;
	dat[6] +=	(freq[0]>>5) & 0x07;

	//----	freq[1]<<5
	dat[1] +=	(freq[1]<<1) & 0x0E;
	dat[2] +=	(freq[1]>>3) & 0x0F;
	dat[3] +=	(freq[1]>>7) & 0x01;

	//----	freq[1]<<7
	dat[1] +=	(freq[1]<<3) & 0x08;
	dat[2] +=	(freq[1]>>1) & 0x0F;
	dat[3] +=	(freq[1]>>5) & 0x07;

	//----	freq[1]<<9
	dat[2] +=	(freq[1]<<1) & 0x0E;
	dat[3] +=	(freq[1]>>3) & 0x0F;
	dat[4] +=	(freq[1]>>7) & 0x01;

	//----	freq[1]<<10
	dat[2] +=	(freq[1]<<2) & 0x0C;
	dat[3] +=	(freq[1]>>2) & 0x0F;
	dat[4] +=	(freq[1]>>6) & 0x03;

	//----	freq[1]<<15
	dat[3] +=	(freq[1]<<3) & 0x08;
	dat[4] +=	(freq[1]>>1) & 0x0F;
	dat[5] +=	(freq[1]>>5) & 0x07;

	//----	freq[1]<<16
	dat[4] +=	(freq[1]) & 0x0F;
	dat[5] +=	(freq[1]>>4) & 0x0F;

	//----
	//----	0x0004E380 plus
	//----	304kHz     + Half-adjust  plus value
	//----	0x0004A380 + 0x00004000 = 0x0004E380
	//----
	dat[0] +=	0x00;
	dat[1] +=	0x08;
	dat[2] +=	0x03;
	dat[3] +=	0x0E;
	dat[4] +=	0x04;
	dat[5] +=	0x00;
	dat[6] +=	0x00;
	dat[7] =	0x00;

	//----
	//----	Carry adjustment & 4bit-8bit conversion
	//----	data[8] 7777 6666 5555 4444 3333 2222 1111 0000
	//----	           ||       ||       ||       ||
	//----	temp[4] 77776666 55554444 33332222 11110000
	//----

	plus[0] =	(dat[1]<<4) + (dat[0]);
	is_plus	=	(plus[0] < dat[0]) ? 1 : 0;
	plus[1] =	(dat[3]<<4) + (dat[2]) + (dat[1]>>4) + is_plus;
	is_plus	=	(plus[1] < (dat[2] +(dat[1]>>4))) ? 1 : 0;
	plus[2] =	(dat[5]<<4) + (dat[4]) + (dat[3]>>4) + is_plus;
	is_plus	=	(plus[2] < (dat[4] +(dat[3]>>4))) ? 1 : 0;
	plus[3] =	(dat[7]<<4) + (dat[6]) + (dat[5]>>4) + is_plus;


	//----	n>>15 = n/32768
//	pll[0] = ((plus[1]>>7) & 0x01) | ((plus[2]<<1) & 0xFE);
//	pll[1] = ((plus[2]>>7) & 0x01) | ((plus[3]<<1) & 0xFE);

	//----	n>>13 = n/8192
	pll[0] = ((plus[1]>>5) & 0x07) | ((plus[2]<<3) & 0xF8);
	pll[1] = ((plus[2]>>5) & 0x07) | ((plus[3]<<3) & 0xF8);


	*p_pll1 = pll[0];
	*p_pll2 = pll[1];


	//----	
	dat[3] -=	0x04;
	
	plus[0] =	(dat[1]<<4) + (dat[0]);
	is_plus	=	(plus[0] < dat[1]) ? 1 : 0;
	plus[1] =	(dat[3]<<4) + (dat[2]) + (dat[1]>>4) + is_plus;
	is_plus	=	(plus[1] < dat[3]) ? 1 : 0;
	plus[2] =	(dat[5]<<4) + (dat[4]) + (dat[3]>>4) + is_plus;
	is_plus	=	(plus[2] < dat[5]) ? 1 : 0;
	plus[3] =	(dat[7]<<4) + (dat[6]) + (dat[5]>>4) + is_plus;
	return 1;
}

⌨️ 快捷键说明

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