#include<reg52.h>
#include<intrins.h>
#include"port.h"
#include"lcdmodule.h"
#include"delay.h"
// lcd1602 asiic码,功能清屏一个字节
#define clear_char 0xfe
void delay_1s(void);
void delay_25ms(void);
union
{
unsigned long int tal;
unsigned char cont[4];
}
timer0_cont;
unsigned char data ddatabuffer[10];
void main(void)
{
unsigned char i;
union
{
unsigned int a;
unsigned char b[2];
}
temp;
p0 = 0xff;
p1 = 0xff;
p2 = 0xff;
p3 = 0xff;
lceinit();
displaylistchar(0, 0, "frequencycounter");
displaylistchar(13, 1, "hz");
tmod=0x05; //to模式1,外部计数模式
while (1)
{
timer0_cont.tal = 0;
temp.a = 0;
// lcd显示缓冲区清零
for (i=0; i<10; i++)
{
ddatabuffer = 0;
}
// 清t0计数器
tl0 = 0;
th0 = 0;
cont_gate=0; //关闸门,关闭计数器通路
hc4040mr=1; //清零脉冲计数器
hc4040mr=0; //hc4040可以计数
tr0=1; //t0计数器开始计数
//////////////////////////////////////////////////////////////////
cont_gate=1; //开闸门,接通计数脉冲通路
// 延时1秒
delay_1s();
_nop_();
_nop_();_nop_();
_nop_();_nop_();
cont_gate=0; //关闸门
///////////////////////////////////////////////////////////////////
tr0=0; //关t0计数器
// 读入12位计数器值
temp.b[1] = p0;
temp.b[0] = p2;
temp.b[0] &= 0x0f;
// 读入计数器内的数
timer0_cont.cont[3] = tl0;
timer0_cont.cont[2] = th0;
timer0_cont.tal = timer0_cont.tal * 4096;
timer0_cont.tal |= temp.a;
/*---------四字节十六进制数转换成bcd码(从高位到低位)-------------*/
ddatabuffer[0] = timer0_cont.tal / 1000000000;
timer0_cont.tal = timer0_cont.tal % 1000000000;
ddatabuffer[1] = timer0_cont.tal / 100000000;
timer0_cont.tal = timer0_cont.tal % 100000000;
ddatabuffer[2] = timer0_cont.tal / 10000000;
timer0_cont.tal = timer0_cont.tal % 10000000;
ddatabuffer[3] = timer0_cont.tal / 1000000;
timer0_cont.tal = timer0_cont.tal % 1000000;
ddatabuffer[4] = timer0_cont.tal / 100000;
timer0_cont.tal = timer0_cont.tal % 100000;
ddatabuffer[5] = timer0_cont.tal / 10000;
timer0_cont.tal = timer0_cont.tal % 10000;
ddatabuffer[6] = timer0_cont.tal / 1000;
timer0_cont.tal = timer0_cont.tal % 1000;
ddatabuffer[7] = timer0_cont.tal / 100;
timer0_cont.tal = timer0_cont.tal % 100;
ddatabuffer[8] = timer0_cont.tal / 10;
ddatabuffer[9] = timer0_cont.tal % 10;
// bcd码转换成ascii码送lcd1602
for (i=0; i<10; i++)
{
ddatabuffer |= 0x30;
}
i = 0;
// 判断计数器高位是否为零且在数组范围内
while ( (ddatabuffer == 0x30) && (i<10) )
{
// 如果为零,则该位清屏
displayonechar(2+i, 1, clear_char);
i++;
}
if (i == 10)
{
displaylistchar(2, 1, "no signal");
}
for (; i<10; i++)
{
displayonechar(2+i, 1, ddatabuffer);
}
}
}
void delay_25ms(void)
{
unsigned int x = 45438;
while (--x)
{
_nop_();
}
}
void delay_1s(void)
{
delay_25ms();
delay_25ms();
delay_25ms();
delay_25ms();
}