⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui_basic.lis

📁 ssd1325控制器液晶的驱动程序
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 013A 3B1C              adc R3,R11
 013C 3982              std y+1,R3
 013E 2882              std y+0,R2
 0140 9B01              movw R18,R22
 0142 8A01              movw R16,R20
 0144 5DDF              xcall _GUI_Rectangle
 0146                   .dbline -2
 0146           L20:
 0146 2596              adiw R28,5
 0148 0E940000          xcall pop_gset3
 014C                   .dbline 0 ; func end
 014C 0895              ret
 014E                   .dbsym l color 13 c
 014E                   .dbsym r with 10 i
 014E                   .dbsym r y0 22 i
 014E                   .dbsym r x0 20 i
 014E                   .dbend
 014E                   .dbfunc e GUI_Line _GUI_Line fV
 014E           ;             dy -> y+5
 014E           ;             dx -> y+3
 014E           ;          dy_x2 -> R20,R21
 014E           ;          dx_x2 -> R22,R23
 014E           ;         dy_sym -> R10
 014E           ;         dx_sym -> R12
 014E           ;             di -> R14,R15
 014E           ;          color -> y+25
 014E           ;             y1 -> y+23
 014E           ;             x1 -> y+21
 014E           ;             y0 -> y+19
 014E           ;             x0 -> y+17
                        .even
 014E           _GUI_Line::
 014E 0E940000          xcall push_arg4
 0152 0E940000          xcall push_gset5
 0156 2797              sbiw R28,7
 0158                   .dbline -1
 0158                   .dbline 105
 0158           ; }
 0158           ; 
 0158           ; 
 0158           ; 
 0158           ; /****************************************************************************
 0158           ; * 名称:GUI_Line()
 0158           ; * 功能:画任意两点之间的直线。
 0158           ; * 入口参数: x0               直线起点的x坐标值
 0158           ; *           y0                直线起点的y坐标值
 0158           ; *           x1      直线终点的x坐标值
 0158           ; *           y1      直线终点的y坐标值
 0158           ; *           color     显示颜色(对于黑白色LCM,为0时灭,为1时显示)
 0158           ; * 出口参数:无
 0158           ; * 说明:操作失败原因是指定地址超出有效范围。
 0158           ; ****************************************************************************/
 0158           ; void  GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
 0158           ; {  int32   dx;                                                // 直线x轴差值变量
 0158                   .dbline 114
 0158           ;    int32   dy;                                // 直线y轴差值变量
 0158           ;    int8    dx_sym;                                    // x轴增长方向,为-1时减值方向,为1时增值方向
 0158           ;    int8    dy_sym;                                    // y轴增长方向,为-1时减值方向,为1时增值方向
 0158           ;    int32   dx_x2;                                     // dx*2值变量,用于加快运算速度
 0158           ;    int32   dy_x2;                                     // dy*2值变量,用于加快运算速度
 0158           ;    int32   di;                                                // 决策变量
 0158           ;    
 0158           ;    
 0158           ;    dx = x1-x0;                                                // 求取两点之间的差值
 0158 2D88              ldd R2,y+21
 015A 3E88              ldd R3,y+22
 015C 0988              ldd R0,y+17
 015E 1A88              ldd R1,y+18
 0160 2018              sub R2,R0
 0162 3108              sbc R3,R1
 0164 3C82              std y+4,R3
 0166 2B82              std y+3,R2
 0168                   .dbline 115
 0168           ;    dy = y1-y0;
 0168 2F88              ldd R2,y+23
 016A 388C              ldd R3,y+24
 016C 0B88              ldd R0,y+19
 016E 1C88              ldd R1,y+20
 0170 2018              sub R2,R0
 0172 3108              sbc R3,R1
 0174 3E82              std y+6,R3
 0176 2D82              std y+5,R2
 0178                   .dbline 118
 0178           ;    
 0178           ;    /* 判断增长方向,或是否为水平线、垂直线、点 */
 0178           ;    if(dx>0)                                                   // 判断x轴方向
 0178 2224              clr R2
 017A 3324              clr R3
 017C 4B80              ldd R4,y+3
 017E 5C80              ldd R5,y+4
 0180 2414              cp R2,R4
 0182 3504              cpc R3,R5
 0184 1CF4              brge L28
 0186                   .dbline 119
 0186           ;    {  dx_sym = 1;                                     // dx>0,设置dx_sym=1
 0186                   .dbline 119
 0186 CC24              clr R12
 0188 C394              inc R12
 018A                   .dbline 120
 018A           ;    }
 018A 16C0              xjmp L29
 018C           L28:
 018C                   .dbline 122
 018C           ;    else
 018C           ;    {  if(dx<0)
 018C                   .dbline 122
 018C 8B81              ldd R24,y+3
 018E 9C81              ldd R25,y+4
 0190 8030              cpi R24,0
 0192 E0E0              ldi R30,0
 0194 9E07              cpc R25,R30
 0196 1CF4              brge L30
 0198                   .dbline 123
 0198           ;       {  dx_sym = -1;                         // dx<0,设置dx_sym=-1
 0198                   .dbline 123
 0198 8FEF              ldi R24,255
 019A C82E              mov R12,R24
 019C                   .dbline 124
 019C           ;       }
 019C 0DC0              xjmp L31
 019E           L30:
 019E                   .dbline 126
 019E           ;       else
 019E           ;       {  // dx==0,画垂直线,或一点
 019E                   .dbline 127
 019E           ;          GUI_RLine(x0, y0, y1, color);
 019E 098C              ldd R0,y+25
 01A0 0A82              std y+2,R0
 01A2 0F88              ldd R0,y+23
 01A4 188C              ldd R1,y+24
 01A6 1982              std y+1,R1
 01A8 0882              std y+0,R0
 01AA 2B89              ldd R18,y+19
 01AC 3C89              ldd R19,y+20
 01AE 0989              ldd R16,y+17
 01B0 1A89              ldd R17,y+18
 01B2 0E940000          xcall _GUI_RLine
 01B6                   .dbline 128
 01B6           ;                return;
 01B6 C5C0              xjmp L27
 01B8           L31:
 01B8                   .dbline 130
 01B8           ;       }
 01B8           ;    }
 01B8           L29:
 01B8                   .dbline 132
 01B8           ;    
 01B8           ;    if(dy>0)                                                   // 判断y轴方向
 01B8 2224              clr R2
 01BA 3324              clr R3
 01BC 4D80              ldd R4,y+5
 01BE 5E80              ldd R5,y+6
 01C0 2414              cp R2,R4
 01C2 3504              cpc R3,R5
 01C4 1CF4              brge L32
 01C6                   .dbline 133
 01C6           ;    {  dy_sym = 1;                                     // dy>0,设置dy_sym=1
 01C6                   .dbline 133
 01C6 AA24              clr R10
 01C8 A394              inc R10
 01CA                   .dbline 134
 01CA           ;    }
 01CA 16C0              xjmp L33
 01CC           L32:
 01CC                   .dbline 136
 01CC           ;    else
 01CC           ;    {  if(dy<0)
 01CC                   .dbline 136
 01CC 8D81              ldd R24,y+5
 01CE 9E81              ldd R25,y+6
 01D0 8030              cpi R24,0
 01D2 E0E0              ldi R30,0
 01D4 9E07              cpc R25,R30
 01D6 1CF4              brge L34
 01D8                   .dbline 137
 01D8           ;       {  dy_sym = -1;                         // dy<0,设置dy_sym=-1
 01D8                   .dbline 137
 01D8 8FEF              ldi R24,255
 01DA A82E              mov R10,R24
 01DC                   .dbline 138
 01DC           ;       }
 01DC 0DC0              xjmp L35
 01DE           L34:
 01DE                   .dbline 140
 01DE           ;       else
 01DE           ;       {  // dy==0,画水平线,或一点
 01DE                   .dbline 141
 01DE           ;          GUI_HLine(x0, y0, x1, color);
 01DE 098C              ldd R0,y+25
 01E0 0A82              std y+2,R0
 01E2 0D88              ldd R0,y+21
 01E4 1E88              ldd R1,y+22
 01E6 1982              std y+1,R1
 01E8 0882              std y+0,R0
 01EA 2B89              ldd R18,y+19
 01EC 3C89              ldd R19,y+20
 01EE 0989              ldd R16,y+17
 01F0 1A89              ldd R17,y+18
 01F2 0E940000          xcall _GUI_HLine
 01F6                   .dbline 142
 01F6           ;                return;
 01F6 A5C0              xjmp L27
 01F8           L35:
 01F8                   .dbline 144
 01F8           ;       }
 01F8           ;    }
 01F8           L33:
 01F8                   .dbline 147
 01F8           ;     
 01F8           ;    /* 将dx、dy取绝对值 */
 01F8           ;    dx = dx_sym * dx;
 01F8 2B81              ldd R18,y+3
 01FA 3C81              ldd R19,y+4
 01FC 0C2D              mov R16,R12
 01FE 1127              clr R17
 0200 07FD              sbrc R16,7
 0202 1095              com R17
 0204 0E940000          xcall empy16s
 0208 1C83              std y+4,R17
 020A 0B83              std y+3,R16
 020C                   .dbline 148
 020C           ;    dy = dy_sym * dy;
 020C 2D81              ldd R18,y+5
 020E 3E81              ldd R19,y+6
 0210 0A2D              mov R16,R10
 0212 1127              clr R17
 0214 07FD              sbrc R16,7
 0216 1095              com R17
 0218 0E940000          xcall empy16s
 021C 1E83              std y+6,R17
 021E 0D83              std y+5,R16
 0220                   .dbline 151
 0220           ;  
 0220           ;    /* 计算2倍的dx及dy值 */
 0220           ;    dx_x2 = dx*2;
 0220 2B81              ldd R18,y+3
 0222 3C81              ldd R19,y+4
 0224 02E0              ldi R16,2
 0226 10E0              ldi R17,0
 0228 0E940000          xcall empy16s
 022C B801              movw R22,R16
 022E                   .dbline 152
 022E           ;    dy_x2 = dy*2;
 022E 2D81              ldd R18,y+5
 0230 3E81              ldd R19,y+6
 0232 02E0              ldi R16,2
 0234 10E0              ldi R17,0
 0236 0E940000          xcall empy16s
 023A A801              movw R20,R16
 023C                   .dbline 155
 023C           ;    
 023C           ;    /* 使用Bresenham法进行画直线 */
 023C           ;    if(dx>=dy)                                         // 对于dx>=dy,则使用x轴为基准
 023C 2D80              ldd R2,y+5
 023E 3E80              ldd R3,y+6
 0240 4B80              ldd R4,y+3
 0242 5C80              ldd R5,y+4
 0244 4214              cp R4,R2
 0246 5304              cpc R5,R3
 0248 0CF4              brge X1
 024A 3DC0              xjmp L36
 024C           X1:
 024C                   .dbline 156
 024C           ;    {  di = dy_x2 - dx;
 024C                   .dbline 156
 024C 7A01              movw R14,R20
 024E E418              sub R14,R4
 0250 F508              sbc R15,R5
 0252 29C0              xjmp L39
 0254           L38:
 0254                   .dbline 158
 0254           ;       while(x0!=x1)
 0254           ;       {  GUI_Point(x0, y0, color);
 0254                   .dbline 158
 0254 098C              ldd R0,y+25
 0256 0882              std y+0,R0
 0258 2B89              ldd R18,y+19
 025A 3C89              ldd R19,y+20
 025C 0989              ldd R16,y+17
 025E 1A89              ldd R17,y+18
 0260 0E940000          xcall _GUI_Point
 0264                   .dbline 159
 0264           ;          x0 += dx_sym;
 0264 2C2C              mov R2,R12
 0266 3324              clr R3
 0268 27FC              sbrc R2,7
 026A 3094              com R3
 026C 0988              ldd R0,y+17
 026E 1A88              ldd R1,y+18
 0270 020C              add R0,R2
 0272 131C              adc R1,R3
 0274 1A8A              std y+18,R1
 0276 098A              std y+17,R0
 0278                   .dbline 160
 0278           ;          if(di<0)
 0278 C701              movw R24,R14
 027A 8030              cpi R24,0
 027C E0E0              ldi R30,0
 027E 9E07              cpc R25,R30
 0280 1CF4              brge L41
 0282                   .dbline 161
 0282           ;          {  di += dy_x2;                      // 计算出下一步的决策值
 0282                   .dbline 161
 0282 E40E              add R14,R20
 0284 F51E              adc R15,R21
 0286                   .dbline 162
 0286           ;          }
 0286 0FC0              xjmp L42
 0288           L41:
 0288                   .dbline 164
 0288           ;          else
 0288           ;          {  di += dy_x2 - dx_x2;
 0288                   .dbline 164
 0288 1A01              movw R2,R20
 028A 261A              sub R2,R22
 028C 370A              sbc R3,R23
 028E E20C              add R14,R2
 0290 F31C              adc R15,R3
 0292                   .dbline 165
 0292           ;             y0 += dy_sym;
 0292 2A2C              mov R2,R10
 0294 3324              clr R3
 0296 27FC              sbrc R2,7
 0298 3094              com R3
 029A 0B88              ldd R0,y+19
 029C 1C88              ldd R1,y+20
 029E 020C              add R0,R2
 02A0 131C              adc R1,R3
 02A2 1C8A              std y+20,R1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -