📄 m128.lst
字号:
041B 2EA0 MOV R10,R16
041C 814E LDD R20,Y+6
041D 815F LDD R21,Y+7
(0239) }
(0240) }
(0241) /* 传送LCD内部汉字数据到LCD */
(0242) /* x:0x00~0x07 y:0x00~0x03 */
(0243) void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p)
(0244) {
(0245) x+=2;
041E 2D8A MOV R24,R10
041F 5F8E SUBI R24,0xFE
0420 2EA8 MOV R10,R24
0421 C01A RJMP 0x043C
(0246) while((*hz_p)!=0)
(0247) {
(0248) ocmj_write(0xf0);
0422 EF00 LDI R16,0xF0
0423 DF97 RCALL _ocmj_write
(0249) ocmj_write(x);
0424 2D0A MOV R16,R10
0425 DF95 RCALL _ocmj_write
(0250) ocmj_write(y);
0426 2F06 MOV R16,R22
0427 DF93 RCALL _ocmj_write
(0251) ocmj_write(*hz_p-0xa0);
0428 01FA MOVW R30,R20
0429 8100 LDD R16,Z+0
042A 5A00 SUBI R16,0xA0
042B DF8F RCALL _ocmj_write
(0252) hz_p++;
042C 5F4F SUBI R20,0xFF
042D 4F5F SBCI R21,0xFF
(0253) ocmj_write(*hz_p-0xa0);
042E 01FA MOVW R30,R20
042F 8100 LDD R16,Z+0
0430 5A00 SUBI R16,0xA0
0431 DF89 RCALL _ocmj_write
(0254) hz_p++;
0432 5F4F SUBI R20,0xFF
0433 4F5F SBCI R21,0xFF
(0255) if(x<0x09)
0434 2D8A MOV R24,R10
0435 3089 CPI R24,0x9
0436 F410 BCC 0x0439
(0256) x++;
0437 94A3 INC R10
0438 C003 RJMP 0x043C
(0257) else
(0258) {
(0259) x=0x02;
0439 E082 LDI R24,2
043A 2EA8 MOV R10,R24
(0260) y++;
043B 9563 INC R22
043C 01FA MOVW R30,R20
043D 8020 LDD R2,Z+0
043E 2022 TST R2
043F F711 BNE 0x0422
0440 940E072D CALL pop_gset3
0442 9508 RET
_asc_tran:
asc_p --> R20
y --> R22
x --> R10
0443 940E0737 CALL push_gset3
0445 2F62 MOV R22,R18
0446 2EA0 MOV R10,R16
0447 814E LDD R20,Y+6
0448 815F LDD R21,Y+7
(0261) }
(0262) }
(0263) }
(0264) /* 传送ASCII字母到LCD */
(0265) /* x:0x00~0x0f y:0~64 */
(0266) void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p)
(0267) {
(0268) x+=4;
0449 2D8A MOV R24,R10
044A 5F8C SUBI R24,0xFC
044B 2EA8 MOV R10,R24
044C C013 RJMP 0x0460
(0269) while((*asc_p)!=0)
(0270) {
(0271) ocmj_write(0xf1);
044D EF01 LDI R16,0xF1
044E DF6C RCALL _ocmj_write
(0272) ocmj_write(x);
044F 2D0A MOV R16,R10
0450 DF6A RCALL _ocmj_write
(0273) ocmj_write(y);
0451 2F06 MOV R16,R22
0452 DF68 RCALL _ocmj_write
(0274) ocmj_write(*asc_p);
0453 01FA MOVW R30,R20
0454 8100 LDD R16,Z+0
0455 DF65 RCALL _ocmj_write
(0275) asc_p++;
0456 5F4F SUBI R20,0xFF
0457 4F5F SBCI R21,0xFF
(0276) if (x<0x13)
0458 2D8A MOV R24,R10
0459 3183 CPI R24,0x13
045A F410 BCC 0x045D
(0277) x++;
045B 94A3 INC R10
045C C003 RJMP 0x0460
(0278) else
(0279) {
(0280) x=0x04;
045D E084 LDI R24,4
045E 2EA8 MOV R10,R24
(0281) y+=8;
045F 5F68 SUBI R22,0xF8
0460 01FA MOVW R30,R20
0461 8020 LDD R2,Z+0
0462 2022 TST R2
0463 F749 BNE 0x044D
0464 940E072D CALL pop_gset3
0466 9508 RET
_pset:
y --> R20
x --> R22
0467 940E0739 CALL push_gset2
0469 2F42 MOV R20,R18
046A 2F60 MOV R22,R16
(0282) }
(0283) }
(0284) }
(0285) /* 画点函数 */
(0286) void pset(unsigned char x,unsigned char y)
(0287) {
(0288) ocmj_write(0xf2);
046B EF02 LDI R16,0xF2
046C DF4E RCALL _ocmj_write
(0289) ocmj_write(x+32);
046D 2F06 MOV R16,R22
046E 5E00 SUBI R16,0xE0
046F DF4B RCALL _ocmj_write
(0290) ocmj_write(y);
0470 2F04 MOV R16,R20
0471 DF49 RCALL _ocmj_write
0472 940E072A CALL pop_gset2
0474 9508 RET
_line:
incy --> R20
incx --> R22
delta_y --> R10
delta_x --> Y+4
t --> R14
yerr --> Y+2
xerr --> Y+0
distance --> R12
y2 --> Y+22
x2 --> Y+20
y1 --> Y+18
x1 --> Y+16
0475 940E06DB CALL push_arg4
0477 940E0733 CALL push_gset5
0479 9726 SBIW R28,6
(0291) }
(0292) /* 画线函数 */
(0293) void line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
(0294) {
(0295) unsigned char t;
(0296) signed int xerr=0,yerr=0;
047A 2400 CLR R0
047B 2411 CLR R1
047C 8219 STD Y+1,R1
047D 8208 STD Y+0,R0
047E 821B STD Y+3,R1
047F 820A STD Y+2,R0
(0297) signed int delta_x,delta_y,distance;
(0298) signed char incx,incy;
(0299)
(0300) /* 计算两个方向的长度 */
(0301) delta_x=x2-x1;
0480 8828 LDD R2,Y+16
0481 2433 CLR R3
0482 884C LDD R4,Y+20
0483 2455 CLR R5
0484 1842 SUB R4,R2
0485 0853 SBC R5,R3
0486 825D STD Y+5,R5
0487 824C STD Y+4,R4
(0302) delta_y=y2-y1;
0488 882A LDD R2,Y+18
0489 2433 CLR R3
048A 88AE LDD R10,Y+22
048B 24BB CLR R11
048C 18A2 SUB R10,R2
048D 08B3 SBC R11,R3
(0303)
(0304) /* 计算增量的方向,增量为"0"表示为垂直或水平线 */
(0305) if(delta_x>0)
048E 2422 CLR R2
048F 0102 MOVW R0,R4
0490 1424 CP R2,R4
0491 0435 CPC R3,R5
0492 F414 BGE 0x0495
(0306) incx=1;
0493 E061 LDI R22,1
0494 C011 RJMP 0x04A6
(0307) else
(0308) {
(0309) if( delta_x==0 )
0495 800C LDD R0,Y+4
0496 801D LDD R1,Y+5
0497 2000 TST R0
0498 F421 BNE 0x049D
0499 2011 TST R1
049A F411 BNE 0x049D
(0310) incx=0;
049B 2766 CLR R22
049C C009 RJMP 0x04A6
(0311) else
(0312) {
(0313) incx=-1;
049D EF6F LDI R22,0xFF
(0314) delta_x =-delta_x;
049E 818C LDD R24,Y+4
049F 819D LDD R25,Y+5
04A0 9580 COM R24
04A1 9590 COM R25
04A2 5F8F SUBI R24,0xFF
04A3 4F9F SBCI R25,0xFF
04A4 839D STD Y+5,R25
04A5 838C STD Y+4,R24
(0315) }
(0316) }
(0317) if(delta_y>0)
04A6 2422 CLR R2
04A7 2433 CLR R3
04A8 142A CP R2,R10
04A9 043B CPC R3,R11
04AA F414 BGE 0x04AD
(0318) incy=1;
04AB E041 LDI R20,1
04AC C00D RJMP 0x04BA
(0319) else
(0320) {
(0321) if( delta_y==0 )
04AD 20AA TST R10
04AE F421 BNE 0x04B3
04AF 20BB TST R11
04B0 F411 BNE 0x04B3
(0322) incy=0;
04B1 2744 CLR R20
04B2 C007 RJMP 0x04BA
(0323) else
(0324) {
(0325) incy=-1;
04B3 EF4F LDI R20,0xFF
(0326) delta_y =-delta_y;
04B4 01C5 MOVW R24,R10
04B5 9580 COM R24
04B6 9590 COM R25
04B7 5F8F SUBI R24,0xFF
04B8 4F9F SBCI R25,0xFF
04B9 015C MOVW R10,R24
(0327) }
(0328) }
(0329) /* 确定画线的范围 */
(0330) if( delta_x > delta_y ) distance=delta_x;
04BA 800C LDD R0,Y+4
04BB 801D LDD R1,Y+5
04BC 14A0 CP R10,R0
04BD 04B1 CPC R11,R1
04BE F414 BGE 0x04C1
04BF 0160 MOVW R12,R0
04C0 C001 RJMP 0x04C2
(0331) else distance=delta_y;
04C1 0165 MOVW R12,R10
(0332)
(0333) /* 画线 */
(0334) for(t=0;t<= distance+1;t++)
04C2 24EE CLR R14
04C3 C02E RJMP 0x04F2
(0335) {
(0336) ocmj_write(0xf2);
04C4 EF02 LDI R16,0xF2
04C5 DEF5 RCALL _ocmj_write
(0337) ocmj_write(x1+32);
04C6 8908 LDD R16,Y+16
04C7 5E00 SUBI R16,0xE0
04C8 DEF2 RCALL _ocmj_write
(0338) ocmj_write(y1);
04C9 890A LDD R16,Y+18
04CA DEF0 RCALL _ocmj_write
(0339) xerr += delta_x ;
04CB 8008 LDD R0,Y+0
04CC 8019 LDD R1,Y+1
04CD 810C LDD R16,Y+4
04CE 811D LDD R17,Y+5
04CF 0E00 ADD R0,R16
04D0 1E11 ADC R1,R17
04D1 8219 STD Y+1,R1
04D2 8208 STD Y+0,R0
(0340) yerr += delta_y ;
04D3 800A LDD R0,Y+2
04D4 801B LDD R1,Y+3
04D5 0C0A ADD R0,R10
04D6 1C1B ADC R1,R11
04D7 821B STD Y+3,R1
04D8 820A STD Y+2,R0
(0341) if( xerr > distance )
04D9 8008 LDD R0,Y+0
04DA 8019 LDD R1,Y+1
04DB 14C0 CP R12,R0
04DC 04D1 CPC R13,R1
04DD F43C BGE 0x04E5
(0342) {
(0343) xerr-=distance;
04DE 180C SUB R0,R12
04DF 081D SBC R1,R13
04E0 8219 STD Y+1,R1
04E1 8208 STD Y+0,R0
(0344) x1+=incx;
04E2 8808 LDD R0,Y+16
04E3 0E06 ADD R0,R22
04E4 8A08 STD Y+16,R0
(0345) }
(0346) if( yerr > distance )
04E5 800A LDD R0,Y+2
04E6 801B LDD R1,Y+3
04E7 14C0 CP R12,R0
04E8 04D1 CPC R13,R1
04E9 F43C BGE 0x04F1
(0347) {
(0348) yerr-=distance;
04EA 180C SUB R0,R12
04EB 081D SBC R1,R13
04EC 821B STD Y+3,R1
04ED 820A STD Y+2,R0
(0349) y1+=incy;
04EE 880A LDD R0,Y+18
04EF 0E04 ADD R0,R20
04F0 8A0A STD Y+18,R0
04F1 94E3 INC R14
04F2 01C6 MOVW R24,R12
04F3 9601 ADIW R24,1
04F4 2C2E MOV R2,R14
04F5 2433 CLR R3
04F6 1582 CP R24,R2
04F7 0593 CPC R25,R3
04F8 F65C BGE 0x04C4
04F9 9626 ADIW R28,6
04FA 940E0730 CALL pop_gset5
04FC 9624 ADIW R28,4
04FD 9508 RET
_circle:
rs --> R20
xt --> R22
rr --> Y+2
xx --> R14
y --> R12
x --> R10
yt --> Y+0
r --> Y+18
y0 --> Y+16
x0 --> Y+14
04FE 940E06DB CALL push_arg4
0500 940E0733 CALL push_gset5
0502 9724 SBIW R28,4
(0350) }
(0351) }
(0352) }
(0353) /* 画圆函数 */
(0354) void circle(unsigned char x0,unsigned char y0,unsigned char r)
(0355) {
(0356) unsigned char x,y;
(0357) unsigned int xx,rr,xt,yt,rs;
(0358) yt=r;
0503 882A LDD R2,Y+18
0504 2433 CLR R3
0505 8239 STD Y+1,R3
0506 8228 STD Y+0,R2
(0359) rr=r*r+1; //补偿 1 修正方形
0507 880A LDD R0,Y+18
0508 2D00 MOV R16,R0
0509 9E00 MUL R0,R16
050A 01C0 MOVW R24,R0
050B 9601 ADIW R24,1
050C 839B STD Y+3,R25
050D 838A STD Y+2,R24
(0360) rs=yt*3/4; //画8分之一圆弧
050E E003 LDI R16,3
050F E010 LDI R17,0
0510 8128 LDD R18,Y+0
0511 8139 LDD R19,Y+1
0512 940E071A CALL empy16s
0514 01A8 MOVW R20,R16
0515 9556 LSR R21
0516 9547 ROR R20
0517 9556 LSR R21
0518 9547 ROR R20
(0361) for (xt=0;xt<=rs;xt++)
0519 2766 CLR R22
051A 2777 CLR R23
051B C063 RJMP 0x057F
(0362) {
(0363) xx=xt*xt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -