| 本帖最后由 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();
 }
 |