使用的是TIANMA公司的TM128×32AD P1-1的图形液晶显示器
驱动器为HD61202U
**************************************************************/
//**********包含头文件***************
#include <PublicHead.h>
#include <Lcd.h>
//*************端口定义**********************
sbit LCD12832_DI = P3 ^ 4; //数据或命令危
//为1表示要显示的数据,为0表示控制数据
sbit LCD12832_RW = P3 ^ 3; //读写
//为1表示读出,为0表示写入
sbit LCD12832_E = P3 ^ 2; //使能端,wei0 you xiao
sbit LCD12832_CS = P3 ^ 7; //片选,wei 1 you xiao//一下订正同此
#define LCD12832_DATA P2 //数据口
void ClearScreen( UNCHAR, UNCHAR, UNCHAR ); //清屏操作
UNCHAR StatusRead(); //读液晶当前状态
void SetX( UNCHAR ); //设置x轴位置,以字符行8个点管理
void SetY( UNCHAR ); //设置y轴位置
void SetStartLine( UNCHAR ); //设置StartLine轴位置
void WriteDisplayData( UNCHAR ); //向RAM写要求显示的数据
UNCHAR ReadDisplayData( UNCHAR );//从RAM读出显示的数据
void SetDisplayOn( void ); //设置显示开
void SetDisplayOff( void ); //设置显示关
/**************************************/
//******设置内部RAM地址指令********
//************************************************
//******设置x轴位置
void SetX( x ) //设置x轴位置,要求W/R=0,D/I=0以字符行管理
UNCHAR x;
{
UNCHAR h;
h = StatusRead(); //检测状态
while ( h & 0x80 ); //此时的wr=1,di=0
LCD12832_RW = 0; //此时的wr=0,di=0
LCD12832_DATA = ( x * 8 ) & 0x0BF; //写入参数,乘8==> 这样便于以字符行管理
LCD12832_CS = 1; //片选,wei 0 you xiao
LCD12832_E = 0; //使能端,wei0 you xiao
}
//************************************************
//******设置y轴位置
void SetY( y ) //设置y轴位置,要求W/R=0,D/I=0
UNCHAR y;
{
UNCHAR h;
h = StatusRead(); //检测状态
while ( h & 0x80 );
LCD12832_RW = 0; //此时的wr=0,di=0
LCD12832_DATA = y & 0x7F; //写入参数 //写入参数
LCD12832_CS = 1; //片选,wei 0 you xiao
LCD12832_E = 0; //使能端,wei0 you xiao
}
//************************************************
//******设置开始行
void SetStartLine( StartLine ) //设置StartLine轴位置,要求W/R=0,D/I=0
UNCHAR StartLine;
{
UNCHAR h;
h = StatusRead(); //检测状态
while ( h & 0x80 );
LCD12832_RW = 0; //此时的wr=0,di=0
LCD12832_DATA = StartLine & 0x0FF; //写入参数 //写入参数
LCD12832_CS = 1; //片选,wei 0 you xiao
LCD12832_E = 0; //使能端,wei0 you xiao
}
//******设置内部RAM数据读写指令********
//************************************************
//******写液晶,一次一个字节
void WriteDisplayData( W_DisplayData ) //向RAM写要求显示的数据
UNCHAR W_DisplayData;
{
UNCHAR h;
h = StatusRead(); //检测状态
while ( h & 0x80 ); //此时的wr=0,di=0
LCD12832_RW = 0;
LCD12832_DI = 1; //此时的wr=0,di=1
LCD12832_DATA = W_DisplayData; //写入参数
LCD12832_CS = 1; //片选,wei 0 you xiao
LCD12832_E = 0; //使能端,wei0 you xiao
}
//************************************************
//******读液晶,一次一个字节
UNCHAR ReadDisplayData( R_RAM_Address ) //从RAM读出显示的数据,要求W/R=1,D/I=1
UNCHAR R_RAM_Address;
{
UNCHAR RAM_data, h;
h = StatusRead(); //检测状态
while ( h & 0x80 ); //此时的wr=0,di=0
LCD12832_RW = 1;
LCD12832_DI = 1; //此时的wr=0,di=1
RAM_data = LCD12832_DATA;
LCD12832_CS = 1; //片选,wei 0 you xiao
LCD12832_E = 0; //使能端,wei0 you xiao
return RAM_data;
}
//******其他类型指令********
//************************************************
//******读液晶当前状态
UNCHAR StatusRead() //读液晶当前状
{
UNCHAR statuOfYj;
LCD12832_CS = 0; //片选,wei 0 you xiao
LCD12832_E = 1; //使能端,we1 you xiao
LCD12832_RW = 1; //读写
//为1表示读出,为0表示写入
LCD12832_DI = 0; //数据或命令危
//为1表示要显示的数据,为0表示控制数据
LCD12832_DATA = 0xff; //数据口,读前置全1
statuOfYj = LCD12832_DATA; //读出液晶状态
return statuOfYj; //返回
}
//************************************************
//******设置关屏幕
void SetDisplayOff( void )
{
UNCHAR h;
h = StatusRead(); //检测状态
while ( h & 0x80 );
LCD12832_DATA = 0x3E; //写入参数
LCD12832_CS = 1; //片选,wei 0 you xiao
LCD12832_E = 0; //使能端,wei0 you xiao
}
//************************************************
//******设置开屏幕
void SetDisplayOn( void )
{
UNCHAR h;
h = StatusRead(); //检测状态
while ( h & 0x80 );
WriteDisplayData( 0x3F ); //写入参数
LCD12832_CS = 1; //片选,wei 0 you xiao
LCD12832_E = 0; //使能端,wei0 you xiao
}
//************************************************
//******清屏
void ClearScreen( x, y, no ) //清屏操
UNCHAR x, y, no;
{
UNCHAR addressX, addressY;
UNINT i;
addressX = x;
addressY = y;
i = no;
//*暂时关闭显示*/
SetDisplayOff(); //设置显示开/关 ---即关闭一切显示
//设置开始清除的首地址
SetX( addressX ); //设置x
SetY( addressY ); //设置y
for ( i = 0; i < 0x0200; i++ ) //0x0200=128*32/8
{
WriteDisplayData( 0x00 ); //*写入一个数据或命令参数,每小次清除8个点点
}
//*开启显示*/
SetDisplayOn(); //设置显示开/关
}
//**********************************
// 汉字或ASCII码的显示 *
//**********************************
//****显示一个汉字8×16,ch为编号
void putChar16( UNCHAR ch, UNCHAR x, UNCHAR y )//ch表示字符在 字库里面的编号,
x,y为他的地?
{
UNINT offInHZK;
UNCHAR i = 0;
//*计算汉字在汉字库的位置*/
offInHZK = ( ch - 1 ) * 32;
offInHZK = offInHZK + 0xd000; //0xd000
while ( i < 16 )
{
ch = CBYTE[offInHZK++];
SetX( x ); //设置x轴位置
SetY( y ); //设置y轴位置
WriteDisplayData( ch ); //向RAM写要求显示的数据
i++;
}
}