#include <REG51.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define LCM_DATA P0
sbit W_R=P1^3;
sbit R_D=P1^2;
sbit CS=P1^0;
sbit A0=P3^4;
sbit RES=P3^2;
#define CR 39 /*定义显示窗口的长度,以字节为单位*/
#define TCR 52 /*定义LCD的时间常数*/
#define LF 239 /*定义LCD的行数*/
#define APL 40 /*定义LCD一行所占缓冲区的字节数,低8位*/
#define APH 0 /*定义LCD一行所占缓冲区的字节数,高8位*/
#define SAD1 0x0000/**/
#define SAD1L 0x00/**/
#define SAD1H 0x00/**/
#define SL1 20/**/
#define SAD2 0x2800/**/
#define SAD2L 0x00/**/
#define SAD2H 0x28/**/
#define SL2 20/**/
#define SAD3 0x5000/**/
#define SAD3L 0x00/**/
#define SAD3H 0x50/**/
#define SAD4 0x2800/**/
#define SAD4L 0x00/**/
#define SAD4H 0x28/**/
unsigned char code LCMSYSINIT[8]={0x30,0x87,0x07,CR,TCR,LF,APL,APH};
unsigned char code LCMSCRINIT[10]={SAD1L,SAD1H,SL1,SAD2L,SAD2H,SL2,SAD3L,SAD3H,SAD4L,SAD4H};
//******************************************************************
//*****************************************************************************************************************
/**********************************
* 函数原型:void Delay_nop()
* 功 能:nop语句
***********************************/
void Delay_nop()
{
uchar i;
for(i=5;i> 0;i--)i=i;
// for(i=0;i <5;i++)i=i;
}
/**********************************
* 函数原型:void DelayXus(void)
* 功 能:延时Xus,未实际测试
***********************************/
void DelayXus(uchar dt)
{
uchar i;
for(i=5*dt;i> 0;i--);
}
/***************************************
* 函数原型:void DelayXms(uint dt)
* 功 能:延时Xms,经过实际测试
***************************************/
void DelayXms(uint dt)
{
uint i,j;
for(i=0;i <dt;i++)
for(j=0;j <2370;j++);
}
/*******写命令*********/
void LCM_WrCmd(unsigned char CMD)
{
CS=0;
A0=1;
_nop_();_nop_();_nop_();
LCM_DATA=CMD;
_nop_();_nop_();_nop_();
R_D=1;
W_R=0;_nop_();
W_R=1;_nop_();
CS=1;_nop_();
}
/********写数据********/
void LCM_WrData(unsigned char DATA)
{
CS=0;
A0=0;
_nop_();_nop_();_nop_();
LCM_DATA=DATA;
_nop_();_nop_();_nop_();
R_D=1;
W_R=0;_nop_();
W_R=1;_nop_();
CS=1;_nop_();
}
/****************/
void LCM_Init()
{
unsigned char xdata counter;
LCM_WrCmd(0x40);
for(counter=0;counter <8;counter++)
{LCM_WrData(LCMSYSINIT[counter]);DelayXus(10);}
LCM_WrCmd(0x44);
for(counter=0;counter <10;counter++)
{LCM_WrData(LCMSCRINIT[counter]);DelayXus(10);}
LCM_WrCmd(0x59);//DelayXus(10);//开显示
LCM_WrData(0x54);//DelayXus(10);//
LCM_WrCmd(0x5A);//DelayXus(10);//水平移动
LCM_WrData(0x00);//DelayXus(10);//不移动
LCM_WrCmd(0x4F);//DelayXus(10);//光标移动方向:向左0x4D,向右0x4C,向上0x4E,向下0x4F
LCM_WrCmd(0x5B);//DelayXus(10);//重叠显示
LCM_WrData(0x0E);//DelayXus(10);
LCM_WrCmd(0x5D);//DelayXus(10);//
LCM_WrData(0x07);//DelayXus(10);
LCM_WrData(0x87);//DelayXus(10);
}
//******************************************************************
/***************系统主函数*******************/
void main(void)
{
unsigned int i;
RES=1;
DelayXms(500);
LCM_Init();
DelayXms(100);
for(i=0;i <50;i++)
{
LCM_WrCmd(0x46);DelayXus(10);
LCM_WrData(0x80);DelayXus(10);
LCM_WrData(0x80);DelayXus(10);
LCM_WrCmd(0x42);DelayXus(10);
LCM_WrData(0x30);DelayXus(10);
if(i> 120)i=0;
}
}