⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcddev_ra8806.c

📁 RA8806底层驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
							 
#include      <c8051f020.h>                 // SFR declaratiONs  
#include    "DataTypeDef.H"		  
#include  "LcdDev_Ra8806.H" 
 #include  "GraphicHZ/HanZi48x48.C"  
 #include  "GraphicHZ/HanZi32x32.C"  
 #include  "GraphicHZ/ASCII_24x48.C"  
 #include  "GraphicHZ/ASCII_16x32.C"  

void LCD_ChkBusy(void);
 
static void LCD_Delay(INT16U KK)
{
   while(KK--) ;
}
/*******************************************************************************************************
**
**	                       LCD底层驱动部分代码
**
********************************************************************************************************/ 
																									  
/*******************************************************************************************************
** 名    称:                  void LCD_CmdWrite(INT8U CmdReg,INT8U CmdValue)
** 功    能:向LCD中写入指令数据
** 入口参数:CmdReg   
**           CmdValue
** 出口参数:无    
**----------------------------------------------------------------------------------------------------
** 作 者  : 严  俊  生
** 日 期  : 2009-01-26 
*******************************************************************************************************/
void LCD_CmdWrite(INT8U CmdReg)
{
     LCD_ChkBusy();                           // 判断 RA8803 是否忙碌中
	 LcdDataPort_OutPut();                    // 设置LCD总线的端口状态为输出   
	 //LCD_DataPort = CmdReg;					  // 准备预写入显示内存的数据  		
	 LcdCS_ON();                              // 片选LCD信号使能  
	 LcdRD_OFF();                             // "读"信号禁能  
	 LcdRS_INS();                             // 选择写入指令信号 
	  															 
	 LCD_DataPort = CmdReg;					  // 准备预写入显示内存的数据 
	 LcdWR_ON();							  // "写"信号使能  
	 //LCD_Delay(0);   		 
	 LcdWR_OFF();							  // "写"信号禁能  

	 LcdCS_OFF();                             // 片选LCD信号禁能   
} 

/*******************************************************************************************************
** 名    称:                  INT8U LCD_CmdRead(void)
** 功    能:读取LCD对应地址寄存器中到数据
** 入口参数:CmdReg  寄存器的地址
** 出口参数:寄存器中的内容    
**----------------------------------------------------------------------------------------------------
** 作 者  : 严  俊  生
** 日 期  : 2009-01-26 
*******************************************************************************************************/
INT8U LCD_CmdRead(void)
{	 INT8U CmdReg;   		   
   //------------------------------------------- 执行读寄存器内容时序操作
	 LcdDataPort_InPut();                     // 设置LCD总线的端口状态为输入  
	 LcdCS_ON();                              // 片选LCD信号使能 
	 //LcdRS_DAT();                             // 选择写入数据信号
	 LcdRS_INS();                             // 选择写入指令信号  
	 LcdWR_OFF();							  // "写"信号禁能     

	 LcdRD_ON();                              // "读"信号使能   
	 CmdReg = LCD_DataPort;  		
	 LcdRD_OFF();                             // "读"信号禁能 
	 	   													 
	 //LcdRS_OFF();                             // 指令/数据端口复位  
	 LcdCS_OFF();                             // 片选LCD信号禁能  
	 return CmdReg;
}	
/*******************************************************************************************************
** 名    称:                  void LCD_DataWrite(INT8U DatValue)
** 功    能:向LCD中写入指令数据
** 入口参数:DatValue   
** 出口参数:无    
**----------------------------------------------------------------------------------------------------
** 作 者  : 严  俊  生
** 日 期  : 2009-01-26 
*******************************************************************************************************/
void LCD_DataWrite(INT8U DatValue)
{

     LCD_ChkBusy();                           // 判断 RA8803 是否忙碌中
	 LcdDataPort_OutPut();                    // 设置LCD总线的端口状态为输出   
	 //LCD_DataPort = DatValue;				  // 准备预写入显示内存的数据  
	 LcdCS_ON();                              // 片选LCD信号使能 
	 LcdRD_OFF();                             // "读"信号禁能  
	 LcdRS_DAT();                             // 选择写入数据信号 
	 LcdWR_ON();							  // "写"信号使能 
	 LCD_DataPort = DatValue;				  // 准备预写入显示内存的数据  
	 LCD_Delay(10);  										 
	 LcdWR_OFF();							  // "写"信号禁能 
	 LcdCS_OFF();                             // 片选LCD信号禁能   
}  
void LCD_StringWrite(INT8U *pStr,INT8U StrLen,INT8U DispMode)
{
     INT16U i; 
     LCD_ChkBusy();                           // 判断 RA8803 是否忙碌中
	 LcdDataPort_OutPut();                    // 设置LCD总线的端口状态为输出  
	 LcdRS_INS();                             // 选择写入指令信号 
	 LcdRD_OFF();                             // "读"信号禁能  	  		
	 LcdCS_ON();                              // 片选LCD信号使能   
	  													
	 LCD_DataPort = 0xB0;					  // 准备预写入显示内存的数据 
	 LcdWR_ON();							  // "写"信号使能  
	 //LCD_Delay(0);   		 
	 LcdWR_OFF();							  // "写"信号禁能  

	 LcdCS_OFF();                             // 片选LCD信号禁能   
 		  
	 LcdRS_DAT();                             // 选择写入数据信号 	
	 LcdCS_ON();                              // 片选LCD信号使能  
	 for(i=0; i<StrLen; i++)
	 {	
	 if(DispMode == 1)	
	    LCD_DataPort = ((*pStr++));				  // 准备预写入显示内存的数据  
	 else
	    LCD_DataPort = (~(*pStr++));				  // 准备预写入显示内存的数据  
	 LcdWR_ON();							  // "写"信号使能 
	 //LCD_Delay(0);  										 
	 LcdWR_OFF();	                          // "写"信号禁能 
	 }							  

	 LcdCS_OFF();                             // 片选LCD信号禁能   
}  

INT8U LCD_DataRead(void)
{   INT8U uData;   
     LCD_ChkBusy();                           // 判断 RA8803 是否忙碌中
   //------------------------------------------- 执行读寄存器内容时序操作
	 LcdDataPort_InPut();                     // 设置LCD总线的端口状态为输入  
	 LcdCS_ON();                              // 片选LCD信号使能 
	 LcdRS_DAT();                             // 选择写入数据信号
	 //LcdRS_INS();                             // 选择写入指令信号  
	 LcdWR_OFF();							  // "写"信号禁能     

	 LcdRD_ON();                              // "读"信号使能   
	 uData = LCD_DataPort;  		
	 LcdRD_OFF();                             // "读"信号禁能 
	 	   													 
	 LcdRS_OFF();                             // 指令/数据端口复位  
	 LcdCS_OFF();                             // 片选LCD信号禁能  
	 return uData;
}
 
//==============================================================================
//Subroutine:	LCD_ChkBusy
//Function:		
//==============================================================================
void LCD_ChkBusy(void)
{
	volatile INT8U temp; 
	do
	{
		temp = LCD_CmdRead();
		LCD_Delay(10);  
	}while(temp & 0xC0);
}

/*******************************************************************************************************
**																									  **
**	                                     LCD控制部分代码				   						      **
**																									  **
********************************************************************************************************/ 
																									   
void LcdReset(void)
{	
	 LedReset_ON();	          
	 LCD_Delay(2000); 
 	 LedReset_OFF();           
	 LCD_Delay(25000); 
	 LedReset_ON();	          
	 LCD_Delay(65000); 	   
}    

//==============================================================================
//Subroutine:	LCD_On
//Function:
//==============================================================================
void LCD_ON(void)
{
	unsigned char temp;

	LCD_CmdWrite(WLCR);
	temp = LCD_DataRead();
	temp |= cSetb2;
	LCD_CmdWrite(WLCR);
	LCD_DataWrite(temp);
}  
//==============================================================================
//Subroutine:	LCD_OFF
//Function:
//==============================================================================
void LCD_OFF(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(WLCR);
	temp = LCD_DataRead();
	temp &= cClrb2;
	LCD_CmdWrite(WLCR);
	LCD_DataWrite(temp);
} 
//==============================================================================
//Subroutine:	LCD_Text
//Function:
//============================================================================== 
void LCD_Text(void)
{
	unsigned char temp; 
	LCD_CmdWrite(WLCR);
	temp = LCD_DataRead();
	temp |= cSetb3;
	LCD_CmdWrite(WLCR);
	LCD_DataWrite(temp);
}
//==============================================================================
//Subroutine:	LCD_Graphic
//Function:
//==============================================================================
void LCD_Graphic(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(WLCR);
	temp = LCD_DataRead();
	temp &= cClrb3;
	LCD_CmdWrite(WLCR);
	LCD_DataWrite(temp);
} 
 
//==============================================================================
//Subroutine:	Reverse_Data
//Function:
//==============================================================================
void Reverse_Data(void)
{
	unsigned char temp; 
	LCD_CmdWrite(WCCR);
	temp = LCD_DataRead();
	temp |= (cSetb4);
	LCD_CmdWrite(WCCR);
	LCD_DataWrite(temp);
}

//==============================================================================
//Subroutine:	Access_2Page
//Function:
//==============================================================================
/*
void Access_Page0(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(MAMR);
	temp = LCD_DataRead();
	temp &= cClrb1;
	temp &= cClrb0;
	LCD_CmdWrite(MAMR);
	LCD_DataWrite(temp);
}
//==============================================================================
//Subroutine:	Access_Page2
//Function:
//==============================================================================
void Access_Page2(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(MAMR);
	temp = LCD_DataRead();
	temp |= cSetb1;
	temp &= cClrb0;
	LCD_CmdWrite(MAMR);
	LCD_DataWrite(temp);
}
  
*/
//==============================================================================
//Subroutine:	Access_Page1
//Function:
//==============================================================================
void Access_Page1(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(MAMR);
	temp = LCD_DataRead();
	temp &= cClrb1;
	temp |= cSetb0;
	LCD_CmdWrite(MAMR);
	LCD_DataWrite(temp);
}

//==============================================================================
//Subroutine:	Access_2Page
//Function:
//==============================================================================
void Access_2Page(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(MAMR);
	temp = LCD_DataRead();
	temp |= cSetb1;
	temp |= cSetb0;
	LCD_CmdWrite(MAMR);
	LCD_DataWrite(temp);
}  
//==============================================================================
//Subroutine:	Fill_PNTR_to_DPRAM
//Function:
//==============================================================================
void Fill_PNTR_to_DPRAM(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(FNCR);	
	temp = LCD_DataRead();
	temp |= cSetb3;
	LCD_CmdWrite(FNCR);
	LCD_DataWrite(temp);

	do{
		LCD_Delay(0);
	}while(LCD_CmdRead() & 0x80);

}

 unsigned char Lcd_ReadReg(unsigned char CmdReg)
 {     
       LCD_CmdWrite(CmdReg);     // 选择需要读取寄存器的地址
       CmdReg = LCD_DataRead();    
	   return CmdReg;
 } 
//==============================================================================
//Subroutine:	Only_Show_Page1
//Function:
//==============================================================================
void Only_Show_Page1(void)
{
	unsigned char temp;
	
	LCD_CmdWrite(MAMR);
	temp = LCD_DataRead();
	temp &= cClrb6;
	temp &= cClrb5;
	temp |= cSetb4;
	LCD_CmdWrite(MAMR);
	LCD_DataWrite(temp);
} 
/*******************************************************************************************************
** 名    称:                  void LcdClear(void)
** 功    能:向LCD中写入指令数据
** 入口参数:DatValue   
** 出口参数:无    
**----------------------------------------------------------------------------------------------------
** 作 者  : 严  俊  生
** 日 期  : 2009-01-26 
*******************************************************************************************************/ 
void Lcd_ClearScreen(void)
{	     	
	LCD_Graphic();
	Access_2Page(); 
	LCD_CmdWrite(PNTR);
	LCD_DataWrite(0x00); 
	Fill_PNTR_to_DPRAM();
} 
/*******************************************************************************************************
** 名    称:                  void LcdClear(void)
** 功    能:设定 显示坐标 (内存地址) 子程序
** 入口参数:无  
** 出口参数:无    
**----------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -