#define LCD_CUR_POS 0X21 //光标位置设置(只有设置到有效显示地址并打开显示才看到),双参数(D1水平位置,D2垂直位置)
#define LCD_CGR_POS 0X22 //CGRAM偏置地址设置(用来增加自己的符号),双参数(D1低5位有效,D2=00)
#define LCD_ADR_POS 0x24 //地址指针位置(设置读写操作打针)
//显示区域设置指令
#define LCD_TXT_STP 0X40 //文本区首址(从此地址开始向屏幕左上角显示字符)
#define LCD_TXT_WID 0X41 //文本区宽度(设置显示宽度,N/6式N/8,其中N为X轴的点数)
#define LCD_GRH_STP 0X42 //图型区首址(从此地址开始向屏幕左上角显示点,((有等进一步确认))为文本方式显示时,显示为文本显示特性
#define LCD_GRH_WID 0X43 //图形区宽度(设置显示宽度,N/6式N/8,其中N为X轴的点数)
//显示方式设置指令,当CG(D3)为0启用CGROM
#define LCD_MOD_OR 0X80 //显示方式:逻辑或
#define LCD_MOD_XOR 0X81 //显示方式:逻辑异或
#define LCD_MOD_AND 0x83 //显示方式:逻辑与
#define LCD_MOD_TCH 0x84 //显示方式:文本
//显示开关设置指令,(D0,D1,D2,D3)=1/0 <==========> (光标闪烁,光标显示,文本显示,图形显示)启用/禁用
#define LCD_DIS_SW 0x90 //显示开关设置
//光标开头设置指令
#define LCD_CUR_SHP 0xA0 //光标型形状选择:0xA0-0xA7代表光标占的行数
//自动读写设置指令
#define LCD_AUT_WR 0xB0 //自动写设置
#define LCD_AUT_RD 0xB1 //自动读设置
#define LCD_AUT_OVR 0xB2 //自动读写结束
//数据一次读写设置指令
#define LCD_INC_WR 0xC0 //数据一次写,地址加1
#define LCD_INC_RD 0xC1 //数据一次读,地址加1
#define LCD_DEC_WR 0xC2 //数据一次写,地址减1
#define LCD_DEC_RD 0xC3 //数据一次读,地址减1
#define LCD_ZER_WR 0xc4 //数据一次写,地址不变
#define LCE_ZER_RD 0xc5 //数据一次读,地址不变
//屏读设置指令
#define LCD_SCN_RD 0xE0 //屏读,屏读只能在图形显示区内;该指令是把屏上的内容取出来作为数据使用.
//屏拷贝
#define LCD_SCN_CP 0xE8 //屏拷贝,该指令将屏上当前地址指针(图形)处开妈的一行合成显示内容拷贝到相对应的图形显示区的一级单元
//位操作指令
#define LCD_BIT_OP 0xF0 //该指令可将显示缓冲区单无的某位清零或置位.D0-D1---定义D0-D7位;D3--1为置位,D3--0为复位
#define IO P5
unsigned char xdata LCD_DAT_ADD _at_ 0x8000;
unsigned char xdata LCD_COM_ADD _at_ 0x8100;
#include <c8051f020.h>
/***********************************************************************
函数名称:LCD_Write_Data()
功 能:写数据子程序,将数据输入T6963C
入口参数:data 想要写入的数据
出口参数:无
说 明:在写命令之前,状态位D0(STA0),D1(STA1)必须全为1
***********************************************************************/
unsigned char Busy(void)
{
unsigned char dat;
P4=0xd0;
IO=0xff;
P4=0x90;
dat=IO;
P4=0xd0;
return(dat);
}
/***********************************************************************
函数名称:LCD_WRite_Data()
功 能:写数据子程序,将数据输入T6963C
入口参数:data 想要写入的数据
出口参数:无
说 明:在写命令之前,状态位D0(STA0),D1(STA1)必须全为1
***********************************************************************/
void LCD_Write_Data(unsigned char data1)
{ unsigned char busym;
busym=Busy();
while(((busym)&0x03)!=0x03);
P4=0x40;
IO=data1;
P4=0xd0;
}
/***********************************************************************
函数名称:LCD_WRite_Command0()
功 能:写无参数命令字程序,将T6963C对应的指令写入,没有参数
入口参数:commond 想要写入的命令字
出口参数:无
说 明:在写命令之前,状态位D0(STA0),D1(STA1)必须全为1
***********************************************************************/
void LCD_Write_Command0(unsigned char command)
{ unsigned char busym;
busym=Busy();
while(((busym)&0x03)!=0x03) ;
P4=0x50;
IO=command;
P4=0xd0;
}
/***********************************************************************
函数名称:LCD_WRite_Command1()
功 能:写单参数命令字程序,将T6963C对应的指令写入
入口参数:commond 想要写入的命令字
出口参数:无
说 明:先送数据,再送命令字
***********************************************************************/
void LCD_Write_Command1(unsigned char command,unsigned char data1)
{
LCD_Write_Data(data1);
LCD_Write_Command0(command);
}
/***********************************************************************
函数名称:LCD_WRite_Command2()
功 能:写双参数命令子程序,将T6963C对应的指令写入
入口参数:commond 想要写入的命令字
出口参数:无
说 明:先送数据,再送命令字
***********************************************************************/
void LCD_Write_Command2(unsigned char command,unsigned char data1,unsigned char data2)
{
LCD_Write_Data(data1);
LCD_Write_Data(data2);
LCD_Write_Command0(command);
}
/************************************************************************
函数名称:LCD_T6963_Ini()
功 能:液晶模块初始化工作
入口参数:无
出口参数:无
说 明:初始化工作的主要要完成对文本方式的RAM起始地址的设定,文本模式的显示
宽度,图形方式的RAM的起始地址,以及其宽度;设置显示方式等工作.
**************************************************************************/
void LCD_T6963_Ini(void)
{
LCD_Write_Command2(LCD_TXT_STP,0x00,0x00); //设置文本方式RAM起始地址
LCD_Write_Command2(LCD_TXT_WID, 30,0x00); //设置文本方式的宽度,宽度为N/6或N/8)
LCD_Write_Command2(LCD_GRH_STP,0x00,0x08); //设置图形方式RAM起始地址
LCD_Write_Command2(LCD_GRH_WID, 30,0x00); //设置图形方式的宽度,宽度为N/6或N/8)
LCD_Write_Command0(LCD_CUR_SHP|0x07); //设置光标的形状
LCD_Write_Command0(LCD_MOD_OR); //设置显示方式为逻辑或方式
LCD_Write_Command0(LCD_DIS_SW|0x94); //设置文本显示方式
}
/***************************************************************************
函数名称:LCD_Fill_All()
功 能:LCD填充.对LCD的空间填入同一个数据
入口参数:dat
出口参数:无
说 明:填充,主要可用来对液晶进行清屏,只对其填入使屏为白的字就行了
****************************************************************************/
void LCD_Fill_All(unsigned char dat)
{
unsigned int i;
LCD_Write_Command2(LCD_ADR_POS,0x00,0x00); //置地址指针
LCD_Write_Command0(LCD_AUT_WR); //自动写
for(i=0;i<30*16;i++)
{
while((LCD_COM_ADD&0x08)!=0x08);
LCD_DAT_ADD=dat; //写数据
}
LCD_Write_Command0(LCD_AUT_OVR); //自动写关
LCD_Write_Command2(LCD_ADR_POS,0x00,0x00); //重置地址指针
}
/***************************************************************************显示英文数组
函数名称:LCD_Dis_Str()
功 能:能利用T9693C内部字符发生器CGROM,在液晶屏上显示西文数组
入口参数:x,y,*wordcode,*wordattr,wordlongth
出口参数:无
说 明:x,y对应是字符在屏上的字符坐标
****************************************************************************/
LCD_Dis_Str(unsigned char x,unsigned char y,unsigned char *wordcode,unsigned char wordlongth)
{
unsigned char i,xlable,ylable;
unsigned int dataadd;
dataadd=y*30+x;
xlable=dataadd&0xff;
ylable=dataadd/256; //计算字符RAM的地址
LCD_Write_Command0(LCD_DIS_SW|0x0c); //设置设置显示方式
LCD_Write_Command0(LCD_MOD_TCH); //设置为文本特征显示方式
LCD_Write_Command2(LCD_ADR_POS,xlable,ylable); //设置地址
for(i=0;i<wordlongth;i++) //写字符代码,利用内部GCROM
{
LCD_Write_Command1(LCD_INC_WR,wordcode[i]-32);
}
/* LCD_Write_Command2(LCD_ADR_POS,0x00,0x08); //写字符对应的特征位
for(i=0;i<wordlongth;i++)
{
LCD_Write_Command1(LCD_INC_WR,wordattr[i]);
}
*/
}
/*********************************************************************************建立CGRAM
函数名称:LCD_Mak_Cgr()
功 能:创建CGRAM,CGRAM中包含能用文本方式显示的自定义字符
入口参数:cgramnum
出口参数:无
说 明:在CGRAM中写入字符点阵
**********************************************************************************/
LCD_Mak_Cgr(unsigned char *cgram,unsigned char cgramnum)
{
unsigned int i;
LCD_Write_Command2(LCD_CGR_POS,0x03,0x00); //设置CGRAM偏置地址
LCD_Write_Command2(LCD_ADR_POS,0x00,0x1c); //设置RAM地址指针
LCD_Write_Command0(LCD_AUT_WR); //设置自动写方式
f