/* 预处理区 */
#include <reg52.h> /* 加载"reg52.h"头文件 */
#include <math.h> /* 加载"math.h"头文件 */
/* 宏定义 */
#define unchar unsigned char /* 无符号字符型 */
#define unint unsigned int /* 无符号整型 */
#define N 10 /* 延时参数 */
/* 数组常量定义 */
unchar code row1[] = ">>Liquid Level<<"; /* 液晶输出的第一行显示编码 */
unchar code row2[] = { "0123456789" }; /* 液晶的0~9编码 */
unchar code tip_1[] = "Please lini cap"; /* 液晶输出行 */
unchar code tip_2[] = "then push'start'"; /* 液晶输出行 */
/* 位定义 */
sbit lcd_rs = P2 ^ 0; /* 液晶的数据命令选择端 */
sbit lcd_rw = P2 ^ 1; /* 液晶的读写选择端 */
sbit lcd_en = P2 ^ 2; /* 液晶的使能端 */
sbit show = P1 ^ 0; /* 开始按键 */
sbit clear = P1 ^ 1; /* 清屏按键 */
sbit add = P1 ^ 7;
sbit led = P1 ^ 2; /* 电源灯 */
sbit JIN = P2 ^ 3; /*进水泵*/
sbit CHU = P2 ^ 4; /*出水泵*/
sbit alerm = P2 ^ 7;
/* 变量定义 */
unint flag = 0; /* 标志位 */
double count = 0; /* 计数 */
double final = 0; /* 高电平时间 */
double cx = 0,total = 0; /* 水量数值 */
unint w1, w2, w3, w4, i; /* 变量定义 百位,十位,个位,十分位,循环计数位。 */
unint z1,z2,z3,z4,z5;
/* 自定义函数声明 */
void init(); /* 初始化函数 */
void delay( unint ); /* 延时函数 */
void write_com( unchar ); /* 液晶写指令 */
void write_data( unchar ); /* 液晶写数据 */
void firstline(); /* 液晶第一行显示 */
void display(); /* 水量大小输出函数 */
void tip(); /* 初始显示函数 */
void chose(); /* 判断按键函数 */
/* 主函数 */
void main()
{
alerm = 0;
JIN = 0;
CHU = 0;
init(); /* 初始化 */
tip(); /* 初始显示 */
firstline(); /* 显示 ">>oil mass<<" */
display(); /* 初始输出"000.0" */
while ( 1 ) /* 死循环 */
chose(); /*按键判断 */
}
/* 自定义函数定义区 */
void init() /* 初始化函数定义 */
{
lcd_rw = 0; /* 液晶读写选择端置0,默认只写不读 */
write_com( 0x38 ); /* 液晶设置16*2显示,5*7点阵,8位数据接口 */
write_com( 0x0c ); /* 液晶设置开显示,不显示光标 */
write_com( 0x06 ); /* 液晶写一个字符后地址指针加一 */
write_com( 0x01 ); /* 液晶显示清0,数据指针清0 */
EX0 = 1; /* 开启外部中断0 */
IT0 = 1; /* 外部中断0采用边沿触发,下降沿有效 */
PX0 = 1; /* 外部中断0设高优先级 */
TMOD = 0x01; /* 定时器0工作方式1 */
TH0 = 0; /* 装初值0 */
TL0 = 0;
ET0 = 1; /* 开启定时器中断 */
TR0 = 0; /* 关闭定时器0 */
EA = 1; /* 开启总中断 */
led = 0; /* 开电源指示灯 */
}
void delay( unint a ) /* 延迟函数定义 */
{
unint b; /* 定义变量 */
for (; a > 0; a-- ) /* 外层循环,由用户定义 */
for ( b = 0; b < 10; b++ )
;
/* 内层循环,固定10次 */
}
void write_com( unchar data1 ) /* 液晶写命令函数 */
{
lcd_rs = 0; /*选择写命令模式 */
delay( N ); /*稍作延时 */
lcd_en = 1; /* 使能端置给高脉冲 */
P0 = data1; /* 将要写的命令字送到数据总线上 */
delay( N ); /*稍作延时以待数据稳定 */
lcd_en = 0; /* 将使能端置0以完成高脉冲 */
}
void write_data( unchar data2 ) /* 液晶数据函数 */
{
lcd_rs = 1; /*选择写数据模式 */
delay( N ); /*稍作延时 */
lcd_en = 1; /* 时能端给高脉冲 */
P0 = data2; /* 将要写的数据字送到数据总线上 */
delay( N ); /*稍作延时以待数据稳定 */
lcd_en = 0; /* 将使能端置0以完成高脉冲 */
}
void firstline() /* 液晶显示第一行 */
{
write_com( 0x80 ); /* 定位液晶第一行 */
for ( i = 0; i < 16; i++ ) /* 循环选择光标位 */
write_data( row1[i] ); /* 输出字符 */
}
void display() /* 水量大小输出函数 */
{
write_com( 0x80 + 0x40 ); /* 定位液晶第二行 */
write_data( 'D' );
write_data( ':' );
write_data( row2[w1] ); /* 显示水量大小"百位" */
write_data( row2[w2] ); /* 显示水量大小"个位" */
write_data( row2[w3] ); /* 显示水量大小"十位" */
write_data( '.' ); /* 显示"小数点" */
write_data( row2[w4] ); /* 显示水量大小"十位" */
write_data( ' ' );
write_data( 'T' );
write_data( ':' );
write_data( row2[z1] ); /* 显示水量大小*/
write_data( row2[z2] ); /* 显示水量大小 */
write_data( row2[z3] ); /* 显示水量大小*/
write_data( row2[z4] ); /* 显示水量大小 */
write_data( '.' );
write_data( row2[z5] ); /* 显示水量大小 */
write_data( 'L' );
}
资料下载地址
资料下载地址