#include<reg52.h> //1602液晶頻率表。這個用T2計時,采用16位自動重裝。
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define CHECK_BUSY
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^5;
bit flag;
char counter,counter2;
void DelayMs(uchar t)
{
int x,y;
for (x=t;x>0;x--)
for(y=110;y>0;y--);
}
bit LCD_Check_Busy(void)
{
#ifdef CHECK_BUSY
P0= 0xFF;
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
return (bit)(P0 & 0x80);
#else
return 0;
#endif
}
void write_Com(uchar com)
{
while(LCD_Check_Busy());
RS=0;
RW=0;
EN=1;
P0= com;
_nop_();
EN=0;
}
void write_dat(uchar dat)
{
while(LCD_Check_Busy());
RS=1;
RW=0;
EN=1;
P0= dat;
_nop_();
EN=0;
}
void LCD_Clear(void)
{
write_Com(0x01);
DelayMs(5);
}
void LCD_Write_Char(uchar x,uchar y,uchar dat)
{
if (y == 0)
{
write_Com(0x80 + x);
}
else
{
write_Com(0xC0 + x);
}
write_dat( dat);
}
void LCD_Write_String(uchar x,uchar y,uchar *s)
{
while (*s)
{
LCD_Write_Char(x,y,*s);
s ++;
x++;
}
}
void LCD_Init(void)
{
write_Com(0x38);
write_Com(0x06);
DelayMs(5);
write_Com(0x0C);
write_Com(0x01);
}
void timer2_init()
{
T2MOD=0X00;
TH2=(65536-110592/60)/256;
TL2=(65536-110592/60)%256;
RCAP2H=TH2;
RCAP2L=TL2;
EA=1;
ET2=1;
TR2=1;
}
void Init_Timer0(void)
{
TMOD=0x05;
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
main()
{
unsigned long int a;
char temp[16];
Init_Timer0();
timer2_init();
LCD_Init();
DelayMs(10);
LCD_Clear();
LCD_Write_String(0,0,"Frequency table");
while(1)
{
if(flag==1)
{flag=0;
a=counter*65536+TH0*256+TL0;
a*=10;
sprintf(temp,"FREQ:%08.0f Hz",(float)a);
LCD_Write_String(0,1,temp);
counter=0;
TR0=1;TR2=1;
TH0=0;
TL0=0;
}
}
}
void t0(void) interrupt 1 using 1
{
counter ++;
TH0=0;
TL0=0;
}
void t2(void) interrupt 5 using 2
{ TF2=0;
counter2++;
if(counter2==50)
{
TR0=0;TR2=0;
counter2=0;
TH2=(65536-110592/60)/256;
TL2=(65536-110592/60)%256;
flag=1;
}
}
|