#include "AT89X52.h"
//////////////////////////在此进行端口映射////////////////////////////////////////////////////////////////////////
#define RS (P1_0)
#define RW (P1_1)
#define E (P1_2)
#define LCD_IO P3
#define BF P3_7
////////////////////////////////////////宏指令/////////////////////////////////////////////////////////////////////
#define LCD_clear Send_I(0x01) ////清显示屏
#define LCD_RetToZ Send_I(0x03) ////光标归位,AC归零
///显示模式设置
#define LCD_initial_1 Send_I(0x3C) //8位数据总线,两行显示模式,5X10点阵
#define LCD_initial_2 Send_I(0x38) //8位数据总线,两行显示模式,5X7点阵
#define LCD_initial_3 Send_I(0x34) //8位数据总线,单行显示模式,5X10点阵
#define LCD_initial_4 Send_I(0x30) //8位数据总线,单行显示模式,5X7点阵
#define LCD_initial_5 Send_I(0x2C) //4位数据总线,两行显示模式,5X10点阵
#define LCD_initial_6 Send_I(0x28) //4位数据总线,两行显示模式,5X7点阵
#define LCD_initial_7 Send_I(0x24) //4位数据总线,单行显示模式,5X10点阵
#define LCD_initial_8 Send_I(0x20) //4位数据总线,单行显示模式,5X7点阵
///光标显示控制
#define LCD_close Send_I(0x0B) ////关显示屏
#define LCD_Mark Send_I(0x0C) ////开显示,无光标,无方块
#define LCD_MarkN Send_I(0x0E) ////只有光标,无黑色方块
#define LCD_MarkY Send_I(0x0F) ////有光标,有方块
///光标位移控制
#define Mark_Mov1 Send_I(0x10) ///光标向左移动,AC自动减1
#define Mark_Mov2 Send_I(0x14) ///光标向右移动,AC自动加1
#define Mark_Mov3 Send_I(0x18) ///光标和显示一起向左移动,AC值不变
#define Mark_Mov4 Send_I(0x1C) ///光标和显示一起向右移动,AC值不变
//OCMC2X16A LCD Driver
//by:FFgamelife
//08.8.23
char LCD_initial(void); ///初始化
void Mark_set(char,char); ///设置光标位置
void Send_I(unsigned char); ///发送指令
void Send_D(unsigned char); ///发送数据
unsigned char Read_D(void); ///读取数据
void CheakBF(void); ///忙标志检测
void Delay(unsigned int); ///延时
void Showinf(char *); ///字符串写屏
///////////////////////////////////////////初始化子程序////////////////////////////////////////////////
char LCD_initial(void)
{
LCD_clear; //清显示屏
LCD_RetToZ; //光标归位,AC归零
LCD_MarkY; //开光标,开显示屏
return 0;
}
//////////////////////////////////////////设置光标位置/////////////////////////////////////////////////
void Mark_set(char line,char Num)
{
if(line==1)
Send_I(0x80+Num);
else
Send_I(0xC0+Num);
}
//////////////////////////////////////////写指令子程序/////////////////////////////////////////////////
void Send_I(unsigned char i)
{
CheakBF();
RS=0;
RW=0;
LCD_IO=i;
E=1;
Delay(1);
E=0;
}
//////////////////////////////////////////写数据子程序/////////////////////////////////////////////////
void Send_D(unsigned char Data)
{
CheakBF();
RS=1;
RW=0;
LCD_IO=Data;
E=1;
Delay(1);
E=0;
}
//////////////////////////////////////////读数据子程序/////////////////////////////////////////////////
unsigned char Read_D()
{
unsigned char Data;
CheakBF();
RS=1;
RW=1;
E=1;
Delay(1);
Data=LCD_IO;
return Data;
}
///////////////////////////////////////////忙标志位检测////////////////////////////////////////////////
void CheakBF(void)
{
LCD_IO=0xFF;
RS=0;
RW=1;
E=1;
while(BF);
E=0;
}
//////////////////////////////////////////延时子程序////////////////////////////////////////////////////
void Delay(unsigned int time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<time;j++);
}
/////////////////////////////////////////输入字符串/////////////////////////////////////////////////////
void Showinf(char *str)
{
while(*str!='\0')
{
Send_D(*str);
str++;
}
}