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

📄 main.c

📁 基于飞利浦915控制FM发射模块和显示驱动原代码.
💻 C
字号:
#include "reg915.h"
#include "system.h"
#include "LPC915_I2C.H"
#include "lcd412function.h"

//global value-----------------------------------------------------------------------------
unsigned int	current_freq=800;		//发射频率缓存
unsigned char	value=0;				//AD转换值
//bit data state=0;
bit data silence=0;
unsigned char	data NumDcbLib[12][3]=	//LCD表
					{{6,5,6},//0-	0
					 {0,0,6},//1-	1
					 {4,7,2},//2-	2
					 {0,7,6},//3-	3
					 {2,2,6},//4-	4
					 {2,7,4},//5-	5
					 {6,7,4},//6-	6
					 {0,1,6},//7-	7
					 {6,7,6},//8-	8
					 {2,7,6},//9-	9
					 {0,0,0},//10-	NULL
					 {6,3,0}//12-	F
					 };
unsigned char	data LCD_AllComsTemp[13]=	//LCD显示缓存,初始值ON
					{				
                    0,0,0,
					6,5,6,
					6,1,6,//6,7,7,
					0,0,0,//1,0,1,
					0
					};
//初始化---------------------------------------------------------------------------------
void system_init1()
{
   	P0M1     =0x34; 
   	P0M2     =0x00;
    P1M1     =0x2F;
	P1M2     =0X1C;
	power_on	=0;
}
void FM_INIT()
{
  ISendByte(0X00,0X20);
  ISendByte(0X01,0X03);
  ISendByte(0X02,0X00);
  ISendByte(0X03,0X00);
}
//延时?clks-------------------------------------------------------------------------------
void delay(int clks)
{
int i;
for(i=0;i<clks;i++);
}
//延时?ms---------------------------------------------------------------------------------
void Delay_ms(int multiple)
{
int i=0,j=0;
for(j=0;j<multiple;j++)
	{
    for(i=0;i<700;i++);
    }
}
//将频率转化为显示缓存---------------------------------------------------------------------
void recalculate_LcdAllComs()
{	
	char num=0;	
	value=AD1val();
	if(current_freq >= 1000)
		{
		num = current_freq / 1000;
		LCD_AllComsTemp[0] = NumDcbLib[num][0];
		LCD_AllComsTemp[1] = NumDcbLib[num][1];
		LCD_AllComsTemp[2] = NumDcbLib[num][2];
		
		}
	else
		{
		LCD_AllComsTemp[0] = NumDcbLib[10][0];
		LCD_AllComsTemp[1] = NumDcbLib[10][1];
		LCD_AllComsTemp[2] = NumDcbLib[10][2];
		}

	num = (current_freq % 1000) / 100;
	LCD_AllComsTemp[3] = NumDcbLib[num][0];
	LCD_AllComsTemp[4] = NumDcbLib[num][1];
	LCD_AllComsTemp[5] = NumDcbLib[num][2];

	num = (current_freq % 100) / 10;
	LCD_AllComsTemp[6] = NumDcbLib[num][0];
	LCD_AllComsTemp[7] = NumDcbLib[num][1];
	LCD_AllComsTemp[8] = NumDcbLib[num][2]| 0x01;

    num = current_freq % 10;
	LCD_AllComsTemp[9] = NumDcbLib[num][0];//| 0x01;
	LCD_AllComsTemp[10] = NumDcbLib[num][1];
	LCD_AllComsTemp[11] = NumDcbLib[num][2]| 0x01;
	if(value>VFULL)	
	{
		LCD_AllComsTemp[9] |= 0x01;
		LCD_AllComsTemp[12] = 0x07;
    }
    else if(value>VMIDDLE)
	{
		LCD_AllComsTemp[9] |= 0x01;
		LCD_AllComsTemp[12] = 0x05;
    }
	else if(value>VEMPTY)
	{
		LCD_AllComsTemp[9] |= 0x01;
		LCD_AllComsTemp[12] = 0x01;
    }
    else if(value>VL_ALARM)
    {
		LCD_AllComsTemp[12] = 0x01;
	}
}
//发送显示缓存至LCD显示---------------------------------------------------------------------
void LCD_Refrush()
{
	int i;
	LCD_WriteStart();
	LCD_Write(LCD_DATAWRITE,9,0x001);		//传送写命令代码101和6位起始地址000000
	for(i=0; i<LCD_SEGMENT_COUNT; i++ )		//传送显示数据
	{
		LCD_Write(LCD_AllComsTemp[i],LCD_DATA_BITS,0x01);
	}
LCD_WriteEnd();
}
//FM发射模块静音开关------------------------------------------------------------------------
void FM_ON_OFF()
{
	if(silence==1)				//MUTE Disable
	{
		ISendByte(0X02,0X05);
		silence=1;
	}
	if(silence==0) 				//MUTE Enable
	{
		ISendByte(0X02,0X0D);
		silence=0;
	}
}
//转换频率数据并写入发射模块-----------------------------------------------------------------
void FM_Changer()
{   
    unsigned char fre;
	fre=(unsigned char)((current_freq)&(0x00ff));
    ISendByte(0x00,fre);
	fre=(unsigned char)((current_freq>>8)&(0x0007));
    fre=(fre|0x78);
    ISendByte(0x01,fre);
}
//按键判断及按键操作--------------------------------------------------------------------------
void key_process()
{
	int count=0;
	switch((P0&0x30)|(P1&0x03))
		{
		case	0x31:		//play
				for(count=0;(power_switch==0);count++)
				{	Delay_ms(1);
					if(count>1200)		//长按关机
					{
						FlashSave();
						LCD_AllComsTemp[0]=6;  LCD_AllComsTemp[1]=5;  LCD_AllComsTemp[2]=6;
						LCD_AllComsTemp[3]=6;  LCD_AllComsTemp[4]=3;  LCD_AllComsTemp[5]=0;
						LCD_AllComsTemp[6]=6;  LCD_AllComsTemp[7]=3;  LCD_AllComsTemp[8]=0;
						LCD_AllComsTemp[9]=0;  LCD_AllComsTemp[10]=0; LCD_AllComsTemp[11]=0;
						LCD_AllComsTemp[12]=0;
						LCD_Refrush();	//显示OFF
						Delay_ms(300);
						power_on=0;
					}
				}
				if(count<=1200 && count>20)
				break;
		case	0x32:		//FM_set
				Delay_ms(10);
				if(F_set==0)
				{					
					FM_ON_OFF();
				}
				break;
		case	0x23:		//F+
				while(F_increase==0)
				{	count++;
					current_freq++;
					if(current_freq>MAX_FREQ)
						current_freq=MIN_FREQ;
					recalculate_LcdAllComs();
					LCD_Refrush();
					Delay_ms(300);
					}
				if(count>4)
				{	
					while(((P0&0x30)|(P1&0x03))==NO_PRESS)
					{
						current_freq++;
						if(current_freq>MAX_FREQ)
							current_freq=MIN_FREQ;
						Delay_ms(100);
						recalculate_LcdAllComs();
						LCD_Refrush();
					}
				}
				FM_Changer();
				break;
		case	0x13:		//F-
				while(F_decrease==0)	//短按
				{	
					count++;
					current_freq--;
					if(current_freq<MIN_FREQ)
						current_freq=MAX_FREQ;
					recalculate_LcdAllComs();
					LCD_Refrush();
					Delay_ms(300);
				}
				if(count>4)
				{	
					while(((P0&0x30)|(P1&0x03))==NO_PRESS)
					{
						current_freq--;
						if(current_freq<MIN_FREQ)
						current_freq=MAX_FREQ;
						Delay_ms(100);
						recalculate_LcdAllComs();
						LCD_Refrush();
					}
				}
				FM_Changer();
				break;
		default:	break;
		}
}
//保存数据到 Flash 代码区------------------------------------------------------------------ 
void FlashSave() 
{
	unsigned char    Load_H; 
	unsigned char    Load_L; 
	Load_L=(char)current_freq;		//取数据低8位
	Load_H=(char)(current_freq>>8);	//取数据高8位
	do 
	{ 
		FMCON=0x00;			//装载数据指令 
		FMADRH=0x07; 		//装载起始地址 
		FMADRL=0xF0;		//装载结束地址 
		FMDATA=Load_H;		//装载数据,地址自增 1 
		FMDATA=Load_L;		//装载数据,地址自增 1 
		FMCON=0x68;			//擦除编程操作 
	}while((FMCON&0x0F)!=0);	//等待编程操作完成 
} 
//读取存储在 FLash 空间的变量--------------------------------------------------------------
void  FlashLoad() 
{ 
	unsigned int  code *readp;		//定义读数据指针 
	readp = 0x07F0;			//设置指针地址FMADRH 0x07  FMADRL 0xF0
	current_freq=*readp;	//将读取的值附给current_freq
} 

//主函数------------------------------------------------------------------------------------
main()
{
	//初始化--------------------------------------------------------------------------------
	int i=0;
	system_init1();
	FM_INIT();
	Delay_ms(10);
	//开机程序------------------------------------------------------------------------------
	for(i=0;(power_switch==0);i++)
	{	
		Delay_ms(1);
		if(i>=1000)
		{
			LCD_Init();
			LCD_Refrush();
			power_on=1;
			Delay_ms(500);
		}
	}
	FlashLoad();//加载上次正常关机时频率
	if((current_freq>1080)||(current_freq<760))current_freq=800;
	FM_Changer();
	//按键扫描------------------------------------------------------------------------------
	while(1)
	{
		key_process();
		Delay_ms(50);
		recalculate_LcdAllComs();
		LCD_Refrush();
		Delay_ms(50);
	}
}
//中断----------------------------------------------------------------------------------------
/*T1_Interrupt()  interrupt 5
{
	TF1 = 0;
	TR1 = 0;

    TR1 = 1;

}     */

⌨️ 快捷键说明

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