📄 lcddev_ra8806.c
字号:
#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 + -