lcd1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include<reg51.h>
/*********************************************
定义以下宏是为了便于4位数据传输和8位数据
传输的切换取消以下宏定义编译出来的是8位传输
*********************************************/
//#define LCD1602_4PINS
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#define LCD1602_DATAPINS P0
sbit LCD1602_EN = P2^7;
sbit LCD1602_RW = P2^5;
sbit LCD1602_RS = P2^6;
//void Lcd1602_Delay1ms(uint c);
void lcd1602WriteCommand(uchar command);
void lcd1602WriteData(uchar da);
void initialLCD1602();
void lcd1602ShowFloatValue(float value, uchar precision);
#endif
lcd1602.c
#include <lcd1602.h>
#include<function.h>
#include<math.h>
#ifndef LCD1602_4PINS
void lcd1602WriteCommand(uchar command)
{
LCD1602_EN = 0;
LCD1602_RS = 0; //发送命令
LCD1602_RW = 0;
LCD1602_DATAPINS = command;
delayms(1);//此处应稍有延时,为了速度不用延时也可以
LCD1602_EN = 1;
delayms(5);
LCD1602_EN = 0;
}
#else
void lcd1602WriteCommand(uchar command)
{
LCD1602_EN = 0;
LCD1602_RS = 0; //发送命令
LCD1602_RW = 0;
LCD1602_DATAPINS = command;//16024位接法时,用数据线的高4位接传输,先写入高4位,后写入低4位
delayms(1);//此处应稍有延时,为了速度不用延时也可以
LCD1602_EN = 1;
delayms(5);
LCD1602_EN = 0;
LCD1602_DATAPINS = command << 4;
delayms(1);//此处应稍有延时,为了速度不用延时也可以
LCD1602_EN = 1;
delayms(5);
LCD1602_EN = 0;
}
#endif
#ifndef LCD1602_4PINS
void lcd1602WriteData(uchar da)
{
LCD1602_EN = 0;
LCD1602_RS = 1; //发送命令
LCD1602_RW = 0;
LCD1602_DATAPINS = da;
delayms(1);//此处应稍有延时,为了速度不用延时也可以
LCD1602_EN = 1;
delayms(5);
LCD1602_EN = 0;
}
#else
void lcd1602WriteData(uchar da)
{
LCD1602_EN = 0;
LCD1602_RS = 1; //发送命令
LCD1602_RW = 0;
LCD1602_DATAPINS = da;//16024位接法时,用数据线的高4位接传输,先写入高4位,后写入低4位
delayms(1);//此处应稍有延时,为了速度不用延时也可以
LCD1602_EN = 1;
delayms(5);
LCD1602_EN = 0;
LCD1602_DATAPINS = da << 4;
delayms(1);//此处应稍有延时,为了速度不用延时也可以
LCD1602_EN = 1;
delayms(5);
LCD1602_EN = 0;
}
#endif
#ifndef LCD1602_4PINS
void initialLCD1602()
{
lcd1602WriteCommand(0x38); //开显示
lcd1602WriteCommand(0x0c); //开显示不显示光标
lcd1602WriteCommand(0x06); //写一个指针加1
lcd1602WriteCommand(0x01); //清屏
lcd1602WriteCommand(0x80); //设置数据指针起点
}
#else
void initialLCD1602()
{
lcd1602WriteCommand(0x32);
lcd1602WriteCommand(0x28); //开显示
lcd1602WriteCommand(0x0c); //开显示不显示光标
lcd1602WriteCommand(0x06); //写一个指针加1
lcd1602WriteCommand(0x01); //清屏
lcd1602WriteCommand(0x80); //设置数据指针起点
}
#endif
void lcd1602ShowFloatValue(float value, uchar precision)
{
uchar i, LCD1602Falg = 0;
uchar wei[5];
uint tp;
value = value + pow(0.1,precision + 1);
for(i = 0; i < precision; i++)
{
value = value * 10;
}
tp = value;
wei[0] = tp/10000;
wei[1] = tp%10000/1000;
wei[2] = tp%1000/100;
wei[3] = tp%100/10;
wei[4] = tp%10;
//i = 0;
for(i = 0; i < 5; i++)
{
if(LCD1602Falg == 0 && wei[i] == 0 && i < 4 - precision)
{
lcd1602WriteData(0x20);
}else
{
lcd1602WriteData(wei[i] + 0x30);
if(i == 4 - precision)
{
lcd1602WriteData('.');
}
LCD1602Falg = 1;
}
}
}