📄 main.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 + -