📄 lcddriver.c
字号:
#include "Kernel.H"
#include "Driver\Lcd\ports\database.h"
#include "Driver\Lcd\ports\LcdhdPorts.h"
/************************************************************************************
*constant definition *
*************************************************************************************/
#define cLcdBusy 0
#define cLcdFree 1
#define cLcdNormal 0
#define cLcdReverse 1
#define cMetricsChar 0
#define cMetricsPixel 1
#define cLcdHdNormal 0
#define cLcdHdError 1
#define cInv 1
#define cNotInv 0
/************************************************************************************
*7981 registers definition *
*************************************************************************************/
#define LCD_REG_MODE 0
#define LCD_REG_CHA_PITCH 1
#define LCD_REG_CHA_NO 2
#define LCD_REG_DIV_NO 3
#define LCD_REG_CURSOR 4
#define LCD_REG_START_LADD 8
#define LCD_REG_START_HADD 9
#define LCD_REG_CUR_LADD 10
#define LCD_REG_CUR_HADD 11
#define LCD_REG_DATA 12
#define LCD_REG_READ 13
#define LCD_REG_BCLR 14
#define LCD_REG_BSET 15
/************************************************************************************
*internal variables definition *
*************************************************************************************/
INT8U bMaxPixelX;
INT8U bMaxPixelY;
INT8U bMaxCharX;
INT8U bMaxCharY;
INT8U bLcdCharX;
INT8U bLcdCharY;
INT16U wLcdAddress;
INT8U bMetricsMode;
INT8U bLcdReverse;
INT8U bLcdHdStatus;
/************************************************************************************
*Functions declaration *
*************************************************************************************/
void sLcdLightOn(void);
void sLcdLightOff(void);
INT8U sbLcdCheckBusy(void);
INT8U sbLcdReadData(void);
void sLcdWriteCommand(INT8U command);
void sLcdWriteData(INT8U data);
INT8U sbGetLcdHdStatus(void);
void sLcdInitial(INT8U xmax,INT8U ymax);
void sLcdMoveTo(INT8U x,INT8U y);
void sLcdReverse(void);
void sLcdNormal(void);
void sLcdPixelSet(INT8U x,INT8U y);
void sLcdPixelClr(INT8U x,INT8U y);
void sLcdHLine(INT8U x,INT8U y,INT16U len);
void sLcdVLine(INT8U x,INT8U y,INT16U len);
void sLcdFillRect(INT8U x0,INT8U y0,INT8U xLen,INT8U yLen);
void sLcdClearScreen(void);
INT8U LcdInvData(INT8U data);
void sLcdDisplayByte(INT16U addr,INT8U data,INT8U bInv);
void sLcdShowHalfWord(INT16U *pdata);
void sLcdShowWord(INT16U *pdata);
void sLcdShowSingleChar(INT16U code);
void sLcdShowString(INT8U x,INT8U y,INT8S *pString);
void sShowDynamicIcon(INT8U x,INT8U y);
extern void sReadBankedData(void);
void sLcdShowBmp(INT8U x,INT8U y,INT8U bWidth,INT8U bHeight,INT16U bDataAddr,INT8U bByteOrData);
/************************************************************************************
*Hardware related operations *
*************************************************************************************/
void sLcdLightOn(void)
{
M_LCD_LIGHT_ON();
}
void sLcdLightOff(void)
{
M_LCD_LIGHT_OFF();
}
/************************************************************************************
*Function name: sbLcdCheckBusy *
*returns: cLcdBusy: 0 Lcd is busy now *
* cLcdFree: 1 Lcd is free now *
*this function is related with 7981 timing *
*************************************************************************************/
INT8U sbLcdCheckBusy(void)
{
INT8U temp;
// OS_ENTER_CRITICAL();
mLcdSetELow();
mLcdSetRead();
mLcdSelRegister();
mLcdTasDly();
mLcdSetEHigh();
// OS_EXIT_CRITICAL();
mLcdTdhrDly();
// OS_ENTER_CRITICAL();
temp=sbLcdDataIn();
mLcdSetELow();
mLcdSetWrite();
mLcdSelData();
// OS_EXIT_CRITICAL();
if(temp&0x0080)
{
return(cLcdBusy);
}
else
{
return(cLcdFree);
}
// return cLcdFree;
}
/************************************************************************************
*Function name: sbLcdReadData *
*returns: data in ram *
*this function is related with 7981 timing *
*************************************************************************************/
INT8U sbLcdReadData(void)
{
INT8U i;
INT8U temp;
// OS_ENTER_CRITICAL();
mLcdSetELow();
i=0;
while(i<2)
{
i++;
}
mLcdSetRead();
mLcdSelData();
mLcdTasDly();
mLcdSetEHigh();
i=0;
while(i<5)
{
i++;
}
mLcdTdhrDly();
temp=sbLcdDataIn();
mLcdSetELow();
i=0;
while(i<2)
{
i++;
}
mLcdSetWrite();
mLcdSelData();
// OS_EXIT_CRITICAL();
return(temp);
}
/************************************************************************************
*Function name: sLcdWriteCommand *
*Parameters: command *
*this function is related with 7981 timing *
*************************************************************************************/
void sLcdWriteCommand(INT8U command)
{
INT16U i;
i=0;
while(sbLcdCheckBusy()==cLcdBusy)
{
i++;
if(i>=10)
{
bLcdHdStatus=cLcdHdError;
return;
}
}
mLcdSetELow();
i=0;
while(i<2)
{
i++;
}
// OS_ENTER_CRITICAL();
mLcdSelRegister();
mLcdSetWrite();
mLcdTasDly();
mLcdSetEHigh();
// OS_EXIT_CRITICAL();
i=0;
while(i<5)
{
i++;
}
// OS_ENTER_CRITICAL();
sLcdDataOut(command);
mLcdTdswDly();
mLcdSetELow();
// OS_EXIT_CRITICAL();
i=0;
while(i<2)
{
i++;
}
// OS_ENTER_CRITICAL();
mLcdSetWrite();
mLcdSelData();
// OS_EXIT_CRITICAL();
}
/************************************************************************************
*Function name: sLcdWriteData *
*Parameters: data *
*this function is related with 7981 timing *
*************************************************************************************/
void sLcdWriteData(INT8U data)
{
INT16U i;
i=0;
while(sbLcdCheckBusy()==cLcdBusy)
{
i++;
if(i>=10)
{
bLcdHdStatus=cLcdHdError;
return;
}
}
mLcdSetELow();
i=0;
while(i<2)
{
i++;
}
// OS_ENTER_CRITICAL();
mLcdSelData();
mLcdSetWrite();
mLcdTasDly();
mLcdSetEHigh();
// OS_EXIT_CRITICAL();
i=0;
while(i<5)
{
i++;
}
// OS_ENTER_CRITICAL();
sLcdDataOut(data);
mLcdTdswDly();
mLcdSetELow();
// OS_EXIT_CRITICAL();
i=0;
while(i<2)
{
i++;
}
mLcdSetWrite();
mLcdSelData();
}
/************************************************************************************
*Function name: sbGetLcdHdStatus *
*returns: cLcdHdNormal: Lcd hardware works normally *
* cLcdHdError: Lcd hardware works abnormally *
*************************************************************************************/
INT8U sbGetLcdHdStatus(void)
{
return(bLcdHdStatus);
}
/************************************************************************************
*Default settings: Graphic Mode *
* Ram start address: 0x0000 *
* 8 bit a byte *
*Paramters: bLineByteNo:How many bytes per line(column) *
* bLineNo:How many lines *
*************************************************************************************/
void sLcdInitial(INT8U xmax,INT8U ymax)
{
// INT16U i,j;
/* for (i=0;i<30000;i++)
{
mLcdDelay10us();
}*/
hoLcdReset = 0;
mLcdSetWrite();
mLcdSelData();
mLcdSetELow();
hoLcdReset = 1;
sLcdWriteCommand(LCD_REG_MODE);
sLcdWriteData(0x32);
sLcdWriteCommand(LCD_REG_CHA_PITCH);
sLcdWriteData(0x07);
sLcdWriteCommand(LCD_REG_CHA_NO);
sLcdWriteData((xmax>>3)-1);
sLcdWriteCommand(LCD_REG_DIV_NO);
sLcdWriteData(ymax);
sLcdWriteCommand(LCD_REG_CURSOR);
sLcdWriteData(0x00);
sLcdWriteCommand(LCD_REG_START_LADD);
sLcdWriteData(0x00);
sLcdWriteCommand(LCD_REG_START_HADD);
sLcdWriteData(0x00);
M_LCD_LIGHT_OFF();
bMaxPixelX=xmax;
bMaxPixelY=ymax;
bMaxCharX=xmax>>3;
bMaxCharY=ymax>>4;
bLcdReverse=cLcdNormal;
sDBInitial();
sLcdClearScreen();
}
/************************************************************************************
*Default settings: Graphic Mode *
* Ram start address: 0x0000 *
* 8 bit a byte *
*Paramters: bLineByteNo:How many bytes per line(column) *
* bLineNo:How many lines *
*************************************************************************************/
void sLcdReset(void)
{
hoLcdReset = 0;
mLcdSetWrite();
mLcdSelData();
mLcdSetELow();
hoLcdReset = 1;
sLcdWriteCommand(LCD_REG_MODE);
sLcdWriteData(0x32);
sLcdWriteCommand(LCD_REG_CHA_PITCH);
sLcdWriteData(0x07);
sLcdWriteCommand(LCD_REG_CHA_NO);
sLcdWriteData(19);
sLcdWriteCommand(LCD_REG_DIV_NO);
sLcdWriteData(80);
sLcdWriteCommand(LCD_REG_CURSOR);
sLcdWriteData(0x00);
sLcdWriteCommand(LCD_REG_START_LADD);
sLcdWriteData(0x00);
sLcdWriteCommand(LCD_REG_START_HADD);
sLcdWriteData(0x00);
}
/************************************************************************************
*Function name: sLcdMoveTo *
*Parameters: x,y *
*this function is used in both character and pixel mode *
*move the cursor to the pointed position *
*************************************************************************************/
void sLcdMoveTo(INT8U x,INT8U y)
{
if(bMetricsMode==cMetricsPixel)
{
wLcdAddress=(x+y*bMaxPixelX)>>3;
}
else if(bMetricsMode==cMetricsChar)
{
wLcdAddress=x+y*16*bMaxCharX;
bLcdCharX=x;
bLcdCharY=y;
}
sLcdWriteCommand(LCD_REG_CUR_LADD);
sLcdWriteData(wLcdAddress&0x00FF);
sLcdWriteCommand(LCD_REG_CUR_HADD);
sLcdWriteData(wLcdAddress>>8);
}
/************************************************************************************
*Function name: sLcdReverse sLcdNormal *
*these two functions define the reverse mode of LCD display *
*************************************************************************************/
void sLcdReverse(void)
{
bLcdReverse=cLcdReverse;
}
void sLcdNormal(void)
{
bLcdReverse=cLcdNormal;
}
/************************************************************************************
*Following functions are used only in pixel mode *
*************************************************************************************/
/************************************************************************************
*Function name: sLcdPixelSet *
*Parameters: x,y *
*this function is used in pixel mode *
*set the pixel of position x,y *
*************************************************************************************/
void sLcdPixelSet(INT8U x,INT8U y)
{
INT16U bitno;
bMetricsMode=cMetricsPixel;
sLcdMoveTo(x,y);
bitno=x+y*bMaxPixelX-wLcdAddress*8;
sLcdWriteCommand(LCD_REG_BSET);
sLcdWriteData(bitno);
}
/************************************************************************************
*Function name: sLcdPixelClr *
*Parameters: x,y *
*Description: this function is used in pixel mode *
* clear the pixel of position x,y *
*************************************************************************************/
void sLcdPixelClr(INT8U x,INT8U y)
{
INT16U bitno;
bMetricsMode=cMetricsPixel;
sLcdMoveTo(x,y);
bitno=x+y*bMaxPixelX-wLcdAddress*8;
sLcdWriteCommand(LCD_REG_BCLR);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -