?? drvsed1335.c
字號:
//
// 輸入: 無
//
// 輸出: 無
//
void
ClearScreen(void)
{
int i;
//
// 光標向右,在圖形顯示區將顯存全部清零
//
_LCDCom(CSR_RIGHT);
_SetCursor(0, 0);
_LCDCom(MWRITE);
for (i = 0;
i < SCREEN_WIDTH * SCREEN_HIGHT / 8;
i++)
{
_LCDData(0x00);
}
}
//
// 設置前景顏色
//
// 輸入: color 前景區的顏色
//
// 輸出: 設置成功標志
//
int
SetColor(
IN INT32U color
)
{
if (color)
{
_Color = 1;
}
else
{
_Color = 0;
}
return 1;
}
//
// 設置X方向刷新坐標最大限制值
//
// 輸入: limit X方向屏幕刷新的最大限制值
//
// 輸出: 設置成功標志
//
int
SetXRefreshLimit(
IN INT32U limit
)
{
if (limit > SCREEN_WIDTH
||
limit == 0)
{
return -1;
}
_XRefreshLimit = limit;
return 1;
}
//
// 初始化LCD顯示參數以及界面
//
// 輸入: 無
//
// 輸出: 無
//
void
InitLCD(void)
{
int i;
_LCDPortInit();
_LCDCom(SYSTEM_SET); // System config
for (i = 0; i < 8; i++)
{
_LCDData(SYSTAB[i]);
}
_LCDCom(SCROLL); // Scroll settings
for (i = 0; i < 10; i++)
{
_LCDData(SCRTAB[i]);
}
_LCDCom(HDOT_SCR);
_LCDData(0x00); // 0000 0000
_LCDCom(OVLAY);
_LCDData(0x01); // 0000 0110 OV: 0, DM1: 1, DM2: 0 MX1: 1, MX2: 0
_LCDCom(DISP_OFF);
_LCDData(0x00);
_ClearMemory();
_LCDCom(CSRW);
_LCDData(0x00); // 0000 0000 CSRL: 0x00
_LCDData(0x00); // 0000 0000 CSRH: 0x00
_LCDCom(CSRFORM);
_LCDData(0x00); // 0000 0001 CRX: 1
_LCDData(0x8f); // 1000 1111 CM: 0, CRY: 15
_LCDCom(DISP_ON);
_LCDData(0x56); // 0001 0110
_LCDCom(CSR_RIGHT);
_SetCursor(0, 0);
SetColor(GUI_WHITE);
SetXRefreshLimit(SCREEN_WIDTH);
}
//
// 畫點函數
//
// 輸入: x 橫軸坐標
// y 縱軸坐標
// color 顏色
//
// 輸出: 畫點成功與否標志
//
int
DrawPoint(
IN INT32U x,
IN INT32U y,
IN INT32U color
)
{
BYTE newcolor;
BYTE offset = 1 << (7 - (x % 8));
//
// 畫點原理:
// 首先將光標移至畫點處,讀出當前該點處的信息,
// 將該信息和畫點所需要的顏色通過邏輯加工后,重新
// 寫入目標區域。這種方法效率低,不適合大片繪圖。
//
if (x > SCREEN_WIDTH || y > SCREEN_HIGHT)
{
return 0;
}
_SetCursor(x, y);
newcolor = _ReadSram();
if (color)
{
newcolor |= offset;
}
else
newcolor &= ~offset;
}
_SetCursor(x, y);
_LCDCom(MWRITE);
_LCDData(newcolor);
return 1;
}
//
// 畫位圖函數
//
// 輸入: xstart 橫軸起始坐標
// ystart 縱軸起始坐標
// width 位圖寬度
// hight 位圖高度
// pbmp 位圖數據頭指針
//
// 輸出: 畫圖成功與否標志
//
int
DrawBitmap(
IN INT32U xstart,
IN INT32U ystart,
IN INT32U width,
IN INT32U hight,
IN const BYTE* pbmp
)
{
int side1, side2, x, y;
BYTE paint, temp;
if (pbmp == NULL)
{
return -1;
}
if (ystart + hight > SCREEN_HIGHT
||
xstart + width > SCREEN_WIDTH)
{
return -2;
}
side1 = 8 - (xstart % 8);
side2 = (xstart + width) % 8;
//
// 光標方向向右
//
_LCDCom(CSR_RIGHT);
for (y = ystart; y < ystart + hight; y++)
{
//
// 左邊界處理
//
if (side1 < 8)
{
paint = (_Color ? *pbmp : ~(*pbmp)); // Just can't put these two lines
paint = paint >> (8 - side1); // together with '(' and ')', why?
_SetCursor(xstart, y);
paint = paint | ((_ReadSram() >> side1) << side1);
}
else
{
paint = _Color ? *pbmp : ~(*pbmp);
}
_SetCursor(xstart, y);
_LCDCom(MWRITE);
_LCDData(paint);
//
// 主體繪畫
//
for (x = (xstart / 8) + 1; x < (xstart + width) / 8; x++)
{
if (side1 < 8)
{
paint = (*pbmp << side1) | (*(pbmp + 1) >> (8 - side1));
}
else
{
paint = *(pbmp + 1);
}
_LCDData(_Color ? paint : ~paint);
pbmp++;
}
//
// 右邊界處理
//
if (side2)
{
if (side1 < 8)
{
paint = (*pbmp << side1) | (*(pbmp + 1) >> (8 - side1));
}
else
{
paint = *(pbmp + 1);
}
temp = (_ReadSram() << side2); // Got to use this tmeporary var here, compiler needs it?
temp = temp >> side2;
paint = (((_Color ? paint : ~paint) >> (8 - side2)) << (8 - side2)) | temp;
_SetCursor(xstart + width, y);
_LCDCom(MWRITE);
_LCDData(paint);
}
if (side1 + side2 > 8)
{
pbmp += 2;
}
else
{
pbmp++;
}
}
return 1;
}
//
// 填充矩形框
//
// 輸入: xstart 橫軸起始坐標
// ystart 縱軸起始坐標
// width 矩形框寬度
// hight 矩形框高度
// color 矩形框內部填充顏色
//
// 輸出: 操作成功與否標志
//
int
FillRect(
IN INT32U xstart,
IN INT32U ystart,
IN INT32U width,
IN INT32U hight,
IN INT32U color
)
{
int side1, side2, x, y;
BYTE paint;
if (ystart + hight > SCREEN_HIGHT
||
xstart + width > SCREEN_WIDTH)
{
return -2;
}
side1 = 8 - (xstart % 8);
side2 = (xstart + width) % 8;
//
// 光標方向向右
//
_LCDCom(CSR_RIGHT);
for (y = ystart; y < ystart + hight; y++)
{
//
// 左邊界處理
//
if (side1 < 8)
{
_SetCursor(xstart, y);
paint = (color ? 0xff : 0x00) >> (8 - side1);
paint = paint | ((_ReadSram() >> side1) << side1);
}
else
{
paint = color ? 0xff : 0x00;
}
_SetCursor(xstart, y);
_LCDCom(MWRITE);
_LCDData(paint);
//
// 主體繪畫
//
for (x = (xstart / 8) + 1; x < (xstart + width) / 8; x++)
{
_LCDData(color ? 0xff : 0x00);
}
//
// 右邊界處理
//
if (side2)
{
paint = (((_Color ? 0xff : 0x00) >> (8 - side2)) << (8 - side2))
| (_ReadSram() >> side2);
_SetCursor(xstart + width, y);
_LCDCom(MWRITE);
_LCDData(paint);
}
}
return 1;
}
//
// 設置屏幕上的光標, x, y值對應光標的行列數,而不是像素坐標
//
// 輸入: column 橫軸坐標,單位為字符列數
// row 縱軸坐標
//
// 輸出: 操作成功與否標志
//
// 注意:該函數設置的坐標是在屏幕第一層上的閃動光標
//
int
SetCursor(
IN INT32U column,
IN INT32U row
)
{
INT16U addr;
//
// 看看行列數輸入是否正確
//
if (column > CHAR_PER_LINE - 1
||
row > SCREEN_HIGHT / CURSOR_HIGHT)
{
return -1;
}
addr = row * AP + column;
_LCDCom(CSRW);
_LCDData((BYTE)LOBYTE(addr));
_LCDData((BYTE)HIBYTE(addr));
return 1;
}
//
// 設置光標形狀,塊狀或者是豎條
//
// 輸入: shape 光標的形狀
//
// 輸出: 操作成功
//
int
SetCursorShape(
IN INT32U shape
)
{
BYTE cursorWidth;
if (shape)
{
cursorWidth = 7;
}
else
{
cursorWidth = 0;
}
_LCDCom(CSRFORM);
_LCDData(cursorWidth);
_LCDData(0x8f); // 0x8f 中,隱含光標高度為16
return 1;
}
#endif // LCD_CONTROLLER
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -