#ifndef LCD1602_H
#define LCD1602_H
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD_DATA P1
#define LCD_COMM P2
sbit E1 = LCD_COMM^3;
sbit E2 = LCD_COMM^2;
sbit RW = LCD_COMM^1;
sbit DI = LCD_COMM^0;
#define ON 0xAF //开显示指令
#define OFF 0xAE //关显示指令
#define DISP_START 0xC0 //起始显示行
#define PAGE_ADDR 0xB8 //页地址指令
#define COL_ADDR 0x00 //页地址指令
#define MASK_BUSY 0x80 //读忙位掩码
#define RMW 0xE0 //读时地址不变,写时地址增加;用于“读-改-写”
#define END_RMW 0xEE //退出“读-改-写”模式
#define DUTY32 0xA9 //设置为扫描32行
#define DRIVE_MODE 0xA4 //0:打开动态扫描
bit L_R=0;
uchar code ASCII_TAB[][5];//7x5 ASCII 字库
uchar code CN_TAB[][32];//字库
void WriteData(uchar byte) //向左屏写数据
{
RW=0; //write
DI=1; //data
if(L_R) // 1 时表示写右屏
{
E2=1;
LCD_DATA=byte;
E2=0;
}
else
{
E1=1;
LCD_DATA=byte;
E1=0;
}
}
void WriteCmd(uchar byte) //向右屏写指令
{
RW=0; //write
DI=0; //command
if(L_R) // 1 时表示写右屏
{
E2=1;
LCD_DATA=byte;
E2=0;
}
else
{
E1=1;
LCD_DATA=byte;
E1=0;
}
}
void Init(void) //初始化
{
L_R=0; //左屏初始化
WriteCmd(OFF); //关显示
WriteCmd(DISP_START); //从第0行开始显示
WriteCmd(DRIVE_MODE); //动态显示
WriteCmd(DISP_START); //列地址切换到0
WriteCmd(PAGE_ADDR); //页地址切换到0
WriteCmd(DUTY32); //扫描行数为32
WriteCmd(END_RMW); //关闭RMR模式
WriteCmd(ON); //开显示
L_R=1; //右屏初始化
WriteCmd(OFF); //关显示
WriteCmd(DISP_START); //从第0行开始显示
WriteCmd(DRIVE_MODE); //动态显示
WriteCmd(DISP_START); //列地址切换到0
WriteCmd(PAGE_ADDR); //页地址切换到0
WriteCmd(DUTY32); //扫描行数为32
WriteCmd(END_RMW); //关闭RMR模式
WriteCmd(ON); //开显示
}
void Clean(void) //清屏
{
uchar i;
uchar page;
L_R=0; //左屏
for(page=0;page<4;page++) //0~3页
{
WriteCmd(PAGE_ADDR|page);
for(i=0;i<61;i++) //0~60列
{
WriteCmd(COL_ADDR|i);
WriteData(0x00);
}
}
L_R=1; //右屏
for(page=0;page<4;page++) //0~3页
{
WriteCmd(PAGE_ADDR|page);
for(i=0;i<61;i++) //0~60列
{
WriteCmd(COL_ADDR|i);
WriteData(0x00);
}
}
}
void LocateXY(uchar x,uchar y)
{
if(x>60) //左屏从 0 -- 60 列 超出则为右屏
{
x%=61;
L_R=1;//右屏
}
else
L_R=0;//左屏
WriteCmd(COL_ADDR|x);
WriteCmd(PAGE_ADDR|y);
}
void PrintEN(uchar x,uchar y,uchar dat)
{
bit cross=1;
uchar i;
uchar *EN_P= ASCII_TAB[dat-32];
LocateXY(x,y);
for(i=0;i<5;i++)
{
if(cross&(x>60)) //跨越左右屏 要从新设地址
{
LocateXY(x,y);
cross=0; //只能有一次跨越
}
WriteData(*EN_P++);
x++;
}
WriteData(0x00);//字模宽度为5,为了美观,在后面加入一个空白列
}
void PrintString(uchar x,uchar y,uchar *str)
{
while(*str!='/0')
{
if(x>117) //每行122列 一般英文占6列 最后一个允许只占5列
{ //剩余不足一个英文 则换行(122-117=5)
x=0;
y++;
if(y>3)
y=0;
}
PrintEN(x,y,*str++);
x+=6;
}
}
void PrintInt(uchar x,uchar y,long num)
{
uchar temp[10];
char i=0;
long numt;
if(num<0)
{
PrintEN(x,y,'-');
x+=6;
numt=-num;
}
else
numt=num;
do
{
temp[i]=numt%10;
numt/=10;
i++;
}while(numt);
i--;
while(i>=0)
{
if(x>117) //每行122列 一般英文占6列 最后一个允许只占5列
{ //剩余不足一个英文 则换行(122-117=5)
x=0;
y++;
if(y>3)
y=0;
}
PrintEN(x,y,(temp[i--]+48)); //32 +16
x+=6;
}
}
uchar code ASCII_TAB[][5]= //5*7 逐列
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0xc4, 0xc8, 0x10, 0x26, 0x46 }, // %
{ 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x50, 0x30, 0x00 }, // ,
{ 0x10, 0x10, 0x10, 0x10, 0x10 }, // -
{ 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A
{ 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // '/'
{ 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g
{ 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j
{ 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p
{ 0x08, 0x14, 0x14, 0x18, 0x7C }, // q
{ 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y
{ 0x44, 0x64, 0x54, 0x4C, 0x44 } // z
};
#endif