📄 gui.lis
字号:
063A ; else
063A ; {
063A .dbline 256
063A ; di += dx_x2 - dy_x2;
063A FE01 movw R30,R28
063C 2384 ldd R2,z+11
063E 3484 ldd R3,z+12
0640 4584 ldd R4,z+13
0642 5684 ldd R5,z+14
0644 FE01 movw R30,R28
0646 6780 ldd R6,z+7
0648 7084 ldd R7,z+8
064A 8184 ldd R8,z+9
064C 9284 ldd R9,z+10
064E 6218 sub R6,R2
0650 7308 sbc R7,R3
0652 8408 sbc R8,R4
0654 9508 sbc R9,R5
0656 FE01 movw R30,R28
0658 2380 ldd R2,z+3
065A 3480 ldd R3,z+4
065C 4580 ldd R4,z+5
065E 5680 ldd R5,z+6
0660 260C add R2,R6
0662 371C adc R3,R7
0664 481C adc R4,R8
0666 591C adc R5,R9
0668 FE01 movw R30,R28
066A 2382 std z+3,R2
066C 3482 std z+4,R3
066E 4582 std z+5,R4
0670 5682 std z+6,R5
0672 .dbline 257
0672 ; x0 += dx_sym;
0672 2C2C mov R2,R12
0674 3324 clr R3
0676 27FC sbrc R2,7
0678 3094 com R3
067A 4424 clr R4
067C 37FC sbrc R3,7
067E 4094 com R4
0680 5524 clr R5
0682 47FC sbrc R4,7
0684 5094 com R5
0686 FE01 movw R30,R28
0688 61A0 ldd R6,z+33
068A 72A0 ldd R7,z+34
068C 83A0 ldd R8,z+35
068E 94A0 ldd R9,z+36
0690 620C add R6,R2
0692 731C adc R7,R3
0694 841C adc R8,R4
0696 951C adc R9,R5
0698 FE01 movw R30,R28
069A 61A2 std z+33,R6
069C 72A2 std z+34,R7
069E 83A2 std z+35,R8
06A0 94A2 std z+36,R9
06A2 .dbline 258
06A2 ; }
06A2 L54:
06A2 .dbline 259
06A2 L51:
06A2 .dbline 246
06A2 FE01 movw R30,R28
06A4 25A4 ldd R2,z+45
06A6 36A4 ldd R3,z+46
06A8 47A4 ldd R4,z+47
06AA 50A8 ldd R5,z+48
06AC FE01 movw R30,R28
06AE 65A0 ldd R6,z+37
06B0 76A0 ldd R7,z+38
06B2 87A0 ldd R8,z+39
06B4 90A4 ldd R9,z+40
06B6 6214 cp R6,R2
06B8 7304 cpc R7,R3
06BA 8404 cpc R8,R4
06BC 9504 cpc R9,R5
06BE 09F0 breq X2
06C0 77CF xjmp L50
06C2 X2:
06C2 .dbline 260
06C2 E882 std y+0,R14
06C4 FE01 movw R30,R28
06C6 25A0 ldd R2,z+37
06C8 36A0 ldd R3,z+38
06CA 47A0 ldd R4,z+39
06CC 50A4 ldd R5,z+40
06CE 222D mov R18,R2
06D0 FE01 movw R30,R28
06D2 01A1 ldd R16,z+33
06D4 0E940000 xcall _GUI_Point
06D8 .dbline 261
06D8 L44:
06D8 .dbline -2
06D8 L34:
06D8 6796 adiw R28,23
06DA 0E940000 xcall pop_gset5
06DE 2496 adiw R28,4
06E0 .dbline 0 ; func end
06E0 0895 ret
06E2 .dbsym l dy 19 L
06E2 .dbsym l dx 15 L
06E2 .dbsym l dy_x2 11 L
06E2 .dbsym l dx_x2 7 L
06E2 .dbsym r dy_sym 10 C
06E2 .dbsym r dx_sym 12 C
06E2 .dbsym l di 3 L
06E2 .dbsym r color 14 c
06E2 .dbsym l y1 45 l
06E2 .dbsym l x1 41 l
06E2 .dbsym l y0 37 l
06E2 .dbsym l x0 33 l
06E2 .dbend
06E2 .dbfunc e GUI_LineS _GUI_LineS fV
06E2 ; i -> R20
06E2 ; y0 -> y+25
06E2 ; x0 -> y+21
06E2 ; y1 -> y+17
06E2 ; x1 -> y+13
06E2 ; color -> R22
06E2 ; no -> R10
06E2 ; points -> R12,R13
.even
06E2 _GUI_LineS::
06E2 0E940000 xcall push_gset4
06E6 A22E mov R10,R18
06E8 6801 movw R12,R16
06EA 6D97 sbiw R28,29
06EC 6DA1 ldd R22,y+37
06EE .dbline -1
06EE .dbline 438
06EE ; }
06EE ; GUI_Point(x0, y0, color); // 显示最后一点
06EE ; }
06EE ; }
06EE ;
06EE ;
06EE ; #if GUI_LineWith_EN==1
06EE ; /****************************************************************************
06EE ; * 名称:GUI_LineWith()
06EE ; * 功能:画任意两点之间的直线,并且可设置线的宽度。
06EE ; * 入口参数:x0 直线起点的x坐标值
06EE ; * y0 直线起点的y坐标值
06EE ; * x1 直线终点的x坐标值
06EE ; * y1 直线终点的y坐标值
06EE ; * with 线宽(0-50)
06EE ; * color 显示颜色
06EE ; * 出口参数:无
06EE ; * 说明:操作失败原因是指定地址超出有效范围。
06EE ; ****************************************************************************/
06EE ; void GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, TCOLOR color)
06EE ; {
06EE ; int32 dx; // 直线x轴差值变量
06EE ; int32 dy; // 直线y轴差值变量
06EE ; int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
06EE ; int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
06EE ; int32 dx_x2; // dx*2值变量,用于加快运算速度
06EE ; int32 dy_x2; // dy*2值变量,用于加快运算速度
06EE ; int32 di; // 决策变量
06EE ;
06EE ; int32 wx, wy; // 线宽变量
06EE ; int32 draw_a, draw_b;
06EE ;
06EE ; /* 参数过滤 */
06EE ; if(with==0)
06EE ; return;
06EE ; if(with>50)
06EE ; with = 50;
06EE ;
06EE ; dx = x1-x0; // 求取两点之间的差值
06EE ; dy = y1-y0;
06EE ;
06EE ; wx = with/2;
06EE ; wy = with-wx-1;
06EE ;
06EE ; /* 判断增长方向,或是否为水平线、垂直线、点 */
06EE ; if(dx>0) // 判断x轴方向
06EE ; {
06EE ; dx_sym = 1; // dx>0,设置dx_sym=1
06EE ; }
06EE ; else
06EE ; {
06EE ; if(dx<0)
06EE ; {
06EE ; dx_sym = -1; // dx<0,设置dx_sym=-1
06EE ; }
06EE ; else
06EE ; { /* dx==0,画垂直线,或一点 */
06EE ; wx = x0-wx;
06EE ; if(wx<0)
06EE ; wx = 0;
06EE ; wy = x0+wy;
06EE ;
06EE ; while(1)
06EE ; {
06EE ; x0 = wx;
06EE ; GUI_RLine(x0, y0, y1, color);
06EE ; if(wx>=wy)
06EE ; break;
06EE ; wx++;
06EE ; }
06EE ; return;
06EE ; }
06EE ; }
06EE ;
06EE ; if(dy>0) // 判断y轴方向
06EE ; {
06EE ; dy_sym = 1; // dy>0,设置dy_sym=1
06EE ; }
06EE ; else
06EE ; {
06EE ; if(dy<0)
06EE ; {
06EE ; dy_sym = -1; // dy<0,设置dy_sym=-1
06EE ; }
06EE ; else
06EE ; { /* dy==0,画水平线,或一点 */
06EE ; wx = y0-wx;
06EE ; if(wx<0) wx = 0;
06EE ; wy = y0+wy;
06EE ;
06EE ; while(1)
06EE ; {
06EE ; y0 = wx;
06EE ; GUI_HLine(x0, y0, x1, color);
06EE ; if(wx>=wy)
06EE ; break;
06EE ; wx++;
06EE ; }
06EE ; return;
06EE ; }
06EE ; }
06EE ;
06EE ; /* 将dx、dy取绝对值 */
06EE ; dx = dx_sym * dx;
06EE ; dy = dy_sym * dy;
06EE ;
06EE ; /* 计算2倍的dx及dy值 */
06EE ; dx_x2 = dx*2;
06EE ; dy_x2 = dy*2;
06EE ;
06EE ; /* 使用Bresenham法进行画直线 */
06EE ; if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
06EE ; {
06EE ; di = dy_x2 - dx;
06EE ; while(x0!=x1)
06EE ; { /* x轴向增长,则宽度在y方向,即画垂直线 */
06EE ; draw_a = y0-wx;
06EE ; if(draw_a<0) draw_a = 0;
06EE ; draw_b = y0+wy;
06EE ; GUI_RLine(x0, draw_a, draw_b, color);
06EE ;
06EE ; x0 += dx_sym;
06EE ; if(di<0)
06EE ; {
06EE ; di += dy_x2; // 计算出下一步的决策值
06EE ; }
06EE ; else
06EE ; {
06EE ; di += dy_x2 - dx_x2;
06EE ; y0 += dy_sym;
06EE ; }
06EE ; }
06EE ; draw_a = y0-wx;
06EE ; if(draw_a<0)
06EE ; draw_a = 0;
06EE ; draw_b = y0+wy;
06EE ; GUI_RLine(x0, draw_a, draw_b, color);
06EE ; }
06EE ; else // 对于dx<dy,则使用y轴为基准
06EE ; {
06EE ; di = dx_x2 - dy;
06EE ; while(y0!=y1)
06EE ; { /* y轴向增长,则宽度在x方向,即画水平线 */
06EE ; draw_a = x0-wx;
06EE ; if(draw_a<0)
06EE ; draw_a = 0;
06EE ; draw_b = x0+wy;
06EE ; GUI_HLine(draw_a, y0, draw_b, color);
06EE ;
06EE ; y0 += dy_sym;
06EE ; if(di<0)
06EE ; {
06EE ; di += dx_x2;
06EE ; }
06EE ; else
06EE ; {
06EE ; di += dx_x2 - dy_x2;
06EE ; x0 += dx_sym;
06EE ; }
06EE ; }
06EE ; draw_a = x0-wx;
06EE ; if(draw_a<0)
06EE ; draw_a = 0;
06EE ; draw_b = x0+wy;
06EE ; GUI_HLine(draw_a, y0, draw_b, color);
06EE ; }
06EE ; }
06EE ; #endif
06EE ;
06EE ; /****************************************************************************
06EE ; * 名称:GUI_LineS()
06EE ; * 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
06EE ; * 入口参数:points 多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
06EE ; * no 点数目,至少要大于1
06EE ; * color 显示颜色
06EE ; * 出口参数:无
06EE ; * 说明:操作失败原因是指定地址超出有效范围。
06EE ; ****************************************************************************/
06EE ; void GUI_LineS(uint32 const *points, uint8 no, TCOLOR color)
06EE ; {
06EE .dbline 444
06EE ; uint32 x0, y0;
06EE ; uint32 x1, y1;
06EE ; uint8 i;
06EE ;
06EE ; /* 入口参数过滤 */
06EE ; if(0==no)
06EE AA20 tst R10
06F0 09F4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -