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

📄 graphic.s

📁 AVR控制12864液晶画圆弧,在AVR单片机的控制下完成圆弧的绘制。
💻 S
📖 第 1 页 / 共 2 页
字号:
;          yAlt = y1;
	ldd R20,y+17
	.dbline 156
;          for(i=0; i<=length; i++) 
	clr R14
	xjmp L58
L55:
	.dbline 157
;           { y = ((m*i)/200)+y1;
	.dbline 157
	mov R18,R14
	clr R19
	movw R16,R22
	xcall empy16s
	ldi R18,200
	ldi R19,0
	xcall div16s
	mov R10,R16
	ldd R2,y+17
	clr R3
	add R10,R2
	adc R11,R3
	.dbline 158
;             if((m*i)%200 >= 100)
	mov R18,R14
	clr R19
	movw R16,R22
	xcall empy16s
	ldi R18,200
	ldi R19,0
	xcall mod16s
	cpi R16,100
	ldi R30,0
	cpc R17,R30
	brlt L59
	.dbline 159
;                y++;
	inc R10
	xjmp L60
L59:
	.dbline 160
;             else if((m*i)%200 <= -100)
	mov R18,R14
	clr R19
	movw R16,R22
	xcall empy16s
	ldi R18,200
	ldi R19,0
	xcall mod16s
	ldi R24,-100
	ldi R25,-1
	cp R24,R16
	cpc R25,R17
	brlt L61
	.dbline 161
;                y--;
	dec R10
L61:
L60:
	.dbline 163
; 				
;             lcd_line(x1+i, yAlt, x1+i, y, mode ); /* wuff wuff recurs. */
	ldd R0,y+23
	std y+4,R0
	std y+2,R10
	mov R2,R8
	add R2,R14
	std y+0,R2
	mov R18,R20
	mov R16,R2
	push R8
	xcall _lcd_line
	pop R8
	.dbline 164
;             if(length<=(y2-y1) && y1 < y2)
	ldd R2,y+21
	ldd R0,y+17
	sub R2,R0
	cp R2,R12
	brlo L63
	ldd R16,y+21
	cp R0,R16
	brsh L63
	.dbline 165
;                yAlt = y+1;
	mov R20,R10
	subi R20,255    ; addi 1
	xjmp L64
L63:
	.dbline 166
;             else if(length<=(y1-y2) && y1 > y2)
	ldd R2,y+17
	ldd R0,y+21
	sub R2,R0
	cp R2,R12
	brlo L65
	ldd R16,y+17
	cp R0,R16
	brsh L65
	.dbline 167
;                yAlt = y-1;
	mov R20,R10
	subi R20,1
	xjmp L66
L65:
	.dbline 169
;             else
;                yAlt = y;
	mov R20,R10
L66:
L64:
	.dbline 170
L56:
	.dbline 156
	inc R14
L58:
	.dbline 156
	cp R12,R14
	brlo X3
	xjmp L55
X3:
	.dbline 171
;           }
;        } 
	xjmp L53
L52:
	.dbline 173
;       else
;        { // angle smaller 45?
	.dbline 175
;          // y1 must be smaller than y2
;          if(y1 > y2)
	ldd R0,y+21
	ldd R16,y+17
	cp R0,R16
	brsh L67
	.dbline 176
;           { xTmp = x1;
	.dbline 176
	std y+5,R8
	.dbline 177
;             yTmp = y1;
	ldd R0,y+17
	std y+6,R0
	.dbline 178
;             x1 = x2;
	ldd R8,y+19
	.dbline 179
;             y1 = y2;
	ldd R0,y+21
	std y+17,R0
	.dbline 180
;             x2 = xTmp;
	ldd R0,y+5
	std y+19,R0
	.dbline 181
;             y2 = yTmp;
	ldd R0,y+6
	std y+21,R0
	.dbline 182
;           }
L67:
	.dbline 183
;          length = y2-y1;
	ldd R12,y+21
	ldd R0,y+17
	sub R12,R0
	.dbline 184
;          m = ((x2-x1)*200)/length;
	ldd R2,y+19
	sub R2,R8
	ldi R24,200
	mul R24,R2
	movw R16,R0
	mov R18,R12
	clr R19
	xcall div16s
	movw R22,R16
	.dbline 185
;          yAlt = x1;
	mov R20,R8
	.dbline 186
;          for(i=0; i<=length; i++)
	clr R14
	xjmp L72
L69:
	.dbline 187
;           { y = ((m*i)/200)+x1;
	.dbline 187
	mov R18,R14
	clr R19
	movw R16,R22
	xcall empy16s
	ldi R18,200
	ldi R19,0
	xcall div16s
	mov R10,R16
	mov R2,R8
	clr R3
	add R10,R2
	adc R11,R3
	.dbline 189
; 
;             if((m*i)%200 >= 100)
	mov R18,R14
	clr R19
	movw R16,R22
	xcall empy16s
	ldi R18,200
	ldi R19,0
	xcall mod16s
	cpi R16,100
	ldi R30,0
	cpc R17,R30
	brlt L73
	.dbline 190
;                y++;
	inc R10
	xjmp L74
L73:
	.dbline 191
;             else if((m*i)%200 <= -100)
	mov R18,R14
	clr R19
	movw R16,R22
	xcall empy16s
	ldi R18,200
	ldi R19,0
	xcall mod16s
	ldi R24,-100
	ldi R25,-1
	cp R24,R16
	cpc R25,R17
	brlt L75
	.dbline 192
;                y--;
	dec R10
L75:
L74:
	.dbline 194
; 
;             lcd_line(yAlt, y1+i, y, y1+i, mode); /* wuff */
	ldd R0,y+23
	std y+4,R0
	ldd R2,y+17
	add R2,R14
	std y+2,R2
	std y+0,R10
	mov R18,R2
	mov R16,R20
	push R8
	xcall _lcd_line
	pop R8
	.dbline 195
;             if(length<=(x2-x1) && x1 < x2)
	ldd R2,y+19
	sub R2,R8
	cp R2,R12
	brlo L77
	ldd R0,y+19
	cp R8,R0
	brsh L77
	.dbline 196
;                yAlt = y+1;
	mov R20,R10
	subi R20,255    ; addi 1
	xjmp L78
L77:
	.dbline 197
;             else if(length<=(x1-x2) && x1 > x2)
	mov R2,R8
	ldd R0,y+19
	sub R2,R0
	cp R2,R12
	brlo L79
	cp R0,R8
	brsh L79
	.dbline 198
;                yAlt = y-1;
	mov R20,R10
	subi R20,1
	xjmp L80
L79:
	.dbline 200
;             else
;                yAlt = y;
	mov R20,R10
L80:
L78:
	.dbline 201
L70:
	.dbline 186
	inc R14
L72:
	.dbline 186
	cp R12,R14
	brlo X4
	xjmp L69
X4:
	.dbline 202
;           }
;        }
L53:
	.dbline 203
;     }
L43:
L35:
	.dbline -2
L33:
	adiw R28,7
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym l yTmp 6 c
	.dbsym l xTmp 5 c
	.dbsym r yAlt 20 c
	.dbsym r m 22 I
	.dbsym r y 10 c
	.dbsym r length 12 c
	.dbsym r i 14 c
	.dbsym l mode 23 c
	.dbsym l y2 21 c
	.dbsym l x2 19 c
	.dbsym l y1 17 c
	.dbsym r x1 8 c
	.dbend
	.dbfunc e lcd_circle _lcd_circle fV
;        tSwitch -> R20,R21
;              d -> R22
;              y -> R10,R11
;              x -> R12,R13
;           mode -> R14
;         radius -> y+15
;        yCenter -> y+13
;        xCenter -> y+11
	.even
_lcd_circle::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,1
	ldd R14,y+17
	.dbline -1
	.dbline 209
;  }
; 
; 
; void lcd_circle( uint8_t xCenter, uint8_t yCenter, 
;                  uint8_t radius,  uint8_t mode) 
;  {  int tSwitch, y, x = 0;
	.dbline 209
	clr R12
	clr R13
	.dbline 212
;    uint8_t d;
;    
;    d = yCenter - xCenter;
	ldd R22,y+13
	ldd R0,y+11
	sub R22,R0
	.dbline 213
;    y = radius;
	ldd R10,y+15
	clr R11
	.dbline 214
;    tSwitch = 3 - 2 * radius;
	ldi R24,2
	mov R0,R10
	mul R24,R0
	ldi R20,3
	ldi R21,0
	sub R20,R0
	sbc R21,R1
	xjmp L83
L82:
	.dbline 217
; 
;    while (x <= y) 
;     { lcd_dot(xCenter + x, yCenter + y, mode);
	.dbline 217
	std y+0,R14
	ldd R18,y+13
	clr R19
	add R18,R10
	adc R19,R11
	ldd R16,y+11
	clr R17
	add R16,R12
	adc R17,R13
	xcall _lcd_dot
	.dbline 218
;       lcd_dot(xCenter + x, yCenter - y, mode);
	std y+0,R14
	ldd R18,y+13
	clr R19
	sub R18,R10
	sbc R19,R11
	ldd R16,y+11
	clr R17
	add R16,R12
	adc R17,R13
	xcall _lcd_dot
	.dbline 220
; 	
;       lcd_dot(xCenter - x, yCenter + y, mode);
	std y+0,R14
	ldd R18,y+13
	clr R19
	add R18,R10
	adc R19,R11
	ldd R16,y+11
	clr R17
	sub R16,R12
	sbc R17,R13
	xcall _lcd_dot
	.dbline 221
;       lcd_dot(xCenter - x, yCenter - y, mode);
	std y+0,R14
	ldd R18,y+13
	clr R19
	sub R18,R10
	sbc R19,R11
	ldd R16,y+11
	clr R17
	sub R16,R12
	sbc R17,R13
	xcall _lcd_dot
	.dbline 223
; 	
;       lcd_dot(yCenter + y - d, yCenter + x, mode);
	std y+0,R14
	ldd R18,y+13
	clr R19
	add R18,R12
	adc R19,R13
	ldd R16,y+13
	clr R17
	add R16,R10
	adc R17,R11
	mov R2,R22
	clr R3
	sub R16,R2
	sbc R17,R3
	xcall _lcd_dot
	.dbline 224
;       lcd_dot(yCenter + y - d, yCenter - x, mode);
	std y+0,R14
	ldd R18,y+13
	clr R19
	sub R18,R12
	sbc R19,R13
	ldd R16,y+13
	clr R17
	add R16,R10
	adc R17,R11
	mov R2,R22
	clr R3
	sub R16,R2
	sbc R17,R3
	xcall _lcd_dot
	.dbline 226
;    
;       lcd_dot(yCenter - y - d, yCenter + x, mode);
	std y+0,R14
	ldd R18,y+13
	clr R19
	add R18,R12
	adc R19,R13
	ldd R16,y+13
	clr R17
	sub R16,R10
	sbc R17,R11
	mov R2,R22
	clr R3
	sub R16,R2
	sbc R17,R3
	xcall _lcd_dot
	.dbline 227
;       lcd_dot(yCenter - y - d, yCenter - x, mode);
	std y+0,R14
	ldd R18,y+13
	clr R19
	sub R18,R12
	sbc R19,R13
	ldd R16,y+13
	clr R17
	sub R16,R10
	sbc R17,R11
	mov R2,R22
	clr R3
	sub R16,R2
	sbc R17,R3
	xcall _lcd_dot
	.dbline 229
; 
;       if (tSwitch<0) 
	cpi R20,0
	ldi R30,0
	cpc R21,R30
	brge L85
	.dbline 230
;          tSwitch += (4 * x + 6);
	ldi R16,4
	ldi R17,0
	movw R18,R12
	xcall empy16s
	movw R24,R16
	adiw R24,6
	add R20,R24
	adc R21,R25
	xjmp L86
L85:
	.dbline 232
;       else 
;        { tSwitch += (4 * (x - y) + 10);
	.dbline 232
	movw R18,R12
	sub R18,R10
	sbc R19,R11
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R24,R16
	adiw R24,10
	add R20,R24
	adc R21,R25
	.dbline 233
;          y--;
	movw R24,R10
	sbiw R24,1
	movw R10,R24
	.dbline 234
;        }
L86:
	.dbline 235
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 236
L83:
	.dbline 216
	cp R10,R12
	cpc R11,R13
	brlt X5
	xjmp L82
X5:
	.dbline -2
L81:
	adiw R28,1
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r tSwitch 20 I
	.dbsym r d 22 c
	.dbsym r y 10 I
	.dbsym r x 12 I
	.dbsym r mode 14 c
	.dbsym l radius 15 c
	.dbsym l yCenter 13 c
	.dbsym l xCenter 11 c
	.dbend
	.dbfunc e lcd_rect _lcd_rect fV
;           mode -> R14
;         height -> R12
;          width -> R22
;              y -> R20
;              x -> R10
	.even
_lcd_rect::
	xcall push_gset5
	mov R20,R18
	mov R10,R16
	sbiw R28,5
	ldd R22,y+15
	ldd R12,y+17
	ldd R14,y+19
	.dbline -1
	.dbline 241
;       x++;
;     }
;  }
; 
; 
; void lcd_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t mode) 
;  { width--;
	.dbline 241
	dec R22
	.dbline 242
;    height--;
	dec R12
	.dbline 243
;    lcd_line(x, y, x+width, y, mode);	// top
	std y+4,R14
	std y+2,R20
	mov R2,R10
	add R2,R22
	std y+0,R2
	mov R18,R20
	mov R16,R10
	xcall _lcd_line
	.dbline 244
;    lcd_line(x, y, x, y+height, mode);	// left
	std y+4,R14
	mov R2,R20
	add R2,R12
	std y+2,R2
	std y+0,R10
	mov R18,R20
	mov R16,R10
	xcall _lcd_line
	.dbline 245
;    lcd_line(x, y+height, x+width, y+height, mode);	// bottom
	std y+4,R14
	mov R2,R20
	add R2,R12
	std y+2,R2
	mov R4,R10
	add R4,R22
	std y+0,R4
	mov R18,R2
	mov R16,R10
	xcall _lcd_line
	.dbline 246
;    lcd_line(x+width, y, x+width, y+height, mode);		// right
	std y+4,R14
	mov R2,R20
	add R2,R12
	std y+2,R2
	mov R2,R10
	add R2,R22
	std y+0,R2
	mov R18,R20
	mov R16,R2
	xcall _lcd_line
	.dbline -2
L87:
	adiw R28,5
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r mode 14 c
	.dbsym r height 12 c
	.dbsym r width 22 c
	.dbsym r y 20 c
	.dbsym r x 10 c
	.dbend
	.dbfunc e lcd_box _lcd_box fV
;              i -> R20
;           mode -> R22
;         height -> R10
;          width -> R12
;              y -> R14
;              x -> y+15
	.even
_lcd_box::
	xcall push_arg4
	xcall push_gset5
	mov R14,R18
	sbiw R28,5
	ldd R12,y+19
	ldd R10,y+21
	ldd R22,y+23
	.dbline -1
	.dbline 250
;  }
; 
; void lcd_box( uint8_t x, uint8_t y, uint8_t width,  uint8_t height,  uint8_t mode) 
;  { uint8_t i;
	.dbline 251
;    if (!width) return; 
	tst R12
	brne L89
	.dbline 251
	xjmp L88
L89:
	.dbline 253
; 
;    width--;
	dec R12
	.dbline 255
; 	
;    for (i=y;i<y+height;i++) 
	mov R20,R14
	xjmp L94
L91:
	.dbline 256
	std y+4,R22
	std y+2,R20
	ldd R2,y+15
	add R2,R12
	std y+0,R2
	mov R18,R20
	ldd R16,y+15
	xcall _lcd_line
L92:
	.dbline 255
	inc R20
L94:
	.dbline 255
	mov R2,R14
	add R2,R10
	cp R20,R2
	brlo L91
	.dbline -2
L88:
	adiw R28,5
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r mode 22 c
	.dbsym r height 10 c
	.dbsym r width 12 c
	.dbsym r y 14 c
	.dbsym l x 15 c
	.dbend

⌨️ 快捷键说明

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