📄 gui.s
字号:
.module gui.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\12864-ICC\gui.c
.dbfunc e GUI_HLine _GUI_HLine fV
; bak -> R14
; color -> R20
; x1 -> R22,R23
; y0 -> R10
; x0 -> R12,R13
.even
_GUI_HLine::
xcall push_gset5
mov R10,R18
movw R12,R16
sbiw R28,1
ldd R22,y+11
ldd R23,y+12
ldd R20,y+13
.dbline -1
.dbline 23
; /****************************************************************************************
; * 文件名:GUI.C
; * 功能:GUI基本绘图函数。进行基本绘图运算,并调用相应的刷新程序更新LCD显示。
; * 作者:黄绍斌
; * 修改:冯建辉
; * 日期:2006.09.13
; * 备注:图形操作层,进行各种图形运算操作。
; ****************************************************************************************/
; #include "gui.h"
; #include <math.h>
;
; /****************************************************************************
; * 名称:GUI_HLine()
; * 功能:画水平线。
; * 入口参数:x0 水平线起点所在列的位置
; * y0 水平线起点所在行的位置
; * x1 水平线终点所在列的位置
; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ****************************************************************************/
; void GUI_HLine(unsigned int x0, unsigned char y0, unsigned int x1, TCOLOR color)
; {
.dbline 25
; unsigned char bak;
; if(x0>x1) // 对x0、x1大小进行排列,以便画图
cp R22,R12
cpc R23,R13
brsh L3
.dbline 26
; {
.dbline 27
; bak = x1;
mov R14,R22
.dbline 28
; x1 = x0;
movw R22,R12
.dbline 29
; x0 = bak;
mov R12,R14
clr R13
.dbline 30
; }
L3:
L5:
.dbline 32
; do
; {
.dbline 33
; GUI_Point(x0, y0, color); // 逐点显示,描出垂直线
std y+0,R20
mov R18,R10
mov R16,R12
xcall _GUI_Point
.dbline 34
; x0++;
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 35
; }
L6:
.dbline 36
; while(x1>=x0);
cp R22,R12
cpc R23,R13
brsh L5
.dbline -2
L2:
adiw R28,1
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bak 14 c
.dbsym r color 20 c
.dbsym r x1 22 i
.dbsym r y0 10 c
.dbsym r x0 12 i
.dbend
.dbfunc e GUI_RLine _GUI_RLine fV
; bak -> R14
; color -> R20
; y1 -> R22
; y0 -> R10
; x0 -> R12,R13
.even
_GUI_RLine::
xcall push_gset5
mov R10,R18
movw R12,R16
sbiw R28,1
ldd R22,y+11
ldd R20,y+13
.dbline -1
.dbline 50
; }
;
; /***********************************************************************
; * 名称:GUI_RLine()
; * 功能:画竖直线。根据硬件特点,实现加速。
; * 入口参数:x0 垂直线起点所在列的位置
; * y0 垂直线起点所在行的位置
; * y1 垂直线终点所在行的位置
; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数: 无
; * 说明:操作失败原因是指定地址超出缓冲区范围。
; ***********************************************************************/
; void GUI_RLine(unsigned int x0, unsigned char y0, unsigned char y1, TCOLOR color)
; {
.dbline 52
; unsigned char bak;
; if(y0>y1) // 对y0、y1大小进行排列,以便画图
cp R22,R10
brsh L9
.dbline 53
; {
.dbline 54
; bak = y1;
mov R14,R22
.dbline 55
; y1 = y0;
mov R22,R10
.dbline 56
; y0 = bak;
mov R10,R14
.dbline 57
; }
L9:
L11:
.dbline 59
; do
; {
.dbline 60
; GUI_Point(x0, y0, color); // 逐点显示,描出垂直线
std y+0,R20
mov R18,R10
mov R16,R12
xcall _GUI_Point
.dbline 61
; y0++;
inc R10
.dbline 62
; }
L12:
.dbline 63
; while(y1>=y0);
cp R22,R10
brsh L11
.dbline -2
L8:
adiw R28,1
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r bak 14 c
.dbsym r color 20 c
.dbsym r y1 22 c
.dbsym r y0 10 c
.dbsym r x0 12 i
.dbend
.dbfunc e GUI_Rectangle _GUI_Rectangle fV
; color -> R22
; y1 -> y+11
; x1 -> y+9
; y0 -> R20
; x0 -> R10,R11
.even
_GUI_Rectangle::
xcall push_gset3
mov R20,R18
movw R10,R16
sbiw R28,3
ldd R22,y+13
.dbline -1
.dbline 78
; }
;
; /****************************************************************************
; * 名称:GUI_Rectangle()
; * 功能:画矩形。
; * 入口参数:x0 矩形左上角的x坐标值
; * y0 矩形左上角的y坐标值
; * x1 矩形右下角的x坐标值
; * y1 矩形右下角的y坐标值
; * color 显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_Rectangle(uint16 x0, uint8 y0, uint16 x1, uint8 y1, TCOLOR color)
; {
.dbline 79
; GUI_HLine(x0, y0, x1, color);
std y+2,R22
ldd R0,y+9
ldd R1,y+10
std y+1,R1
std y+0,R0
mov R18,R20
movw R16,R10
xcall _GUI_HLine
.dbline 80
; GUI_HLine(x0, y1, x1, color);
std y+2,R22
ldd R0,y+9
ldd R1,y+10
std y+1,R1
std y+0,R0
ldd R18,y+11
movw R16,R10
xcall _GUI_HLine
.dbline 81
; GUI_RLine(x0, y0, y1, color);
std y+2,R22
ldd R0,y+11
std y+0,R0
mov R18,R20
movw R16,R10
xcall _GUI_RLine
.dbline 82
; GUI_RLine(x1, y0, y1, color);
std y+2,R22
ldd R0,y+11
std y+0,R0
mov R18,R20
ldd R16,y+9
ldd R17,y+10
xcall _GUI_RLine
.dbline -2
L14:
adiw R28,3
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r color 22 c
.dbsym l y1 11 c
.dbsym l x1 9 i
.dbsym r y0 20 c
.dbsym r x0 10 i
.dbend
.dbfunc e GUI_RectangleFill _GUI_RectangleFill fV
; i -> y+3
; color -> R20
; y1 -> R22
; x1 -> R10,R11
; y0 -> R12
; x0 -> R14,R15
.even
_GUI_RectangleFill::
xcall push_gset5
mov R12,R18
movw R14,R16
sbiw R28,7
ldd R10,y+17
ldd R11,y+18
ldd R22,y+19
ldd R20,y+21
.dbline -1
.dbline 97
; }
;
; /****************************************************************************
; * 名称:GUI_RectangleFill()
; * 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
; * 入口参数:x0 矩形左上角的x坐标值
; * y0 矩形左上角的y坐标值
; * x1 矩形右下角的x坐标值
; * y1 矩形右下角的y坐标值
; * color 填充颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_RectangleFill(uint16 x0, uint8 y0, uint16 x1, uint8 y1, TCOLOR color)
; {
.dbline 101
; uint32 i;
;
; /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
; if(x0>x1) // 若x0>x1,则x0与x1交换
cp R10,R14
cpc R11,R15
brsh L16
.dbline 102
; {
.dbline 103
; i = x0;
movw R2,R14
clr R4
clr R5
movw R30,R28
std z+3,R2
std z+4,R3
std z+5,R4
std z+6,R5
.dbline 104
; x0 = x1;
movw R14,R10
.dbline 105
; x1 = i;
movw R30,R28
ldd R10,z+3
ldd R11,z+4
.dbline 106
; }
L16:
.dbline 107
; if(y0>y1) // 若y0>y1,则y0与y1交换
cp R22,R12
brsh L18
.dbline 108
; {
.dbline 109
; i = y0;
mov R2,R12
clr R3
clr R4
clr R5
movw R30,R28
std z+3,R2
std z+4,R3
std z+5,R4
std z+6,R5
.dbline 110
; y0 = y1;
mov R12,R22
.dbline 111
; y1 = i;
movw R30,R28
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
mov R22,R2
.dbline 112
; }
L18:
.dbline 115
;
; /* 判断是否只是直线 */
; if(y0==y1)
cp R12,R22
brne L20
.dbline 116
; {
.dbline 117
; GUI_HLine(x0, y0, x1, color);
std y+2,R20
std y+1,R11
std y+0,R10
mov R18,R12
movw R16,R14
xcall _GUI_HLine
.dbline 118
; return;
xjmp L15
L20:
.dbline 120
; }
; if(x0==x1)
cp R14,R10
cpc R15,R11
brne L25
.dbline 121
; {
.dbline 122
; GUI_RLine(x0, y0, y1, color);
std y+2,R20
std y+0,R22
mov R18,R12
movw R16,R14
xcall _GUI_RLine
.dbline 123
; return;
xjmp L15
L24:
.dbline 127
.dbline 128
std y+2,R20
std y+1,R11
std y+0,R10
mov R18,R12
movw R16,R14
xcall _GUI_HLine
.dbline 129
inc R12
.dbline 130
L25:
.dbline 126
; }
;
; while(y0<=y1)
cp R22,R12
brsh L24
.dbline -2
L15:
adiw R28,7
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l i 3 l
.dbsym r color 20 c
.dbsym r y1 22 c
.dbsym r x1 10 i
.dbsym r y0 12 c
.dbsym r x0 14 i
.dbend
.dbfunc e GUI_Square _GUI_Square fV
; color -> y+21
; with -> y+17
; y0 -> y+13
; x0 -> y+9
.even
_GUI_Square::
xcall push_arg4
xcall push_gset2
sbiw R28,5
.dbline -1
.dbline 144
; {
; GUI_HLine(x0, y0, x1, color); // 当前画水平线
; y0++; // 下一行
; }
; }
;
; /****************************************************************************
; * 名称:GUI_Square()
; * 功能:画正方形。
; * 入口参数:x0 正方形左上角的x坐标值
; * y0 正方形左上角的y坐标值
; * with 正方形的边长
; * color 显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_Square(uint32 x0, uint32 y0, uint32 with, TCOLOR color)
; {
.dbline 145
; if(with==0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L28
.dbline 146
; return;
xjmp L27
L28:
.dbline 147
; if( (x0+with) > GUI_LCM_XMAX )
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
ldd R6,z+9
ldd R7,z+10
ldd R8,z+11
ldd R9,z+12
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
ldi R20,128
ldi R21,0
ldi R22,0
ldi R23,0
cp R20,R6
cpc R21,R7
cpc R22,R8
cpc R23,R9
brsh L30
.dbline 148
; return;
xjmp L27
L30:
.dbline 149
; if( (y0+with) > GUI_LCM_YMAX )
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
ldd R6,z+13
ldd R7,z+14
ldd R8,z+15
ldd R9,z+16
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
ldi R20,64
ldi R21,0
ldi R22,0
ldi R23,0
cp R20,R6
cpc R21,R7
cpc R22,R8
cpc R23,R9
brsh L32
.dbline 150
; return;
xjmp L27
L32:
.dbline 151
; GUI_Rectangle(x0, y0, x0+with, y0+with, color);
ldd R0,y+21
std y+4,R0
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
ldd R6,z+13
ldd R7,z+14
ldd R8,z+15
ldd R9,z+16
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+2,R6
movw R30,R28
ldd R2,z+17
ldd R3,z+18
movw R30,R28
ldd R4,z+9
ldd R5,z+10
add R4,R2
adc R5,R3
std y+1,R5
std y+0,R4
movw R30,R28
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
mov R18,R2
movw R30,R28
ldd R16,z+9
ldd R17,z+10
xcall _GUI_Rectangle
.dbline -2
L27:
adiw R28,5
xcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l color 21 c
.dbsym l with 17 l
.dbsym l y0 13 l
.dbsym l x0 9 l
.dbend
.dbfunc e GUI_Line _GUI_Line fV
; dy -> y+19
; dx -> y+15
; dy_x2 -> y+11
; dx_x2 -> y+7
; dy_sym -> R10
; dx_sym -> R12
; di -> y+3
; color -> R14
; y1 -> y+45
; x1 -> y+41
; y0 -> y+37
; x0 -> y+33
.even
_GUI_Line::
xcall push_arg4
xcall push_gset5
sbiw R28,23
ldd R14,y+49
.dbline -1
.dbline 168
; }
;
;
;
; /****************************************************************************
; * 名称:GUI_Line()
; * 功能:画任意两点之间的直线。
; * 入口参数:x0 直线起点的x坐标值
; * y0 直线起点的y坐标值
; * x1 直线终点的x坐标值
; * y1 直线终点的y坐标值
; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; {
.dbline 177
; int32 dx; // 直线x轴差值变量
; int32 dy; // 直线y轴差值变量
; int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
; int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
; int32 dx_x2; // dx*2值变量,用于加快运算速度
; int32 dy_x2; // dy*2值变量,用于加快运算速度
; int32 di; // 决策变量
;
; dx = x1-x0; // 求取两点之间的差值
movw R30,R28
ldd R2,z+33
ldd R3,z+34
ldd R4,z+35
ldd R5,z+36
movw R30,R28
ldd R6,z+41
ldd R7,z+42
ldd R8,z+43
ldd R9,z+44
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+15,R6
std z+16,R7
std z+17,R8
std z+18,R9
.dbline 178
; dy = y1-y0;
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
movw R30,R28
ldd R6,z+45
ldd R7,z+46
ldd R8,z+47
ldd R9,z+48
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+19,R6
std z+20,R7
std z+21,R8
std z+22,R9
.dbline 181
;
; /* 判断增长方向,或是否为水平线、垂直线、点 */
; if(dx>0) // 判断x轴方向
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+15
ldd R3,z+16
ldd R4,z+17
ldd R5,z+18
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brge L35
.dbline 182
; {
.dbline 183
; dx_sym = 1; // dx>0,设置dx_sym=1
clr R12
inc R12
.dbline 184
; }
xjmp L36
L35:
.dbline 186
; else
; {
.dbline 187
; if(dx<0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+15
ldd R3,z+16
ldd R4,z+17
ldd R5,z+18
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L37
.dbline 188
; {
.dbline 189
; dx_sym = -1; // dx<0,设置dx_sym=-1
ldi R24,255
mov R12,R24
.dbline 190
; }
xjmp L38
L37:
.dbline 192
; else
; { // dx==0,画垂直线,或一点
.dbline 193
; GUI_RLine(x0, y0, y1, color);
std y+2,R14
movw R30,R28
ldd R2,z+45
ldd R3,z+46
ldd R4,z+47
ldd R5,z+48
std y+0,R2
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
mov R18,R2
movw R30,R28
ldd R16,z+33
ldd R17,z+34
xcall _GUI_RLine
.dbline 194
; return;
xjmp L34
L38:
.dbline 196
; }
; }
L36:
.dbline 198
;
; if(dy>0) // 判断y轴方向
ldi R20,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -