📄 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 + -