本帖最后由 new1988 于 2010-5-25 09:46 编辑
LCD24064.C文件
#include <c8051f020.h>
#include <intrins.h>
#include "LCD24064.h"
extern ucControl; //对端口操作的变量,因为P4口不能位寻址,所以用个全局变量来保存端口的值。从而在操作液晶时不影响P4口的其他端口的电平。
uchar xdata ucTxtHome; //当前文本窗口的序号
/***************************************************
*函数原型: uchar ReadStatus( void )
*输入: 无
*输出: 读出来的状态字
*功能: 读出液晶当前状态字的值
***************************************************/
uchar ReadStatus( void )
{
uchar xdata ucStatus;
DATA_PORT = 0xff; //设置数据口为读
ucControl |= 0xf8;
ucControl &= READ_STATUS;
CON_PORT = ucControl;
_nop_();
_nop_();
_nop_();
ucStatus = DATA_PORT;
_nop_();
_nop_();
_nop_();
ucControl |= 0x30; //RD=1, CE = 1;
CON_PORT = ucControl;
return ucStatus;
}
/***************************************************
*函数原型: uchar CheckST01( void )
*输入: 无
*输出:
*功能: 检测状态字的第一和第二位,读和写位
***************************************************/
uchar CheckST01( void )
{
uchar i, j;
for( i = 10; i >0; i-- )
{
j = ReadStatus();
if( ( j & 0x3 ) == 0x3 )
break;
}
return i;
}
/***************************************************
*函数原型: uchar CheckST02( void )
*输入: 无
*输出:
*功能: 检测状态字的第三位,连读位
***************************************************/
uchar CheckST02( void )
{
uchar i, j;
for( i = 10; i >0; i-- )
{
j = ReadStatus();
if( ( j & 0x4 ) == 0x4 )
break;
}
return i;
}
/***************************************************
*函数原型: uchar CheckST03( void )
*输入: 无
*输出:
*功能: 检测状态字的第四位,连写位
***************************************************/
uchar CheckST03( void )
{
uchar i, j;
for( i = 10; i > 10; i-- )
{
j = ReadStatus();
if( ( j & 0x8 ) == 0x8 )
break;
}
return i;
}
/***************************************************
*函数原型: uchar WriteLCDCmd( uchar ucCmd )
*输入: 要写入的命令
*输出:
*功能: 向LCD中写入命令
***************************************************/
uchar WriteLCDCmd( uchar ucCmd )
{
if( CheckST01() == 0 )
return 1;
else
{
DATA_PORT = ucCmd;
ucControl |= 0xf8;
ucControl &= WRITE_CMD;
CON_PORT = ucControl;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ucControl |= 0x28; //WR=1, CE =1;
CON_PORT = ucControl;
return 0;
}
}
/***************************************************
*函数原型: uchar WriteLCDData( uchar ucData )
*输入: 要写入的数据
*输出:
*功能: 向LCD中写入数据
***************************************************/
uchar WriteLCDData( uchar ucData )
{
if( CheckST01() == 0 )
return 1;
else
{
DATA_PORT = ucData;
ucControl |= 0xf8;
ucControl &= WRITE_DATA;
CON_PORT = ucControl;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ucControl |= 0x28; //WR=1,CE = 1;
CON_PORT = ucControl;
return 0;
}
}
/***************************************************
*函数原型: void WriteCmdChar( uchar ucCmd, uchar ucPar)
*输入: 要写入命令和其参数
*输出:
*功能: 向LCD中写入带一个参数的命令
***************************************************/
void WriteCmdChar( uchar ucCmd, uchar ucPar)
{
WriteLCDData( ucPar );
WriteLCDCmd( ucCmd );
}
/***************************************************
*函数原型: void WriteCmdByte( uchar ucCmd, uint uiPar)
*输入: 要写入命令和其参数
*输出:
*功能: 向LCD中写入带两个参数的命令
***************************************************/
void WriteCmdByte( uchar ucCmd, uchar ucPar1, uchar ucPar2)
{
WriteLCDData( ucPar1 );
_nop_();
_nop_();
_nop_();
WriteLCDData( ucPar2 );
_nop_();
_nop_();
_nop_();
WriteLCDCmd( ucCmd );
_nop_();
_nop_();
_nop_();
}
/***************************************************
*函数原型: void RunningWrite( uchar ucData )
*输入: 连续写入的数据
*输出:
*功能: 向LCD中连续写入数据,地址自动加一
***************************************************/
void RunningWrite( uchar ucData )
{
if( CheckST03() == 0 )
return;
else
{
WriteLCDData( ucData );
}
}
/***************************************************
*函数原型: void CharAddPos( uchar ucCol, uchar ucRow )
*输入: 行值和列值
*输出:
*功能: 设置地址指针
*说明: 文本窗口宽度为30个字节
***************************************************/
void CharAddPos( uchar ucRow, uchar ucCol )
{
uint uiPos;
uiPos = ucRow * 30 + ucCol;
WriteCmdByte( LC_ADD_POS, uiPos & 0xff, ( uiPos>>8) & 0xff );
}
/***************************************************
*函数原型: void ClearScreen( void )
*输入:
*输出:
*功能: 清屏
*说明: 文本窗口宽度为30个字节
***************************************************/
void ClearScreen( void )
{
uint i;
CharAddPos( 2, 2 ); //这里无论写什么地址都没用,都是从头始 WriteLCDCmd( LC_AUT_WR ); //自动写开始
for( i = 0; i < 64*30 ; i++ )
{
RunningWrite( 0x00); //这里无论写什么数都能写进去
}
WriteLCDCmd( LC_AUT_OVR ); //自动写结束
CharAddPos( 0, 0 ); //恢复起始指针
}
/***************************************************
*函数原型: void ResetLCD
*输入:
*输出:
*功能: 复位液晶
*说明:
***************************************************/
void ResetLCD( void )
{
ucControl &= 0x7f;
CON_PORT = ucControl;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ucControl |= 0x80;
CON_PORT = ucControl;
}
/***************************************************
*函数原型: void InitLCD( void )
*输入:
*输出:
*功能: 初始化LCD
*说明:
***************************************************/
void InitLCD( void )
{
ResetLCD(); //复位液晶
WriteLCDCmd( LC_MOD_OR ); //显示方式设置
WriteLCDCmd( LC_DIS_SW | 0x06 ); //开显示
/* WriteCmdByte( LC_TXT_STP, 0x0, 0x0 ); //设置文本显示的起始地址
WriteCmdByte( LC_TXT_WID, 0x1e,0x0 ); //设置文本显示的宽度
ucTxtHome = TXTSTART; */
WriteCmdByte( LC_GRH_STP, 0x0, 0x0 ); //设置文本显示的起始地址
WriteCmdByte( LC_GRH_WID, 0x1e,0x0 ); //设置文本显示的宽度
ClearScreen();
} |