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

📄 graphic.lis

📁 AVR控制12864液晶画圆弧,在AVR单片机的控制下完成圆弧的绘制。
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 00CC 422F              mov R20,R18
 00CE 4695              lsr R20
 00D0 4695              lsr R20
 00D2 4695              lsr R20
 00D4                   .dbline 84
 00D4           ;    bitnum  = y & 0x07;
 00D4 622F              mov R22,R18
 00D6 6770              andi R22,7
 00D8                   .dbline 85
 00D8           ;    bitmask = l_mask_array[bitnum]; // bitmask = ( 1 << (y & 0x07) );
 00D8 80E0              ldi R24,<_l_mask_array
 00DA 90E0              ldi R25,>_l_mask_array
 00DC E62F              mov R30,R22
 00DE FF27              clr R31
 00E0 E80F              add R30,R24
 00E2 F91F              adc R31,R25
 00E4 6081              ldd R22,z+0
 00E6                   .dbline 86
 00E6           ;    pBuffer = &(l_display_array[yByte][x]);
 00E6 80E8              ldi R24,128
 00E8 849F              mul R24,R20
 00EA 1001              movw R2,R0
 00EC 80E0              ldi R24,<_l_display_array
 00EE 90E0              ldi R25,>_l_display_array
 00F0 280E              add R2,R24
 00F2 391E              adc R3,R25
 00F4 402F              mov R20,R16
 00F6 5527              clr R21
 00F8 420D              add R20,R2
 00FA 531D              adc R21,R3
 00FC                   .dbline 87
 00FC           ;    switch (mode) 
 00FC AE80              ldd R10,y+6
 00FE BB24              clr R11
 0100 AA20              tst R10
 0102 11F4              brne X0
 0104 BB20              tst R11
 0106 79F0              breq L31
 0108           X0:
 0108 C501              movw R24,R10
 010A 8130              cpi R24,1
 010C E0E0              ldi R30,0
 010E 9E07              cpc R25,R30
 0110 29F0              breq L30
 0112 8230              cpi R24,2
 0114 E0E0              ldi R30,0
 0116 9E07              cpc R25,R30
 0118 69F0              breq L32
 011A 10C0              xjmp L28
 011C           X1:
 011C                   .dbline 88
 011C           ;     { case LCD_MODE_SET:
 011C           L30:
 011C                   .dbline 89
 011C           ;          *pBuffer |= bitmask;
 011C FA01              movw R30,R20
 011E 2080              ldd R2,z+0
 0120 262A              or R2,R22
 0122 2082              std z+0,R2
 0124                   .dbline 90
 0124           ;          break;
 0124 0BC0              xjmp L28
 0126           L31:
 0126                   .dbline 92
 0126           ;       case LCD_MODE_CLEAR:
 0126           ;          *pBuffer &= ~bitmask;
 0126 262E              mov R2,R22
 0128 2094              com R2
 012A FA01              movw R30,R20
 012C 3080              ldd R3,z+0
 012E 3220              and R3,R2
 0130 3082              std z+0,R3
 0132                   .dbline 93
 0132           ;          break;
 0132 04C0              xjmp L28
 0134           L32:
 0134                   .dbline 95
 0134 FA01              movw R30,R20
 0136 2080              ldd R2,z+0
 0138 2626              eor R2,R22
 013A 2082              std z+0,R2
 013C                   .dbline 96
 013C                   .dbline 97
 013C           L28:
 013C                   .dbline -2
 013C           L23:
 013C 0E940000          xcall pop_gset3
 0140                   .dbline 0 ; func end
 0140 0895              ret
 0142                   .dbsym r pBuffer 20 pc
 0142                   .dbsym r bitmask 22 c
 0142                   .dbsym r yByte 20 c
 0142                   .dbsym r bitnum 22 c
 0142                   .dbsym l mode 6 c
 0142                   .dbsym r y 18 c
 0142                   .dbsym r x 16 c
 0142                   .dbend
 0142                   .dbfunc e lcd_line _lcd_line fV
 0142           ;           yTmp -> y+6
 0142           ;           xTmp -> y+5
 0142           ;           yAlt -> R20
 0142           ;              m -> R22,R23
 0142           ;              y -> R10
 0142           ;         length -> R12
 0142           ;              i -> R14
 0142           ;           mode -> y+23
 0142           ;             y2 -> y+21
 0142           ;             x2 -> y+19
 0142           ;             y1 -> y+17
 0142           ;             x1 -> R8
                        .even
 0142           _lcd_line::
 0142 3A93              st -y,r19
 0144 2A93              st -y,r18
 0146 0E940000          xcall push_gset5
 014A 802E              mov R8,R16
 014C 2797              sbiw R28,7
 014E                   .dbline -1
 014E                   .dbline 105
 014E           ;       case LCD_MODE_XOR:
 014E           ;          *pBuffer ^= bitmask;
 014E           ;          break;
 014E           ;       default: break;
 014E           ;     }         
 014E           ;  }
 014E           ; 
 014E           ; 
 014E           ; /* line- and circle-function from a KS0108-library by F. Thiele */
 014E           ; 
 014E           ; void lcd_line( uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2,  uint8_t mode ) 
 014E           ;  { uint8_t length, xTmp, yTmp, i, y, yAlt;
 014E                   .dbline 108
 014E           ;    int16_t m;
 014E           ;    
 014E           ;    if(x1 == x2) 
 014E 0B88              ldd R0,y+19
 0150 8014              cp R8,R0
 0152 F9F4              brne L34
 0154                   .dbline 109
 0154           ;     { // vertical line
 0154                   .dbline 111
 0154           ;       // x1|y1 must be the upper point
 0154           ;       if(y1 > y2) 
 0154 0D88              ldd R0,y+21
 0156 0989              ldd R16,y+17
 0158 0016              cp R0,R16
 015A 50F4              brsh L36
 015C                   .dbline 112
 015C           ;        { xTmp = x1;
 015C                   .dbline 112
 015C 8D82              std y+5,R8
 015E                   .dbline 113
 015E           ;          yTmp = y1;
 015E 0988              ldd R0,y+17
 0160 0E82              std y+6,R0
 0162                   .dbline 114
 0162           ;          x1 = x2;
 0162 8B88              ldd R8,y+19
 0164                   .dbline 115
 0164           ;          y1 = y2;
 0164 0D88              ldd R0,y+21
 0166 098A              std y+17,R0
 0168                   .dbline 116
 0168           ;          x2 = xTmp;
 0168 0D80              ldd R0,y+5
 016A 0B8A              std y+19,R0
 016C                   .dbline 117
 016C           ;          y2 = yTmp;
 016C 0E80              ldd R0,y+6
 016E 0D8A              std y+21,R0
 0170                   .dbline 118
 0170           ;        }
 0170           L36:
 0170                   .dbline 119
 0170           ;       length = y2-y1;
 0170 CD88              ldd R12,y+21
 0172 0988              ldd R0,y+17
 0174 C018              sub R12,R0
 0176                   .dbline 120
 0176           ;       for(i=0; i<=length; i++) 
 0176 EE24              clr R14
 0178 09C0              xjmp L41
 017A           L38:
 017A                   .dbline 121
 017A 0F88              ldd R0,y+23
 017C 0882              std y+0,R0
 017E 2989              ldd R18,y+17
 0180 2E0D              add R18,R14
 0182 082D              mov R16,R8
 0184 0F93              push R16
 0186 99DF              xcall _lcd_dot
 0188 8F90              pop R8
 018A           L39:
 018A                   .dbline 120
 018A E394              inc R14
 018C           L41:
 018C                   .dbline 120
 018C CE14              cp R12,R14
 018E A8F7              brsh L38
 0190                   .dbline 122
 0190           ;          lcd_dot(x1, y1+i, mode);
 0190           ;     } 
 0190 18C1              xjmp L35
 0192           L34:
 0192                   .dbline 123
 0192           ;    else if(y1 == y2) 
 0192 0988              ldd R0,y+17
 0194 0D89              ldd R16,y+21
 0196 0016              cp R0,R16
 0198 E9F4              brne L42
 019A                   .dbline 124
 019A           ;     { // horizontal line
 019A                   .dbline 126
 019A           ;       // x1|y1 must be the left point
 019A           ;       if(x1 > x2) 
 019A 0B88              ldd R0,y+19
 019C 0814              cp R0,R8
 019E 50F4              brsh L44
 01A0                   .dbline 127
 01A0           ;        { xTmp = x1;
 01A0                   .dbline 127
 01A0 8D82              std y+5,R8
 01A2                   .dbline 128
 01A2           ;          yTmp = y1;
 01A2 0988              ldd R0,y+17
 01A4 0E82              std y+6,R0
 01A6                   .dbline 129
 01A6           ;          x1 = x2;
 01A6 8B88              ldd R8,y+19
 01A8                   .dbline 130
 01A8           ;          y1 = y2;
 01A8 0D88              ldd R0,y+21
 01AA 098A              std y+17,R0
 01AC                   .dbline 131
 01AC           ;          x2 = xTmp;
 01AC 0D80              ldd R0,y+5
 01AE 0B8A              std y+19,R0
 01B0                   .dbline 132
 01B0           ;          y2 = yTmp;
 01B0 0E80              ldd R0,y+6
 01B2 0D8A              std y+21,R0
 01B4                   .dbline 133
 01B4           ;        }
 01B4           L44:
 01B4                   .dbline 135
 01B4           ; 
 01B4           ;       length = x2-x1;
 01B4 CB88              ldd R12,y+19
 01B6 C818              sub R12,R8
 01B8                   .dbline 136
 01B8           ;       for(i=0; i<=length; i++) 
 01B8 EE24              clr R14
 01BA 09C0              xjmp L49
 01BC           L46:
 01BC                   .dbline 137
 01BC 0F88              ldd R0,y+23
 01BE 0882              std y+0,R0
 01C0 2989              ldd R18,y+17
 01C2 082D              mov R16,R8
 01C4 0E0D              add R16,R14
 01C6 8F92              push R8
 01C8 78DF              xcall _lcd_dot
 01CA 8F90              pop R8
 01CC           L47:
 01CC                   .dbline 136
 01CC E394              inc R14
 01CE           L49:
 01CE                   .dbline 136
 01CE CE14              cp R12,R14
 01D0 A8F7              brsh L46
 01D2                   .dbline 139
 01D2           ;          lcd_dot(x1+i, y1, mode);
 01D2           ;        
 01D2           ;     } 
 01D2 F7C0              xjmp L43
 01D4           L42:
 01D4                   .dbline 141
 01D4           ;    else 
 01D4           ;     { // x1 must be smaller than x2
 01D4                   .dbline 142
 01D4           ;       if(x1 > x2) 
 01D4 0B88              ldd R0,y+19
 01D6 0814              cp R0,R8
 01D8 50F4              brsh L50
 01DA                   .dbline 143
 01DA           ;        { xTmp = x1;
 01DA                   .dbline 143
 01DA 8D82              std y+5,R8
 01DC                   .dbline 144
 01DC           ;          yTmp = y1;
 01DC 0988              ldd R0,y+17
 01DE 0E82              std y+6,R0
 01E0                   .dbline 145
 01E0           ;          x1 = x2;
 01E0 8B88              ldd R8,y+19
 01E2                   .dbline 146
 01E2           ;          y1 = y2;
 01E2 0D88              ldd R0,y+21
 01E4 098A              std y+17,R0
 01E6                   .dbline 147
 01E6           ;          x2 = xTmp;
 01E6 0D80              ldd R0,y+5
 01E8 0B8A              std y+19,R0
 01EA                   .dbline 148
 01EA           ;          y2 = yTmp;
 01EA 0E80              ldd R0,y+6
 01EC 0D8A              std y+21,R0
 01EE                   .dbline 149
 01EE           ;        }
 01EE           L50:
 01EE                   .dbline 151
 01EE           ;               
 01EE           ;       if((y2-y1) >= (x2-x1) || (y1-y2) >= (x2-x1)) 
 01EE 282C              mov R2,R8
 01F0 3324              clr R3
 01F2 4B88              ldd R4,y+19
 01F4 5524              clr R5
 01F6 4218              sub R4,R2
 01F8 5308              sbc R5,R3
 01FA 2988              ldd R2,y+17
 01FC 3324              clr R3
 01FE 6D88              ldd R6,y+21
 0200 7724              clr R7
 0202 6218              sub R6,R2
 0204 7308              sbc R7,R3
 0206 6414              cp R6,R4
 0208 7504              cpc R7,R5
 020A 54F4              brge L54
 020C 2D88              ldd R2,y+21
 020E 3324              clr R3
 0210 6988              ldd R6,y+17
 0212 7724              clr R7
 0214 6218              sub R6,R2
 0216 7308              sbc R7,R3
 0218 6414              cp R6,R4
 021A 7504              cpc R7,R5
 021C 0CF4              brge X2
 021E 63C0              xjmp L52
 0220           X2:
 0220           L54:
 0220                   .dbline 152
 0220           ;        { // angle larger or equal 45?
 0220                   .dbline 153
 0220           ;          length = x2-x1;                                                              // not really the length :)
 0220 CB88              ldd R12,y+19
 0222 C818              sub R12,R8
 0224                   .dbline 154
 0224           ;          m = ((y2-y1)*200)/length;
 0224 2D88              ldd R2,y+21
 0226 0988              ldd R0,y+17
 0228 2018              sub R2,R0
 022A 88EC              ldi R24,200
 022C 829D              mul R24,R2
 022E 8001              movw R16,R0
 0230 2C2D              mov R18,R12
 0232 3327              clr R19
 0234 0E940000          xcall div16s
 0238 B801              movw R22,R16
 023A                   .dbline 155
 023A           ;          yAlt = y1;

⌨️ 快捷键说明

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