📄 ks0108.s
字号:
; y -> R20,R21
; flag -> R10
; yy -> R14
; xx -> R12
.even
_pixel::
xcall push_gset5
mov R14,R18
mov R12,R16
sbiw R28,1
ldd R10,y+11
.dbline -1
.dbline 542
; i++;
; }
; }
;
; /*************************************/
; /* 绘点函数 */
; /*************************************/
; /* XX--(0-128) YY--(0-63) FLAG=1绘点 FLAG=0 清点 */
; void pixel(unsigned char xx,unsigned char yy,unsigned char flag)
; {
.dbline 544
; unsigned int y,ch;
; ch=yy%8; //余数
ldi R18,8
ldi R19,0
mov R16,R14
clr R17
xcall mod16s
movw R22,R16
.dbline 546
;
; y=1;
ldi R20,1
ldi R21,0
.dbline 547
; for(;ch!=0;)
xjmp L159
L156:
.dbline 548
.dbline 549
ldi R16,2
ldi R17,0
movw R18,R20
xcall empy16s
movw R20,R16
.dbline 550
subi R22,1
sbci R23,0
.dbline 551
L157:
.dbline 547
L159:
.dbline 547
cpi R22,0
cpc R22,R23
brne L156
X10:
.dbline 552
; {
; y=y*2;
; ch--;
; }
; if(xx<64)
mov R24,R12
cpi R24,64
brsh L160
.dbline 553
; {
.dbline 554
; set_page_L(yy/8);
mov R16,R14
lsr R16
lsr R16
lsr R16
xcall _set_page_L
.dbline 555
; set_col_addr_L(xx);
mov R16,R12
xcall _set_col_addr_L
.dbline 556
; ch=read_LCD(LEFT);
clr R16
xcall _read_LCD
mov R22,R16
clr R23
.dbline 557
; set_col_addr_L(xx);
mov R16,R12
xcall _set_col_addr_L
.dbline 558
; if(flag)
tst R10
breq L162
.dbline 559
; write_LCD(LEFT,DATA,ch|y);
movw R2,R22
or R2,R20
or R3,R21
std y+0,R2
ldi R18,1
clr R16
xcall _write_LCD
xjmp L161
L162:
.dbline 561
; else
; {
.dbline 562
; y=~y;
com R20
com R21
.dbline 563
; ch&=y;
and R22,R20
and R23,R21
.dbline 564
; write_LCD(LEFT,DATA,ch|y);
movw R2,R22
or R2,R20
or R3,R21
std y+0,R2
ldi R18,1
clr R16
xcall _write_LCD
.dbline 565
; }
.dbline 566
; }
xjmp L161
L160:
.dbline 568
; else
; {
.dbline 569
; set_page_R(yy/8);
mov R16,R14
lsr R16
lsr R16
lsr R16
xcall _set_page_R
.dbline 570
; set_col_addr_R(xx-64);
mov R16,R12
subi R16,64
xcall _set_col_addr_R
.dbline 571
; ch=read_LCD(RIGHT);
ldi R16,1
xcall _read_LCD
mov R22,R16
clr R23
.dbline 572
; set_col_addr_R(xx-64);
mov R16,R12
subi R16,64
xcall _set_col_addr_R
.dbline 573
; if(flag)
tst R10
breq L164
.dbline 574
; write_LCD(RIGHT,DATA,ch|y);
movw R2,R22
or R2,R20
or R3,R21
std y+0,R2
ldi R18,1
ldi R16,1
xcall _write_LCD
xjmp L165
L164:
.dbline 576
; else
; {
.dbline 577
; y=~y;
com R20
com R21
.dbline 578
; ch&=y;
and R22,R20
and R23,R21
.dbline 579
; write_LCD(RIGHT,DATA,ch|y);
movw R2,R22
or R2,R20
or R3,R21
std y+0,R2
ldi R18,1
ldi R16,1
xcall _write_LCD
.dbline 580
; }
L165:
.dbline 581
L161:
.dbline -2
L155:
adiw R28,1
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r ch 22 i
.dbsym r y 20 i
.dbsym r flag 10 c
.dbsym r yy 14 c
.dbsym r xx 12 c
.dbend
.dbfunc e Linexy _Linexy fV
; incy -> y+9
; incx -> y+7
; delta_y -> y+5
; delta_x -> y+3
; uCol -> y+1
; uRow -> R20,R21
; yerr -> R22,R23
; xerr -> R10,R11
; distance -> R12,R13
; t -> R14
; s -> y+25
; yt -> y+23
; xt -> y+21
; y0 -> R12
; x0 -> R20
.even
_Linexy::
xcall push_gset5
mov R12,R18
mov R20,R16
sbiw R28,11
.dbline -1
.dbline 708
; }
; }
; /*void point(void)
; {
; uchar x1, y1, y;
;
; x1 = CurCol;
; y1 = CurRow;
; CurRow = y1 >> 3; //取Y方向分页地址
; Rddata(); // get cbyte on screen
; y = y1 & 0x07; //字节内位置计算
; Wrdata(cbyte | (1 << y)); //画上屏幕 /
; CurCol = x1; ///恢复xy坐标 /
; CurRow = y1;
; } */
;
; /************************************************/
; /*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
; /************************************************/
;
; /*void circle(uchar Ox, uchar Oy, uchar Rx)
; {
; unsigned int xx, rr, xt, yt, rs;
;
; yt = Rx;
; rr = Rx * Rx + 1; //补偿 1 修正方形
; rs = (yt + (yt >> 1)) >> 1; //(*0.75)分开1/8圆弧来画
; for (xt = 0; xt <= rs; xt++)
; {
; xx = xt * xt;
; while ((yt * yt) > (rr - xx))
; yt--;
; col = Ox + xt; //第一象限
; row=Oy-yt;
; point();
; col = Ox - xt; //第二象限
; point();
; row = Oy + yt; //第三象限
; point();
; col = Ox + xt; //第四象限
; point();
;
; // ***************45度镜象画另一半***************
;
; col = Ox + yt; //第一象限
; row = Oy - xt;
; point();
; col = Ox - yt; //第二象限
; point();
; row = Oy + xt; //第三象限
; point();
; col = Ox + yt; //第四象限
; point();
; }
; }
; */
;
; /************************************************/
; /*画线。任意方向的斜线,直线数学方程 aX+bY=1 */
; /************************************************/
;
; /*void Linexy(uchar x0,uchar y0,uchar xt,uchar yt)
; {
; uchar t;
; int xerr = 0, yerr = 0, delta_x, delta_y, distance;
; int incx, incy;
;
; delta_x = xt - x0; // 计算坐标增量
; delta_y = yt - y0;
; col = x0;
; row = y0;
;
; if (delta_x > 0)
; {
; incx = 1; // 水平+方向
; }
; else if (delta_x == 0 )
; {
; incx = 0; // 垂直线
; }
; else
; {
; incx =- 1; //水平负方向
; delta_x =- delta_x;
; }
;
; if (delta_y > 0)
; {
; incy = 1; // 垂直+方向
; }
; else
; if (delta_y == 0)
; {
; incy = 0; // 水平线
; }
; else
; {
; incy =- 1; //垂直-方向
; delta_y =- delta_y;
; }
;
;
; if (delta_x > delta_y)
; distance = delta_x; //选取基本增量坐标轴
; else
; distance = delta_y;
;
; for (t = 0; t <= distance + 1; t++)
; { // 画线输出
; point(); // 画点
; xerr += delta_x;
; yerr += delta_y;
;
; if (xerr > distance)
; {
; xerr -= distance;
; col += incx;
; }
; if (yerr > distance)
; {
; yerr -= distance;
; row += incy;
; }
; }
; }
; */
; void Linexy(uchar x0,uchar y0,uchar xt,uchar yt,uchar s)
; {
.dbline 710
; register uchar t;
; int xerr=0,yerr=0,delta_x,delta_y,distance;
clr R10
clr R11
.dbline 710
clr R22
clr R23
.dbline 713
; int incx,incy,uRow,uCol;
;
; delta_x = xt-x0; //计算坐标增量
mov R2,R20
clr R3
ldd R4,y+21
clr R5
sub R4,R2
sbc R5,R3
std y+4,R5
std y+3,R4
.dbline 714
; delta_y = yt-y0;
mov R2,R12
clr R3
ldd R4,y+23
clr R5
sub R4,R2
sbc R5,R3
std y+6,R5
std y+5,R4
.dbline 715
; uRow = x0;
clr R21
.dbline 716
; uCol = y0;
clr R3
std y+2,R3
std y+1,R2
.dbline 717
; if(delta_x>0) incx=1; //设置单步方向
clr R2
ldd R4,y+3
ldd R5,y+4
cp R2,R4
cpc R3,R5
brge L167
.dbline 717
ldi R24,1
ldi R25,0
std y+8,R25
std y+7,R24
xjmp L168
L167:
.dbline 718
; else if( delta_x==0 ) incx=0; //垂直线
ldd R2,y+3
ldd R3,y+4
tst R2
brne L169
tst R3
brne L169
X11:
.dbline 718
clr R2
clr R3
std y+8,R3
std y+7,R2
xjmp L170
L169:
.dbline 719
; else {incx=-1;delta_x=-delta_x;}
.dbline 719
ldi R24,-1
ldi R25,-1
std y+8,R25
std y+7,R24
.dbline 719
ldd R24,y+3
ldd R25,y+4
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
std y+4,R25
std y+3,R24
.dbline 719
L170:
L168:
.dbline 721
;
; if(delta_y>0) incy=1;
clr R2
clr R3
ldd R4,y+5
ldd R5,y+6
cp R2,R4
cpc R3,R5
brge L171
.dbline 721
ldi R24,1
ldi R25,0
std y+10,R25
std y+9,R24
xjmp L172
L171:
.dbline 722
; else if( delta_y==0 ) incy=0; //水平线
ldd R2,y+5
ldd R3,y+6
tst R2
brne L173
tst R3
brne L173
X12:
.dbline 722
clr R2
clr R3
std y+10,R3
std y+9,R2
xjmp L174
L173:
.dbline 723
; else {incy=-1;delta_y=-delta_y;}
.dbline 723
ldi R24,-1
ldi R25,-1
std y+10,R25
std y+9,R24
.dbline 723
ldd R24,y+5
ldd R25,y+6
com R24
com R25
subi R24,0xFF
sbci R25,0xFF
std y+6,R25
std y+5,R24
.dbline 723
L174:
L172:
.dbline 725
;
; if( delta_x > delta_y ) distance=delta_x; //选取基本增量坐标轴
ldd R2,y+5
ldd R3,y+6
ldd R4,y+3
ldd R5,y+4
cp R2,R4
cpc R3,R5
brge L175
.dbline 725
movw R12,R4
xjmp L176
L175:
.dbline 726
; else distance=delta_y;
ldd R12,y+5
ldd R13,y+6
L176:
.dbline 728
;
; for( t=0;t <= distance+1; t++ )
clr R14
xjmp L180
L177:
.dbline 729
; { //画线输出
.dbline 730
; pixel(uRow,uCol,s); //画点
ldd R0,y+25
std y+0,R0
ldd R18,y+1
mov R16,R20
xcall _pixel
.dbline 731
; xerr += delta_x ;
ldd R2,y+3
ldd R3,y+4
add R10,R2
adc R11,R3
.dbline 732
; yerr += delta_y ;
ldd R2,y+5
ldd R3,y+6
add R22,R2
adc R23,R3
.dbline 734
;
; if( xerr > distance )
cp R12,R10
cpc R13,R11
brge L181
.dbline 735
; {
.dbline 736
; xerr-=distance;
sub R10,R12
sbc R11,R13
.dbline 737
; uRow+=incx;
ldd R2,y+7
ldd R3,y+8
add R20,R2
adc R21,R3
.dbline 738
; }
L181:
.dbline 739
; if( yerr > distance )
cp R12,R22
cpc R13,R23
brge L183
.dbline 740
; {
.dbline 741
; yerr-=distance;
sub R22,R12
sbc R23,R13
.dbline 742
; uCol+=incy;
ldd R2,y+9
ldd R3,y+10
ldd R4,y+1
ldd R5,y+2
add R4,R2
adc R5,R3
std y+2,R5
std y+1,R4
.dbline 743
; }
L183:
.dbline 744
L178:
.dbline 728
inc R14
L180:
.dbline 728
movw R24,R12
adiw R24,1
mov R2,R14
clr R3
cp R24,R2
cpc R25,R3
brge L177
.dbline -2
L166:
adiw R28,11
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l incy 9 I
.dbsym l incx 7 I
.dbsym l delta_y 5 I
.dbsym l delta_x 3 I
.dbsym l uCol 1 I
.dbsym r uRow 20 I
.dbsym r yerr 22 I
.dbsym r xerr 10 I
.dbsym r distance 12 I
.dbsym r t 14 c
.dbsym l s 25 c
.dbsym l yt 23 c
.dbsym l xt 21 c
.dbsym r y0 12 c
.dbsym r x0 20 c
.dbend
.dbfunc e circle _circle fV
; rs -> y+1
; xt -> R20,R21
; rr -> R22,R23
; xx -> R14,R15
; col -> R12,R13
; row -> R10,R11
; yt -> y+3
; s -> y+21
; Rx -> y+19
; Oy -> y+17
; Ox -> y+15
.even
_circle::
xcall push_arg4
xcall push_gset5
sbiw R28,5
.dbline -1
.dbline 751
; }
; }
;
; /************************************************/
; /*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
; /************************************************/
; void circle(uchar Ox,uchar Oy,uchar Rx,uchar s)
; {
.dbline 753
; unsigned int xx,rr,xt,yt,rs,row,col;
; yt=Rx;
ldd R2,y+19
clr R3
std y+4,R3
std y+3,R2
.dbline 754
; rr=Rx*Rx+1; //补偿 1 修正方形
ldd R0,y+19
mov R16,R0
mul R0,R16
movw R22,R0
subi R22,255 ; offset = 1
sbci R23,255
.dbline 755
; rs=(yt+(yt>>1))>>1; //(*0.75)分开1/8圆弧来画
lsr R3
ror R2
ldd R4,y+3
ldd R5,y+4
add R4,R2
adc R5,R3
lsr R5
ror R4
std y+2,R5
std y+1,R4
.dbline 756
; for (xt=0;xt<=rs;xt++)
clr R20
clr R21
xjmp L189
L186:
.dbline 757
; {
.dbline 758
; xx=xt*xt;
movw R18,R20
movw R16,R20
xcall empy16s
movw R14,R16
xjmp L191
L190:
.dbline 759
ldd R24,y+3
ldd R25,y+4
sbiw R24,1
std y+4,R25
std y+3,R24
L191:
.dbline 759
movw R2,R22
sub R2,R14
sbc R3,R15
ldd R18,y+3
ldd R19,y+4
movw R16,R18
xcall empy16s
cp R2,R16
cpc R3,R17
brlo L190
.dbline 760
ldd R10,y+15
clr R11
add R10,R20
adc R11,R21
.dbline 761
ldd R12,y+17
clr R13
ldd R0,y+3
ldd R1,y+4
sub R12,R0
sbc R13,R1
.dbline 762
ldd R0,y+21
std y+0,R0
mov R18,R12
mov R16,R10
xcall _pixel
.dbline 763
ldd R10,y+15
clr R11
sub R10,R20
sbc R11,R21
.dbline 764
ldd R0,y+21
std y+0,R0
mov R18,R12
mov R16,R10
xcall _pixel
.dbli
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -