#include <reg52.h>
//#include "LCD1602.h"
#define DataPort P2
#define uchar unsigned char
#define uint unsigned int
sbit RS=P1^3;
sbit RW=P1^4;
sbit EN=P1^5;
uchar i=0;
uchar code meun[2][16]={" hz:is F"," s:is T"};
uchar code m[10]="0123456789";
uchar code n[10]="0123456789";
uchar cc[]=".";
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned int x,y,t;
LCD_EN;
void delay_ms(uchar t)
{
unsigned char i=0;
while(t--)for(i=0;i<120;i++);
}
void WriteData(uchar dat)
{ delay_ms(2);
EN=0;
EN=0;
EN=0;
RS=0;
delay_ms(2);
RS=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RW=0;
RS=1;
RS=1;
RW=0;
delay_ms(2);
EN=1;
EN=1;
DataPort=dat;
EN=0;
RS=0;
RW=0;
for (i=0;i<20;i++);
}
void WriteCmd(uchar cmd)
{ delay_ms(2);
EN=0;
EN=0;
RS=0;
RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
delay_ms(2);
EN=1;
EN=1;
DataPort=cmd;
RS=0;
RS=0;
RW=0;
delay_ms(2);
EN=0;
EN=0;
for (i=0;i<20;i++);
}
void DisChar(uchar ps,uchar dat)
{
WriteCmd((0x80+ps));
WriteData(dat);
}
void LcdInit(void)
{
char pp=0;
WriteCmd(0x38);
delay_ms(5);
WriteCmd(0x38);
delay_ms(5);
WriteCmd(0x38);
delay_ms(5);
WriteCmd(0x01);
delay_ms(5);
WriteCmd(0x06);
WriteCmd(0x38);
WriteCmd(0x0c);
WriteCmd(0x40);
for(pp=0;pp<16;pp++)DisChar(pp,*(meun[0]+pp));
for(pp=0;pp<16;pp++)DisChar(pp+0x40,*(meun[1]+pp));
delay_ms(2);
}
void Display(unsigned int x)
{
DisChar(7,m[(x)%10]);
DisChar(6,m[(x/10)%10]);
DisChar(5,m[(x/100)%10]);
DisChar(4,m[(x/1000)%10]);
DisChar(3,m[(x/10000)%10]);
DisChar(2,m[(x/100000)%10]);
DisChar(1,m[(x/1000000)%10]);
DisChar(0,m[(x/10000000)%10]);
delay_ms(10);
}
void Display2(unsigned int t)
{
DisChar(7+0x40,m[(t)%10]);
DisChar(6+0x40,m[(t/10)%10]);
DisChar(5+0x40,m[(t/100)%10]);
DisChar(4+0x40,m[(t/1000)%10]);
DisChar(3+0x40,m[(t/10000)%10]);
DisChar(2+0x40,m[(t/100000)%10]);
DisChar(1+0x40,cc[0]);
DisChar(0+0x40,m[0]);
delay_ms(10);
}
void Displays(unsigned int x)
{
DisChar(7,m[0]);
DisChar(6,m[0]);
DisChar(5,m[(x)%10]);
DisChar(4,m[(x/10)%10]);
DisChar(3,m[(x/100)%10]);
DisChar(2,m[(x/1000)%10]);
DisChar(1,m[(x/10000)%10]);
DisChar(0,m[(x/100000)%10]);
delay_ms(10);
}
void main(void)
{
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TR1=1;
ET0=1;
ET1=1;
EA=1;
TR0=1;
delay_ms(5);
LcdInit();
while(1)
{
if(flag==1)
{
flag=0;
if (T0count>0)
{x=(T0count*65536+TH0*256+TL0)/100;
Displays(x);
t=10000/x;
Display2(t);
}
else {x=(T0count*65536+TH0*256+TL0);
t=1000000/x;
Display(x);
Display2(t);}
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}
void t0() interrupt 1 using 0 //计脉冲个数
{
T0count++;
}
void t1(void) interrupt 3 using 0 //定时1s
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
timecount++;
if(timecount==250)
{
TR0=0;
timecount=0;
flag=1;
}
}