#include
#define uchar unsigned char
#define uint unsigned int
uint Pa;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
***it LCD_RS = P2^0;
***it LCD_E = P2^2;
***it LCD_RW = P2^1;
***it key=P3^7;
#define LCD_DATA P0 //LCD显示内容,定义到代码段
unsigned char code LcdBuf1[]= {" welcom! LM331"};
unsigned char code LcdBuf2[]= {" Voltage test!"};
unsigned char temp[8];
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10}; //函数声明
void lcd_init(void);
void display_string(unsigned char x,unsigned char y,unsigned char *s);
void disp_selec(unsigned char bit_selec,unsigned char seg);
void delay(uint z) //延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**************************************************
** 函数名称: dellay
** 入口参数:h(unsigned int型)
** 出口参数:无
** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS
****************************************************/
void delay(unsigned int h)
{
while(h--); //0.01MS
}
/**************************************************
** 函数名称: WriteDataLcd
** 入口参数:wdata(unsigned char型)
** 出口参数:无
** 功能描述: 写数据到LCD
****************************************************/
void WriteDataLcd(unsigned char wdata)
{
LCD_RS=1;
LCD_RW=0;
LCD_DATA=wdata;
dellay(100); //短暂延时,代替检测忙状态
LCD_E=1;
dellay(100); //短暂延时,代替检测忙状态
LCD_E=0;
}
/**************************************************
** 函数名称: WriteCommandLcd
** 入口参数:wdata(unsigned char型)
** 出口参数:无
** 功能描述: 写命令到LCD
****************************************************/
void WriteCommandLcd(unsigned char wdata)
{
LCD_RS=0;
LCD_RW=0;
LCD_DATA=wdata;
dellay(100); //短暂延时,代替检测忙状态
LCD_E=1;
dellay(100); //短暂延时,代替检测忙状态
LCD_E=0;
}
//LCD初始化
void lcd_init(void)
{
LCD_E=0;
WriteCommandLcd(0x38);
WriteCommandLcd(0x38); //显示模式设置 WriteCommandLcd(0x08); //关闭显示
WriteCommandLcd(0x0c);
WriteCommandLcd(0x06); //显示光标移动设置
WriteCommandLcd(0x01); //显示清屏
WriteCommandLcd(0x90); //显示开及光标移动设置
}
/**************************************************
** 函数名称: display_xy
** 入口参数:x(unsigned char型),y(unsigned char型)
** 出口参数:无
** 功能描述: 设置光标位置, x是列号,y是行号
****************************************************/
void display_xy(unsigned char x,unsigned char y)
{
if(y==1)
x+=0x40;
ELSE
x+=0x80;
WriteCommandLcd(x);
}
/********************************************************************
** 函数名称: display_char
** 入口参数:x(unsigned char型),y(unsigned char型),dat(unsigned char型)
** 出口参数:无
** 功能描述: 在具体位置显示单个字符,x是列号,y是行号
*********************************************************************/
void display_char(unsigned char x,unsigned char y,unsigned char dat)
{
display_xy(x,y);
WriteDataLcd(dat);
}
/*********************************************************************
** 函数名称: display_string
** 入口参数:x(unsigned char型),y(unsigned char型),s(指针型)
** 出口参数:无
** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/
void display_string(unsigned char x,unsigned char y,unsigned char *s)
{
display_xy(x,y);
while(*s)
{
WriteDataLcd(*s);
s++;
}
}
***it LEDBAK=P2^3;
void main(void)
{
unsigned char i;
LCD_RW=0;
delay(100);
lcd_init();
display_string(0,0,LcdBuf1); //显示第一行,从第3个位置开始
display_string(0,1,LcdBuf2); //显示第二行,从第0个位置开始
delay(3000);
TMOD=0x15; //初始化定时器工作方式
TH0=0;
TL0=0; //初始化定时器0值
TH1=(65536-5000)/256; //初始化定时器0值
TL1=(65536-5000)%256;
TR1=1; //启动定时器1
TR0=1; //启动定时器0
ET0=1; //定时器0使能
ET1=1; //定时器1使能
EA=1; //总中断允许
WriteCommandLcd(0x01); //显示清屏
while(1)
{
if(flag==1) //1S标志到
{
flag=0; //清1S标志
x=T0count*65536+TH0*256+TL0;// 计算频率值
Pa=20 x /K+9;
for(i=0;i<8;i++) //循环八次
{
temp[i]=0; //将八个显示换冲区清零
}
i=0;
while(x/10) //计算每一位数值缓冲区
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++) //循环六次
{
dispbuf[i]=temp[i]; //将数值缓冲区中的数存入显示缓冲区
}
for(i=0;i<6;i++) //循环六次
display_char(i+5,0,dispbuf[5-i]+'0');
display_string(12,0,"HZ");
for(i=0;i<8;i++) //循环八次
{
temp[i]=0; //将八个显示换冲区清零
}
i=0;
while(Pa/10) //计算每一位数值缓冲区
{
temp[i]=Pa%10;
Pa=Pa/10;
i++;
}
temp[i]=Pa;
for(i=0;i<6;i++) //循环六次
{
dispbuf[i]=temp[i]; //将数值缓冲区中的数存入显示缓冲区
}
display_string(9,1,". KPA");
display_char(6,1,dispbuf[3]+'0');
display_char(7,1,dispbuf[2]+'0');
display_char(8,1,dispbuf[1]+'0');
display_char(9,1,'.');
display_char(10,1,dispbuf[0]+'0');
timecount=0; //200次计数值清零
T0count=0; //脉冲计数值清零
TH0=0; //T0计数值清零
TL0=0; //T0计数值清零
TR0=1; //再次启动下一次的计数
}
}
}
void t0(void) interrupt 1 using 0
{
T0count++; //定时器0中断,满65536个脉冲,则T0count++;
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-5000)/256; //重新规定TH计数初值为50ms
TL1=(65536-5000)%256;
timecount++;
if(timecount==200) //如果满足200个50MS ,即1S到
{
TR0=0; //定时器0停止
timecount=0; //时间标志位清零
flag=1; //1S标志位置1
}
}
|