#include<reg51.h>/*51單片機頭文件*/
#include<absacc.h>
#include<stdio.h>
#define COM8253 XBYTE[0x0003]
#define COM0 XBYTE[0x0000]
#define COM1 XBYTE[0x0001]
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="Clock Speed:";
uchar code table1[]="range:";
uchar code table2[]=" gap:";
sbit icden=P3^0;
sbit rs=P3^1;/*1602使能icden和寫rs*/
sbit set=P2^0;
sbit wei=P2^1;
sbit wei1=P2^7;
sbit wei2=P2^5; /*set進入掃頻頻率設置窗口,wei掃頻初始頻率設置,wei1終值頻率窗口*/
sbit add=P2^2;
sbit red=P2^3; /*add數值增加,red數值減少,*/
sbit gap=P2^6;/*步長設置*/
sbit exit=P2^4;/*exit退出設定程序*/
sbit a1=P3^2;
sbit b1=P3^3;
sbit c1=P3^4;/*74151數據選擇器,ABC端口*/
uchar num=5,num1=5,num2=5,ad=0,ad1=0,gap1=0;/*num,num1用于設置光標位置,ad,ad1,gap1允許設置初始或終值頻率的標示符*/
uchar set1=0,set2=0,set3=0,set4=0,set5=0,set6=0;/*初始頻率各位的變量*/
uchar set11=0,set22=0,set33=0,set44=0,set55=0,set66=0;/*終值頻率各位的變量*/
uchar sett1=0,sett2=0,sett3=0,sett4=0,sett5=0,sett6=0;/*步長各位的變量*/
unsigned long low,high,n1,n2,n3;/*low、high分別存儲初始和終值頻率,n2存儲實時頻率,n3存儲步長,n1存放8253初值*/
int n=0;/*n每中斷一次加一,最大值50,即發生50次中斷n歸0,用于規定掃頻間隔時間。*/
unsigned long sw,wan,qian,bai,shi,ge;/*存儲從n2分離的各位,用于實時顯示頻率*/
uchar flag1,flag2,star=1;/*flag1、flag2用于確定使用定時器0還是定時器1。star允許頻率產生的標示符*/
unsigned long c,d;
uint a,b,e,f,h;
uchar cs=0,i,z;
void delay(uint z)/*延遲函數*/
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)/*1602寫入指令*/
{
rs=0;
P1=com;
delay(5);
icden=1;
delay(5);
icden=0;
}
void write_data(uchar date)/*1602寫入數據*/
{
rs=1;
P1=date;
delay(5);
icden=1;
delay(5);
icden=0;
}
void init()/*1602初始化*/
{
icden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x01);
}
void display()/*掃頻顯示界面*/
{
write_com(0x01);
write_com(0x80);
for(num=0;num<12;num++)
{
write_data(table[num]);
delay(5);
}
}
void display1(unsigned long n2)/*掃頻頻率顯示*/
{
if(star==1)
{
sw=n2/100000;
wan=n2/10000%10;
qian=n2/1000%10;
bai=n2/100%10;
shi=n2/10%10;
ge=n2%10;
write_com(0x80+0x40);
write_data(0x30+sw);
write_data(0x30+wan);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
}
void setlow(uint set1,set2,set3,set4,set5,set6,set11,set22,set33,set44,set55,set66)/*將鍵盤輸入的數據存入low、high中,確定flag1、flag2值*/
{
low=set1*100000+set2*10000+set3*1000+set4*100+set5*10+set6;
high=set11*100000+set22*10000+set33*1000+set44*100+set55*10+set66;
if(low<5000)
{flag1=1;}
else flag1=2;
if(high<5000)
{flag2=1;}
else flag2=2;
}
void keyscan()/*鍵盤掃描*/
{
if(set==0)/*進入設置界面*/
{
delay(10);
if(set==0)
{
write_com(0x01);
write_com(0x80);
for(num=0;num<6;num++)
{
write_data(table1[num]);
}
write_com(0x80+6);
write_data(0x30+set1);
write_data(0x30+set2);
write_data(0x30+set3);
write_data(0x30+set4);
write_data(0x30+set5);
write_data(0x30+set6);
write_com(0x80+12);
write_data('H');
write_data('Z');
write_com(0x80+0x40+5);
write_data(':');
write_com(0x80+0x40+6);
write_data(0x30+set11);
write_data(0x30+set22);
write_data(0x30+set33);
write_data(0x30+set44);
write_data(0x30+set55);
write_data(0x30+set66);
write_com(0x80+0x40+12);
write_data('H');
write_data('Z');
num=6;
write_com(0x80+6);
ad=1;/*ad=1,ad=0,標志只可進行初始頻率設置*/
ad1=0;
gap1=0;
star=0;
while(!set);
}
}
if(gap==0)/*對掃頻步長進行設定,初始為20HZ*/
{
delay(10);
if(gap==0)
{
write_com(0x01);
write_com(0x80);
for(num2=0;num2<6;num2++)
{write_data(table2[num2]);}
write_com(0x80+6);
write_data(0x30+sett1);
write_data(0x30+sett2);
write_data(0x30+sett3);
write_data(0x30+sett4);
write_data(0x30+sett5);
write_data(0x30+sett6);
write_com(0x80+12);
write_data('H');
write_data('Z');
num2=6;
write_com(0x80+6);
gap1=1;/*選位的同時,gap1置1,只可對步長進行設置*/
ad=0;
ad1=0;
star=0;
while(!gap);
}
}
if(wei==0)/*初始頻率進行位選,選擇要增加或減少的位置*/
{
delay(10);
if(wei==0)
{
num++;
if(num>11)
{num=6;}
write_com(0x80+num);
ad=1;/*選位的同時,ad置1,只可對初始頻率進行設置*/
ad1=0;
gap1=0;
star=0;
while(!wei);
}
}
if(wei1==0)/*終值頻率進行位選,選擇要增加或減少的數據位*/
{
delay(10);
if(wei1==0)
{
num1++;
if(num1>11)
{num1=6;}
write_com(0x80+0x40+num1);
ad1=1;/*選位的同時,ad1置1,只可對終值頻率進行設置*/
ad=0;
gap1=0;
star=0;
while(!wei1);
}
}
if(wei2==0)/*步長進行位選,選擇要增加或減少的數據位*/
{
delay(10);
if(wei2==0)
{
num2++;
if(num2>11)
{num2=6;}
write_com(0x80+num2);
gap1=1;/*選位的同時,gap1置1,只可步長進行設置*/
ad1=0;
ad=0;
star=0;
while(!wei2);
}
}
if(add==0)/*增加數值*/
{
delay(10);
if(add==0)
{
if(ad==1)/*掃頻初值增加*/
{
switch(num)/*由num值來確定設置哪個數據位*/
{
case 6:
set1++;
if(set1>9)
{set1=0;}
write_com(0x80+num);
write_data(0x30+set1);
write_com(0x80+num);
break;
case 7:
set2++;
if(set2>9)
{set2=0;}
write_com(0x80+num);
write_data(0x30+set2);
write_com(0x80+num);
break;
case 8:
set3++;
if(set3>9)
{set3=0;}
write_com(0x80+num);
write_data(0x30+set3);
write_com(0x80+num);
break;
case 9:
set4++;
if(set4>9)
{set4=0;}
write_com(0x80+num);
write_data(0x30+set4);
write_com(0x80+num);
break;
case 10:
set5++;
if(set5>9)
{set5=0;}
write_com(0x80+num);
write_data(0x30+set5);
write_com(0x80+num);
break;
case 11:
set6++;
if(set6>9)
{set6=0;}
write_com(0x80+num);
write_data(0x30+set6);
write_com(0x80+num);
break;
}
}
if(gap1==1)/*步長增加*/
{
switch(num2)/*由num2來確定增加哪個數據位*/
{
case 6:
if(sett1==9)
{sett1=0;}
else sett1++;
write_com(0x80+num2);
write_data(0x30+sett1);
write_com(0x80+num2);
break;
case 7:
if(sett2==9)
{sett2=0;}
else sett2++;
write_com(0x80+num2);
write_data(0x30+sett2);
write_com(0x80+num2);
break;
case 8:
if(sett3==9)
{sett3=0;}
else sett3++;
write_com(0x80+num2);
write_data(0x30+sett3);
write_com(0x80+num2);
break;
case 9:
if(sett4==9)
{sett4=0;}
else sett4++;
write_com(0x80+num2);
write_data(0x30+sett4);
write_com(0x80+num2);
break;
case 10:
if(sett5==9)
{sett5=0;}
else sett5++;
write_com(0x80+num2);
write_data(0x30+sett5);
write_com(0x80+num2);
break;
case 11:
if(sett6==9)
{sett6=0;}
else sett6++;
write_com(0x80+num2);
write_data(0x30+sett6);
write_com(0x80+num2);
break;
}
}
if(ad1==1)/*終值頻率增加*/
{
switch(num1)/*由num1確定增加的位置*/
{
case 6:
if(set11>=9)
{set11=0;}
else set11++;
write_com(0x80+0x40+num1);
write_data(0x30+set11);
write_com(0x80+0x40+num1);
break;
case 7:
if(set22>=9)
{set22=0;}
else set22++;
write_com(0x80+0x40+num1);
write_data(0x30+set22);
write_com(0x80+0x40+num1);
break;
case 8:
if(set33>=9)
{set33=0;}
else set33++;
write_com(0x80+0x40+num1);
write_data(0x30+set33);
write_com(0x80+0x40+num1);
break;
case 9:
if(set44>=9)
{set44=0;}
else set44++;
write_com(0x80+0x40+num1);
write_data(0x30+set44);
write_com(0x80+0x40+num1);
break;
case 10:
if(set55>=9)
{set55=0;}
else set55++;
write_com(0x80+0x40+num1);
write_data(0x30+set55);
write_com(0x80+0x40+num1);
break;
case 11:
if(set66>=9)
{set66=0;}
else set66++;
write_com(0x80+0x40+num1);
write_data(0x30+set66);
write_com(0x80+0x40+num1);
break;
}
}
star=0;
while(!add);
}
}
if(red==0)/*對數據進行減操作*/
{
delay(10);
if(red==0)
{
if(ad==1)/*初始頻率減少*/
{
switch(num)
{
case 6:
if(set1==0)
{set1=9;}
else set1--;
write_com(0x80+num);
write_data(0x30+set1);
write_com(0x80+num);
break;
case 7:
if(set2==0)
{set2=9;}
else set2--;
write_com(0x80+num);
write_data(0x30+set2);
write_com(0x80+num);
break;
case 8:
if(set3==0)
{set3=9;}
else set3--;
write_com(0x80+num);
write_data(0x30+set3);
write_com(0x80+num);
break;
case 9:
if(set4==0) |