📄 12.txt
字号:
7.1 程序清单
/************<B>头文件声明</B>***********************/
#include<absacc.h>
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/******************<B>液晶使能信号输入端及寄存器选择操作预定义</B>******************/
#define LCD_RS T0
#define LCD_E INT0
/***************<B>可位寻址特殊功能寄存器名定义</B>******************/
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;
/*************** <B>位及变量定义</B>*****************/
bit temp,key1_save,key2_save,key3_save,key4_save,keyon,keyoff;
uchar state,cursor_shift;
uchar cursor[5]={0,9,3,0,0};
uint t0count;
uint A_data,N_data;
uchar data_com,data_show;
uchar dat1,dat2,dat3,dat4,dat5;
uchar order[4]={0x38,0x01,0x06,0x0C};
uchar code data1[22]={0x4e,0x61,0x6e,0x68,0x75,0x61,0x55,0x6e,0x69,0x76,0x65,
0x72,0x73,0x69,0x74,0x79,0x53,0x65,0x74,0x46,0x4d,0x3a};
uchar code data2[22]={0x4e,0x61,0x6e,0x68,0x75,0x61,0x55,0x6e,0x69,0x76,0x65,
0x72,0x73,0x69,0x74,0x79,0x52,0x75,0x6e,0x46,0x4d,0x3a};
uchar i=0;
ulong FMdata,count_fm,temp1,FM_temp;
ulong k;
/****************<B>函数声明</B>******************/
get_A_N_data(long FMdata);
lcd_set_display(dat1,dat2,dat3,dat4,dat5,cursor_shift);
lcd_run_display(dat1,dat2,dat3,dat4,dat5);
/****************<B>延时子程序</B>*****************/
void delay(uint v)
{while(v!=0)v--;}
/****************<B>读键盘子程序</B>*********************/
read_key()
{keyon=0;
if(WR==0)
{key1_save=1;keyon=1;}
if(RD==0)
{key2_save=1;keyon=1;}
if(P2_1==0)
{key3_save=1;keyon=1;}
if(P2_0==0)
{key4_save=1;keyon=1;}
if(keyon==1)
{keyoff=1;}}
/***************<B>键盘处理子程序</B>***************/
key_process()
{while(keyoff)
{delay(100);
read_key();
if(keyon==0)
{keyoff=0;
if(key1_save==1)
{state=state+1;
if(state>=2) {state=0;}
key1_save=0;}
if(key2_save==1&&state==0)
{cursor_shift=cursor_shift+1;
if(cursor_shift>=12) {cursor_shift=6;}
key2_save=0;}
if(key3_save==1&&state==0)
{switch(cursor_shift)
{case 6:
cursor[0]=cursor[0]+1;
if(cursor[0]==2) cursor[0]=0;
break;
case 7:
cursor[1]=cursor[1]+1;
if(cursor[1]==10) cursor[1]=0;
break;
case 8:
cursor[2]=cursor[2]+1;
if(cursor[2]==10) cursor[2]=0;
break;
case 10:
cursor[3]=cursor[3]+1;
if(cursor[3]==10) cursor[3]=0;
break;
case 11:
cursor[4]=cursor[4]+1;
if(cursor[4]==10) cursor[4]=0;
break;}
key3_save=0;}
if(key4_save==1&&state==0)
{switch(cursor_shift)
{ case 6:
if(cursor[0]>0)
{cursor[0]=cursor[0]-1;}
else cursor[0]=1;
break;
case 7:
if(cursor[1]>0)
{cursor[1]=cursor[1]-1;}
else cursor[1]=9;
break;
case 8:
if(cursor[2]>0)
{cursor[2]=cursor[2]-1;}
else cursor[2]=9;
break;
case 10:
if(cursor[3]>0)
{cursor[3]=cursor[3]-1;}
else cursor[3]=9;
break;
case 11:
if(cursor[4]>0)
{cursor[4]=cursor[4]-1;}
else cursor[4]=9;
break; }
key4_save=0;}
if(state==0)
{lcd_set_display(cursor[0],cursor[1],cursor[2],cursor[3],cursor[4],cursor_shift);}}
FMdata=cursor[0]*10000+cursor[1]*1000+cursor[2]*100+cursor[3]*10+cursor[4]+2;}}
/***************<B>A</B><B>、N输出数据生成及输出程序</B>********************/
get_A_N_data(long FMdata)
{ N_data=FMdata/64;
A_data=FMdata%64;
ACC=N_data;
P0=ACC;
ACC=0;
ACC=A_data;
temp=ACC7;
ACC7=ACC0;
ACC0=temp;
temp=ACC6;
ACC6=ACC1;
ACC1=temp;
temp=ACC5;
ACC5=ACC2;
ACC2=temp;
temp=ACC4;
ACC4=ACC3;
ACC3=temp;
P2=ACC;
P2_1=1;
P2_0=1;}
/**************<B>液晶写指令程序</B>*****************/
write_com(uchar data_com)
{LCD_RS=0;
LCD_E=1;
P1=data_com;
delay(500);
LCD_E=0;}
/**************<B>液晶写数据程序</B>****************/
write_data(uchar data_show)
{LCD_RS=1;
LCD_E=1;
P1=data_show;
delay(500);
LCD_E=0;}
/***************<B>液晶初始化程序</B>*****************/
initial_lcd(void)
{write_com(order[0]);
write_com(order[1]);
write_com(order[2]);
write_com(order[3]);}
/***************<B>频率设置状态下液晶显示程序</B>*************/
lcd_set_display(dat1,dat2,dat3,dat4,dat5,cursor_shift)
(0x0D);
write_com(0x80);
for(i=0;i<16;i++)
write_data(data1[i]);
write_com(0xc0);
for(i=16;i<22;i++)
write_data(data1[i]);
write_data(dat1+0x30);
write_data(dat2+0x30);
write_data(dat3+0x30);
write_data(0x2E);
write_data(dat4+0x30);
write_data(dat5+0x30);
write_data(0x4D);
write_data(0x48);
write_data(0x7A);
write_com(0xC0+cursor_shift);}
/****************<B>运行状态下频率显示程序</B>***************/
lcd_run_display(dat1,dat2,dat3,dat4,dat5)
{ write_com(0x80);
for(i=0;i<16;i++)
write_data(data2[i]);
write_com(0xc0);
for(i=16;i<22;i++)
write_data(data2[i]);
write_data(dat1+0x30);
write_data(dat2+0x30);
write_data(dat3+0x30);
write_data(0x2E);
write_data(dat4+0x30);
write_data(dat5+0x30);
write_data(0x4D);
write_data(0x48);
write_data(0x7A); }
/*************************<B>主函数</B>****************************/
main()
{delay(2560);
TMOD=0x51;
TH0=0x4b; /* 定时器初值预置 */
TL0=0xff;
SCON=0x70;
TH1=0;
TL1=0;
t0count=0;
EA=1;
ET0=1;
TR0=1;
PT0=1;
ET1=1;
TR1=1;
initial_lcd();
FMdata=9302;
FM_temp=9302;
key1_save=0;
key2_save=0;
key3_save=0;
key4_save=0;
dat1=0x30+1;
dat2=0x30;
dat3=0x30+5;
dat4=0x30+3;
dat5=0x30+2;
keyon=0;
cursor_shift=6;
state=1;
get_A_N_data(FMdata);
k=416*N_data;
k=k/(65*N_data-A_data);
while(1)
{P2_0=1;
P2_1=1;
RD=1;
WR=1;
read_key();
key_process();
temp1=count_fm/2;
temp1=temp1*k;
temp1=temp1/10;
temp1=temp1-2;
dat1=temp1/10000;
temp1=temp1%10000;
dat2=temp1/1000;
temp1=temp1%1000;
dat3=temp1/100;
temp1=temp1%100;
dat4=temp1/10;
temp1=temp1%10;
dat5=temp1/1;
if(state==1)
{lcd_run_display(dat1,dat2,dat3,dat4,dat5);
if(FMdata!=FM_temp)
{ while((FMdata-FM_temp>15))
{ FM_temp=FM_temp+15;
get_A_N_data(FM_temp);
delay(10000); }
while((FM_temp-FMdata>6))
{ FM_temp=FM_temp-6;
get_A_N_data(FM_temp);
delay(10000); }
FM_temp=FMdata;
get_A_N_data(FM_temp);
k=416*N_data;
k=k/(65*N_data-A_data);} } } }
/*****************<B>定时器0</B><B>中断</B>*********************/
time0() interrupt 1 using 1
{ TH0=0x4b;
TL0=0xff;
t0count=t0count+1;
if(t0count==40)
{count_fm=TH1*256;
count_fm=count_fm+TL1;
TH1=0x0;
TL1=0x0;
t0count=0;} }
time1() interrupt 3 using 2
{TH1=0x0;
TL1=0x0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -