1602的部分就不用看了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delayms(unsigned char ms) //延时程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
sbit rs=P2^5; //1602
sbit rw=P2^6; //
sbit e=P2^7; //
uchar table1[]="0123456789";
long int k=0,m,n,flag=0;
long int g,s,b,q,w;
long double i,t;
void display(); //显示函数
void write_com(uchar com) //1602写入指令
{
e=0;
rs=0;
rw=0;
P0=com;
delayms(1);
e=1;
delayms(5);
e=0;
}
void write_data(uchar dat) //1602写入数据
{
e=0;
rs=1;
rw=0;
P0=dat;
delayms(1);
e=1;
delayms(5);
e=0;
}
void init(void) //1602初始化设置程序
{
delayms(15);
write_com(0x38);
delayms(5);
write_com(0x38);
delayms(5);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
main() //主函数
{
EA=1; //中断总开关
EX0=1; //外部中断
IT0=1; //负跳变沿触发
TMOD=0x01; //定时器0 方式1
TH0=0; //初值 高8位
TL0=0; //初值低8位
EA=1;
// ET0=1; //打开定时器中断
// TR0=1; //启动定时器
while(1)
{
display();
}
}
void timer0() interrupt 1
{
k++; //计数器溢出值
TH0=0;
TL0=0;
}
void int0() interrupt 0
{
if(flag==0) //第一次中断
{
i=0;
k=0;
TH0=0;
TL0=0;
ET0=1; //打开定时器中断
TR0=1; //
flag++;
}
if(flag==1) //第二次中断
{
m=TH0;
n=TL0;
ET0=0; //关闭定时器中断
TR0=0; //
flag=0;
t=k*65536+256*m+n; //被测频率的一个周期
i=100000/t; //频率
}
}
void display()
{
g=(long int)i%10; // 个位
s=(long int)i/10%10; // 十
b=(long int)i/100%10; // 百
q=(long int)i/1000%10; // 千
w=(long int)i/10000; // 万
init();
write_com(0x80); //显示
write_data(table1[w]);
delayms(10);
write_com(0x81);
write_data(table1[q]);
delayms(10);
write_com(0x82);
write_data(table1);
delayms(10);
write_com(0x83);
write_data(table1);
delayms(10);
write_com(0x84);
write_data(table1[g]);
delayms(10);
while(1);
}
|