?? lcdb_driver.c
字號(hào):
}
else if(id == 2)
{
para = MAP3|CURSOR;
LCDBGraph_BaseAddr = SAD3_ADDR;
}
else
return FALSE;
LCDB_WriteCmdPara(CMD_DISPON, ¶, 1);
return TRUE;
}
/***********************************************************************************
* Function: LCDB_DrawPixel;
*
* Description: 畫點(diǎn)(x,y);
*
* Input: x, LCD行坐標(biāo); y, LCD列坐標(biāo); bit類型標(biāo)識(shí)mode,1:畫點(diǎn),0:擦除點(diǎn);
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDB_DrawPixel(unsigned int x, y, bit mode)
{
unsigned int xdata StartAddr;
unsigned char xdata val,dat;
StartAddr=x*LCDB_LineChar + (y>>3) + LCDBGraph_BaseAddr;
y = (unsigned char)y&0x07;
LCDB_WriteCmd(CMD_CSRDOWN);
LCDB_WriteCmd(CMD_CSRW); // 設(shè)置光標(biāo)地址
LCDB_WriteData((unsigned char)StartAddr); // 計(jì)算光標(biāo)地址
LCDB_WriteData((unsigned char)(StartAddr>>8));
LCDB_WriteCmd(CMD_MREAD); // MREAD 代碼
dat=LCDB_ReadData(); // 讀取當(dāng)前顯示數(shù)據(jù)
val = 0x01<<(7-y);
if(mode)
val = val|dat;
else
val = (~val)&dat;
LCDB_WriteCmd(CMD_CSRW); // 設(shè)置光標(biāo)地址
LCDB_WriteData((unsigned char)StartAddr); // 計(jì)算光標(biāo)地址
LCDB_WriteData((unsigned char)(StartAddr>>8));
LCDB_WriteCmd(CMD_MWRITE); // MWRITE 代碼
LCDB_WriteData(val); // 寫入合成數(shù)據(jù)
}
/***********************************************************************************
* Function: LCDB_DrawLine;
*
* Description: (x1,y1)--(x2,y2)處劃線;
*
* Input: x1,x2, LCD行坐標(biāo); y1,y2, LCD列坐標(biāo); bit類型標(biāo)識(shí)mode,1:畫直線:擦除直線;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDB_DrawLine(unsigned int x1, y1, x2, y2, bit mode)
{
unsigned int xdata x,y;
double xdata k,b;
if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
{
k=(float)(y2-y1) / (float)(x2-x1) ;
b=y1-k*x1;
if( x1 <= x2 )
{
for(x=x1;x<=x2;x++)
{
y=k*x+b;
LCDB_DrawPixel(x, y, mode);
}
}
else
{
for(x=x2;x<=x1;x++)
{
y=k*x+b;
LCDB_DrawPixel(x, y, mode);
}
}
}
else // abs(y1-y2) > abs(x1-x2) |K|>1
{
k=(float)(x2-x1) / (float)(y2-y1) ;
b=x1-k*y1;
if( y1 <= y2 )
{
for(y=y1;y<=y2;y++)
{
x=k*y+b;
LCDB_DrawPixel( x , y, mode);
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=k*y+b;
LCDB_DrawPixel( x , y, mode);
}
}
}
}
/***********************************************************************************
* Function: LCDB_DrawRectangle;
*
* Description: 以(x1,y1)和(x2,y2)為對(duì)角點(diǎn)畫矩形;
*
* Input: x1,x2, LCD行坐標(biāo); y1,y2, LCD列坐標(biāo); bit類型標(biāo)識(shí)mode,1:畫矩形,0:擦除矩形;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDB_DrawRectangle(unsigned int x1, y1, x2, y2, bit mode)
{
LCDB_DrawLine(x1,y1,x2,y1,mode);
LCDB_DrawLine(x1,y1,x1,y2,mode);
LCDB_DrawLine(x2,y1,x2,y2,mode);
LCDB_DrawLine(x1,y2,x2,y2,mode);
}
/***********************************************************************************
* Function: LCDB_DrawFillRectangle;
*
* Description: 以(x1,y1)和(x2,y2)為對(duì)角點(diǎn)畫矩形實(shí)體;
*
* Input: x1,x2, LCD行坐標(biāo); y1,y2, LCD列坐標(biāo); bit類型標(biāo)識(shí)mode,1:畫矩形實(shí)體,0:擦除矩形實(shí)體;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDB_DrawFillRectangle(unsigned int x1, y1, x2, y2, bit mode)
{
unsigned int xdata i;
for (i=x1; i<=x2; i++)
LCDB_DrawLine(i,y1,i,y2,mode);
}
/***********************************************************************************
* Function: LCDB_DrawCircle;
*
* Description: 以(x,y)為圓心, r為半徑畫圓;
*
* Input: x, LCD行坐標(biāo); y, LCD列坐標(biāo); bit類型標(biāo)識(shí)mode,1:畫圓,0:擦除圓;
*
* Output: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void LCDB_DrawCircle(unsigned int x, y, r, bit mode)
{
unsigned int xdata r_2,i,x1,y1,temp_x;
unsigned int xdata temp;
r_2=0.707*r;
temp=r*r;
for (i=0; i<=r_2; i++)
{
if (mode)
{
if (!(i&0x01))
{
x1=i;
y1=sqrt(1.0*(temp-x1*x1))+0.5;
LCDB_DrawPixel(x1+x,y1+y,mode);
LCDB_DrawPixel(-x1+x,y1+y,mode);
LCDB_DrawPixel(x1+x,-y1+y,mode);
LCDB_DrawPixel(-x1+x,-y1+y,mode);
temp_x=x1;
x1=y1;
y1=temp_x;
LCDB_DrawPixel(x1+x,y1+y,mode);
LCDB_DrawPixel(-x1+x,y1+y,mode);
LCDB_DrawPixel(x1+x,-y1+y,mode);
LCDB_DrawPixel(-x1+x,-y1+y,mode);
}
}
else
{
x1=i;
y1=sqrt(1.0*(temp-x1*x1))+0.5;
LCDB_DrawPixel(x1+x,y1+y,mode);
LCDB_DrawPixel(-x1+x,y1+y,mode);
LCDB_DrawPixel(x1+x,-y1+y,mode);
LCDB_DrawPixel(-x1+x,-y1+y,mode);
temp_x=x1;
x1=y1;
y1=temp_x;
LCDB_DrawPixel(x1+x,y1+y,mode);
LCDB_DrawPixel(-x1+x,y1+y,mode);
LCDB_DrawPixel(x1+x,-y1+y,mode);
LCDB_DrawPixel(-x1+x,-y1+y,mode);
}
}
}
/***********************************************************************************
* Function: LCDB_DrawByte;
*
* Description: 向LCD(x,y)點(diǎn)開(kāi)始寫一個(gè)字節(jié)數(shù)據(jù);
*
* Input: x, LCD行坐標(biāo); y, LCD列坐標(biāo); value,寫入字節(jié)數(shù)據(jù);
*
* Output: none;
*
* Return: none;
*
* Note: 應(yīng)盡量使y(LCD列坐標(biāo))是8的整數(shù)倍,可使顯示速度加快;
************************************************************************************/
void LCDB_DrawByte(unsigned int x, y, unsigned char val)
{
unsigned char xdata dat1,dat2,bit_x;
unsigned int xdata StartAddr;
bit_x=(unsigned char)y&0x07;
StartAddr=x*LCDB_LineChar + (y>>3) + LCDBGraph_BaseAddr;
if (bit_x==0)
{
LCDB_WriteCmd(CMD_CSRW); // 設(shè)置光標(biāo)地址
LCDB_WriteData((unsigned char)StartAddr); // 計(jì)算光標(biāo)地址
LCDB_WriteData((unsigned char)(StartAddr>>8));
LCDB_WriteCmd(CMD_MWRITE); // MWRITE 代碼
LCDB_WriteData(val); // 寫入合成數(shù)據(jù)
}
else
{
LCDB_WriteCmd(CMD_CSRRGT);
LCDB_WriteCmd(CMD_CSRW); // 設(shè)置光標(biāo)地址
LCDB_WriteData((unsigned char)StartAddr); // 計(jì)算光標(biāo)地址
LCDB_WriteData((unsigned char)(StartAddr>>8));
LCDB_WriteCmd(CMD_MREAD); // MREAD 代碼
dat1=LCDB_ReadData(); // 讀取當(dāng)前顯示數(shù)據(jù)
dat2=LCDB_ReadData(); // 讀取當(dāng)前顯示數(shù)據(jù)
dat1&=(0xff<<(8-bit_x));
dat1|=(val>>bit_x);
dat2&=(0xff>>bit_x);
dat2|=(val<<(8-bit_x));
LCDB_WriteCmd(CMD_CSRRGT);
LCDB_WriteCmd(CMD_CSRW); // 設(shè)置光標(biāo)地址
LCDB_WriteData((unsigned char)StartAddr); // 計(jì)算光標(biāo)地址
LCDB_WriteData((unsigned char)(StartAddr>>8));
LCDB_WriteCmd(CMD_MWRITE); // MWRITE 代碼
LCDB_WriteData(dat1); // 寫入合成數(shù)據(jù)
LCDB_WriteData(dat2); // 寫入合成數(shù)據(jù)
}
}
/***********************************************************************************
* Function: LCDB_ShowHZxy;
*
* Description: 從LCD(x,y)點(diǎn)開(kāi)始顯示(line*col)的字符;
*
* Input: x, LCD行坐標(biāo); y, LCD列坐標(biāo); line,字符占用行數(shù); col,字符占用列數(shù);
* *p,字符數(shù)據(jù)指針;
*
* Output: none;
*
* Return: none;
*
* Note: 應(yīng)盡量使y(LCD列坐標(biāo))是8的整數(shù)倍,可使顯示速度加快; 本函數(shù)也可作為自定義圖形顯示;
************************************************************************************/
void LCDB_ShowHZxy(unsigned int x, y, unsigned int line, col, unsigned char *p)
{
unsigned int xdata i,j;
for(i=0;i<line;i++)
{
for(j=0;j<col;j+=8)
LCDB_DrawByte(x+i,y+j,*p++);
}
}
/************************************************************************************
* 文件結(jié)束
************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -