lcd.c
来自「这个是黑白LCD的一个典型的驱动函数集 原创 请大家多支持下下!如果有什么问题请」· C语言 代码 · 共 1,237 行 · 第 1/4 页
C
1,237 行
templ = FONT5x7ASCII[(INT8U)c][y_offset];
if (colors) { //
templ = ~templ; //
}
}
DispGrhPosSetCur(x0, y0+y_offset); // 显示坐标
DispCtrlCmdWr(DISP_CMD_BASIC); // 基本命令集
DispCtrlDataWr(temph); // 数据高字节
DispCtrlDataWr(templ); // 数据低字节
}
DispUnLock(); //
}
}
#endif
/********************************************************************************************************
* 功 能 : 图形方法显示一个字符标准ASCII码 不包含控制字符 字符大小 5*7
* 入 口 : 'x' 显示的X坐标位置 范围0~DispMaxX
* 'y' 显示的Y坐标位置 范围0~DispMaxY
* 'c' 显示的字符
* 返 回 : 无
* 说 明 : 1> x y 方向大于DispMaxX 和DispMaxY 时 不在显示范围内的部分会自动截掉
* 2> 不是ASCII码 则显示为' '
********************************************************************************************************/
#if DISP_GRH_EN > 0
void DispGrhChar57 (INT8U x0, INT8U y0, char c, COLORS colors)
{
INT8U font_dat[8];
INT8U dat;
INT8U i;
INT8U j;
if (x0 < DISP_GRH_MAX_X && y0 < DISP_GRH_MAX_Y) { // 参数过滤
c -= 0x20; //
memcpy(&font_dat, &FONT5x7ASCII[(INT8U)c][0], 8);
for (i=0; i<8; i++) { // 读取点阵数据
for (j=8; j>2; j--) {
if (colors == DISP_COLORS_BLACK) { //
dat = !GETBIT(font_dat[i], j); //
} else {
dat = GETBIT(font_dat[i], j); //
}
DispGrhPixel(x0, y0, dat); //
x0++; //
}
y0++; // 指向下一行
x0 -= 6; // 恢复X值
}
}
}
#endif
/********************************************************************************************************
* 功 能 : 图形方式画一个圆
* 入 口 : 'x' X坐标
* 'y' Y坐标
* 返 回 : 无
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_CIRCLE_EN > 0
void DispGrhCircle (INT8U x0, INT8U y0, INT8U r, COLORS colors)
{
INT8S x, y, dt, dt1, dt2, dr;
DispLock();
x = 0;
y = r;
dt = 2 - r - r;
while (y >= 0) {
DispGrhPixel(x0 + x, y0 + y, colors); // 第1象限
DispGrhPixel(x0 - x, y0 + y, colors); // 第2象限
DispGrhPixel(x0 + x, y0 - y, colors); // 第3象限
DispGrhPixel(x0 - x, y0 - y, colors); // 第4象限
if (dt < 0) {
dt1 = dt + dt + y + y - 1;
if (dt1 <= 0) {
dr = 1;
} else {
dr = 2;
}
} else if (dt > 0) {
dt2 = dt + dt - x - x - 1;
if (dt2 <= 0) {
dr = 2;
} else {
dr = 3;
}
} else {
dr = 2;
}
switch (dr) {
case 1:
x++;
dt += x + x + 1;
break;
case 2:
x++;
y--;
dt += x + x - y - y - 1;
break;
case 3:
y--;
dt += 1 - y - y;
break;
}
}
DispUnLock();
}
#endif
/********************************************************************************************************
* 功 能 : 图形方法清屏
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1>
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_CLR_SCR_EN > 0
void DispGrhClrScr (void)
{
DispGrhAllFill(0x00); // 全屏填充00 即是清屏
}
#endif
/********************************************************************************************************
* 功 能 :
* 入 口 : 'x' 显示的X坐标位置 范围0~DispMaxX
* 'y' 显示的Y坐标位置 范围0~DispMaxY
* 返 回 : 无
* 说 明 :
********************************************************************************************************/
#if DISP_GRH_EN > 0
static void DispGrhDataWrExt (INT8U x, INT8U y, INT16U dat)
{
DispCtrlCmdWr(DISP_CMD_EXTEND); // 扩展命令集
DispCtrlCmdWr(y); // 写Y方向地址
DispCtrlCmdWr(x); // 写X方向地址
DispCtrlCmdWr(DISP_CMD_BASIC); // 基本命令集
DispCtrlDataWr(dat>>8); // 数据高字节
DispCtrlDataWr(dat>>0); // 数据低字节
}
#endif
/********************************************************************************************************
* 功 能 : 显示HEX值数据
* 入 口 : 'row' 是当前显示行 row 最大是DispMaxRows-1 行
* 'col' 是当前显示列 col 最大是DispMaxCols-1 列
* 'dat' 是待显示的数据
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_HEX_EN > 0
void DispGrhHex (INT8U x0, INT8U y0, INT8U dat, COLORS colors)
{
INT8U templ;
INT8U temph;
DispLock(); //
templ = (dat & 0x0f) >> 0; //
temph = (dat & 0xf0) >> 4; //
if (temph > 9) { //
temph -= 10; //
DispGrhChar57(x0+0, y0, temph+'A', colors); //
} else {
DispGrhChar57(x0+0, y0, temph+'0', colors); //
}
if (templ > 9) { //
templ -= 10; //
DispGrhChar57(x0+6, y0, templ+'A', colors); //
} else {
DispGrhChar57(x0+6, y0, templ+'0', colors); //
}
DispUnLock();
}
#endif
/********************************************************************************************************
* 功 能 : 图形方式初始化
* 入 口 : 无
* 返 回 : 无
* 说 明 : 这个函数必须在工作前至少调用一次
********************************************************************************************************/
#if DISP_GRH_EN > 0
static void DispGrhInit (void)
{
}
#endif
/********************************************************************************************************
* 功 能 : 图形方式画任意方向直线
* 入 口 : 'x0' 起始X坐标
* 'y0' 起始Y坐标
* 'x1' 终点X坐标
* 'y1' 终点Y坐标
* 返 回 : 无
* 说 明 :
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_LINE_EN > 0
void DispGrhLine (INT8U x0, INT8U y0, INT8U x1, INT8U y1, COLORS colors)
{
INT16S a, b;
INT16S dt1, dt2, d;
INT8U x, y;
INT8S ystp;
DispLock();
ystp = 1;
if(abs(x1 - x0) > abs(y1 - y0)) {
if(x0 > x1) {
x = x0;
x0 = x1;
x1 = x;
y = y0;
y0 = y1;
y1 = y;
}
a = y0 - y1;
b = x1 - x0;
if(a > 0) {
a = -a;
ystp = -1;
} else {
ystp = 1;
}
d = (a << 1) + b;
dt1 = a << 1;
dt2 = (a + b) << 1;
x = x0;
y = y0;
DispGrhPixel(x, y, colors);
while (x < x1) {
if(d < 0) {
x += 1;
y += ystp;
d += dt2;
} else {
x += 1;
d += dt1;
}
DispGrhPixel(x, y, colors);
}
} else {
if (y0 > y1) {
x = x0;
x0 = x1;
x1 = x;
y = y0;
y0 = y1;
y1 = y;
}
a = x0 - x1;
b = y1 - y0;
if (a > 0) {
a = -a;
ystp = -1;
} else {
ystp = 1;
}
d = (a << 1) + b;
dt1 = a << 1;
dt2 = (a + b) << 1;
x = x0;
y = y0;
DispGrhPixel(x, y, colors);
while(y < y1) {
if(d < 0) {
y += 1;
x += ystp;
d += dt2;
}else {
y += 1;
d += dt1;
}
DispGrhPixel(x, y, colors);
}
}
DispUnLock();
}
#endif
/********************************************************************************************************
* 功 能 : 图形方式画一个点
* 入 口 : 'x' X坐标
* 'y' Y坐标
* 返 回 : 无
********************************************************************************************************/
#if DISP_GRH_EN > 0
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?