📄 avr_ks0108.lst
字号:
(0495) ch_w=ch_w<<4;
06A5 2D8E MOV R24,R14
06A6 708F ANDI R24,0xF
06A7 9582 SWAP R24
06A8 2EE8 MOV R14,R24
(0496) ch_w|=ch_r;
06A9 2AE6 OR R14,R22
(0497) SetPageCol(uPage,uCol+j);
06AA 2D2C MOV R18,R12
06AB 0F24 ADD R18,R20
06AC 8109 LDD R16,Y+1
06AD DDE2 RCALL _SetPageCol
(0498) if(uCol+j<64) write_LCD(LEFT,DATA,ch_w);
06AE 2D8C MOV R24,R12
06AF 0F84 ADD R24,R20
06B0 3480 CPI R24,0x40
06B1 F428 BCC 0x06B7
06B2 82E8 STD Y+0,R14
06B3 E021 LDI R18,1
06B4 2700 CLR R16
06B5 DC55 RCALL _write_LCD
06B6 C004 RJMP 0x06BB
(0499) else write_LCD(RIGHT,DATA,ch_w);
06B7 82E8 STD Y+0,R14
06B8 E021 LDI R18,1
06B9 E001 LDI R16,1
06BA DC50 RCALL _write_LCD
06BB 9543 INC R20
06BC 304C CPI R20,0xC
06BD F408 BCC 0x06BF
06BE CFCA RJMP 0x0689
(0500) }
(0501) SetPageCol(uPage+1,uCol);
06BF 2D2C MOV R18,R12
06C0 8109 LDD R16,Y+1
06C1 5F0F SUBI R16,0xFF
06C2 DDCD RCALL _SetPageCol
(0502) for(j=0;j<ASC_HZ_WIDTH;j++)
06C3 2744 CLR R20
06C4 C03A RJMP 0x06FF
(0503) {
(0504) SetPageCol(uPage+1,uCol+j);
06C5 2D2C MOV R18,R12
06C6 0F24 ADD R18,R20
06C7 8109 LDD R16,Y+1
06C8 5F0F SUBI R16,0xFF
06C9 DDC6 RCALL _SetPageCol
(0505)
(0506) ch_r=GB_16[k].Msk[j];
06CA E18A LDI R24,0x1A
06CB 9D8A MUL R24,R10
06CC 0110 MOVW R2,R0
06CD E584 LDI R24,0x54
06CE E092 LDI R25,2
06CF 0E28 ADD R2,R24
06D0 1E39 ADC R3,R25
06D1 2FE4 MOV R30,R20
06D2 27FF CLR R31
06D3 0DE2 ADD R30,R2
06D4 1DF3 ADC R31,R3
06D5 9164 LPM R22,0(Z)
(0507) ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j];
06D6 E18A LDI R24,0x1A
06D7 9D8A MUL R24,R10
06D8 0110 MOVW R2,R0
06D9 E584 LDI R24,0x54
06DA E092 LDI R25,2
06DB 0E28 ADD R2,R24
06DC 1E39 ADC R3,R25
06DD 2FE4 MOV R30,R20
06DE 27FF CLR R31
06DF 963C ADIW R30,0xC
06E0 0DE2 ADD R30,R2
06E1 1DF3 ADC R31,R3
06E2 90E4 LPM R14,0(Z)
(0508) ch_r=ch_r>>4;
06E3 2F86 MOV R24,R22
06E4 9582 SWAP R24
06E5 708F ANDI R24,0xF
06E6 2F68 MOV R22,R24
(0509) ch_w=ch_w<<4;
06E7 2D8E MOV R24,R14
06E8 708F ANDI R24,0xF
06E9 9582 SWAP R24
06EA 2EE8 MOV R14,R24
(0510) ch_w|=ch_r;
06EB 2AE6 OR R14,R22
(0511) SetPageCol(uPage+1,uCol+j);
06EC 2D2C MOV R18,R12
06ED 0F24 ADD R18,R20
06EE 8109 LDD R16,Y+1
06EF 5F0F SUBI R16,0xFF
06F0 DD9F RCALL _SetPageCol
(0512) if(uCol+j<64) write_LCD(LEFT,DATA,ch_w);
06F1 2D8C MOV R24,R12
06F2 0F84 ADD R24,R20
06F3 3480 CPI R24,0x40
06F4 F428 BCC 0x06FA
06F5 82E8 STD Y+0,R14
06F6 E021 LDI R18,1
06F7 2700 CLR R16
06F8 DC12 RCALL _write_LCD
06F9 C004 RJMP 0x06FE
(0513) else write_LCD(RIGHT,DATA,ch_w);
06FA 82E8 STD Y+0,R14
06FB E021 LDI R18,1
06FC E001 LDI R16,1
06FD DC0D RCALL _write_LCD
06FE 9543 INC R20
06FF 304C CPI R20,0xC
0700 F408 BCC 0x0702
0701 CFC3 RJMP 0x06C5
(0514) }
(0515) SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
0702 2D2C MOV R18,R12
0703 5F24 SUBI R18,0xF4
0704 8109 LDD R16,Y+1
0705 DD8A RCALL _SetPageCol
(0516) }
0706 9622 ADIW R28,2
0707 940E0990 CALL pop_gset5
0709 9508 RET
_disp_str:
i --> R20
p --> R22
070A 940E0999 CALL push_gset2
070C 01B8 MOVW R22,R16
(0517) }
(0518)
(0519) void disp_str(unsigned char *p)
(0520) {
(0521) unsigned char i=0;
070D 2744 CLR R20
070E C015 RJMP 0x0724
(0522) while(p[i]>0)
(0523) {
(0524) if(p[i] < 128)
070F 2FE4 MOV R30,R20
0710 27FF CLR R31
0711 0FE6 ADD R30,R22
0712 1FF7 ADC R31,R23
0713 8180 LDD R24,Z+0
0714 3880 CPI R24,0x80
0715 F438 BCC 0x071D
(0525) { /* ASCII */
(0526) disp_ch(p[i]);
0716 2FE4 MOV R30,R20
0717 27FF CLR R31
0718 0FE6 ADD R30,R22
0719 1FF7 ADC R31,R23
071A 8100 LDD R16,Z+0
071B DDC7 RCALL _disp_ch
(0527) }
071C C006 RJMP 0x0723
(0528) else
(0529) { /* 中文 */
(0530) disp_hz(&p[i]);
071D 2F04 MOV R16,R20
071E 2711 CLR R17
071F 0F06 ADD R16,R22
0720 1F17 ADC R17,R23
0721 DED6 RCALL _disp_hz
(0531) i++;
0722 9543 INC R20
(0532) }
(0533) i++;
0723 9543 INC R20
0724 2FE4 MOV R30,R20
0725 27FF CLR R31
0726 0FE6 ADD R30,R22
0727 1FF7 ADC R31,R23
0728 8020 LDD R2,Z+0
0729 2433 CLR R3
072A 1432 CP R3,R2
072B F318 BCS 0x070F
072C 940E098A CALL pop_gset2
072E 9508 RET
_pixel:
ch --> R22
y --> R20
flag --> R10
yy --> R14
xx --> R12
072F 940E0993 CALL push_gset5
0731 2EE2 MOV R14,R18
0732 2EC0 MOV R12,R16
0733 9721 SBIW R28,1
0734 84AB LDD R10,Y+11
(0534) }
(0535) }
(0536)
(0537) /*************************************/
(0538) /* 绘点函数 */
(0539) /*************************************/
(0540) /* XX--(0-128) YY--(0-63) FLAG=1绘点 FLAG=0 清点 */
(0541) void pixel(unsigned char xx,unsigned char yy,unsigned char flag)
(0542) {
(0543) unsigned int y,ch;
(0544) ch=yy%8; //余数
0735 E028 LDI R18,0x8
0736 E030 LDI R19,0
0737 2D0E MOV R16,R14
0738 2711 CLR R17
0739 940E0940 CALL mod16s
073B 01B8 MOVW R22,R16
(0545)
(0546) y=1;
073C E041 LDI R20,1
073D E050 LDI R21,0
(0547) for(;ch!=0;)
073E C008 RJMP 0x0747
(0548) {
(0549) y=y*2;
073F E002 LDI R16,2
0740 E010 LDI R17,0
0741 019A MOVW R18,R20
0742 940E097A CALL empy16s
0744 01A8 MOVW R20,R16
(0550) ch--;
0745 5061 SUBI R22,1
0746 4070 SBCI R23,0
0747 3060 CPI R22,0
0748 0767 CPC R22,R23
0749 F7A9 BNE 0x073F
(0551) }
(0552) if(xx<64)
074A 2D8C MOV R24,R12
074B 3480 CPI R24,0x40
074C F518 BCC 0x0770
(0553) {
(0554) set_page_L(yy/8);
074D 2D0E MOV R16,R14
074E 9506 LSR R16
074F 9506 LSR R16
0750 9506 LSR R16
0751 DCBD RCALL _set_page_L
(0555) set_col_addr_L(xx);
0752 2D0C MOV R16,R12
0753 DCD7 RCALL _set_col_addr_L
(0556) ch=read_LCD(LEFT);
0754 2700 CLR R16
0755 DC08 RCALL _read_LCD
0756 2F60 MOV R22,R16
0757 2777 CLR R23
(0557) set_col_addr_L(xx);
0758 2D0C MOV R16,R12
0759 DCD1 RCALL _set_col_addr_L
(0558) if(flag)
075A 20AA TST R10
075B F041 BEQ 0x0764
(0559) write_LCD(LEFT,DATA,ch|y);
075C 011B MOVW R2,R22
075D 2A24 OR R2,R20
075E 2A35 OR R3,R21
075F 8228 STD Y+0,R2
0760 E021 LDI R18,1
0761 2700 CLR R16
0762 DBA8 RCALL _write_LCD
0763 C030 RJMP 0x0794
(0560) else
(0561) {
(0562) y=~y;
0764 9540 COM R20
0765 9550 COM R21
(0563) ch&=y;
0766 2364 AND R22,R20
0767 2375 AND R23,R21
(0564) write_LCD(LEFT,DATA,ch|y);
0768 011B MOVW R2,R22
0769 2A24 OR R2,R20
076A 2A35 OR R3,R21
076B 8228 STD Y+0,R2
076C E021 LDI R18,1
076D 2700 CLR R16
076E DB9C RCALL _write_LCD
(0565) }
(0566) }
076F C024 RJMP 0x0794
(0567) else
(0568) {
(0569) set_page_R(yy/8);
0770 2D0E MOV R16,R14
0771 9506 LSR R16
0772 9506 LSR R16
0773 9506 LSR R16
0774 DCA8 RCALL _set_page_R
(0570) set_col_addr_R(xx-64);
0775 2D0C MOV R16,R12
0776 5400 SUBI R16,0x40
0777 DCC1 RCALL _set_col_addr_R
(0571) ch=read_LCD(RIGHT);
0778 E001 LDI R16,1
0779 DBE4 RCALL _read_LCD
077A 2F60 MOV R22,R16
077B 2777 CLR R23
(0572) set_col_addr_R(xx-64);
077C 2D0C MOV R16,R12
077D 5400 SUBI R16,0x40
077E DCBA RCALL _set_col_addr_R
(0573) if(flag)
077F 20AA TST R10
0780 F041 BEQ 0x0789
(0574) write_LCD(RIGHT,DATA,ch|y);
0781 011B MOVW R2,R22
0782 2A24 OR R2,R20
0783 2A35 OR R3,R21
0784 8228 STD Y+0,R2
0785 E021 LDI R18,1
0786 E001 LDI R16,1
0787 DB83 RCALL _write_LCD
0788 C00B RJMP 0x0794
(0575) else
(0576) {
(0577) y=~y;
0789 9540 COM R20
078A 9550 COM R21
(0578) ch&=y;
078B 2364 AND R22,R20
078C 2375 AND R23,R21
(0579) write_LCD(RIGHT,DATA,ch|y);
078D 011B MOVW R2,R22
078E 2A24 OR R2,R20
078F 2A35 OR R3,R21
0790 8228 STD Y+0,R2
0791 E021 LDI R18,1
0792 E001 LDI R16,1
0793 DB77 RCALL _write_LCD
(0580) }
(0581) }
0794 9621 ADIW R28,1
0795 940E0990 CALL pop_gset5
0797 9508 RET
_Linexy:
incy --> Y+9
incx --> Y+7
delta_y --> Y+5
delta_x --> Y+3
uCol --> Y+1
uRow --> R20
yerr --> R22
xerr --> R10
distance --> R12
t --> R14
s --> Y+25
yt --> Y+23
xt --> Y+21
y0 --> R12
x0 --> R20
0798 940E0993 CALL push_gset5
079A 2EC2 MOV R12,R18
079B 2F40 MOV R20,R16
079C 972B SBIW R28,0xB
(0582) }
(0583) /*void point(void)
(0584) {
(0585) uchar x1, y1, y;
(0586)
(0587) x1 = CurCol;
(0588) y1 = CurRow;
(0589) CurRow = y1 >> 3; //取Y方向分页地址
(0590) Rddata(); // get cbyte on screen
(0591) y = y1 & 0x07; //字节内位置计算
(0592) Wrdata(cbyte | (1 << y)); //画上屏幕 /
(0593) CurCol = x1; ///恢复xy坐标 /
(0594) CurRow = y1;
(0595) } */
(0596)
(0597) /************************************************/
(0598) /*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
(0599) /************************************************/
(0600)
(0601) /*void circle(uchar Ox, uchar Oy, uchar Rx)
(0602) {
(0603) unsigned int xx, rr, xt, yt, rs;
(0604)
(0605) yt = Rx;
(0606) rr = Rx * Rx + 1; //补偿 1 修正方形
(0607) rs = (yt + (yt >> 1)) >> 1; //(*0.75)分开1/8圆弧来画
(0608) for (xt = 0; xt <= rs; xt++)
(0609) {
(0610) xx = xt * xt;
(0611) while ((yt * yt) > (rr - xx))
(0612) yt--;
(0613) col = Ox + xt; //第一象限
(0614) row=Oy-yt;
(0615) point();
(0616) col = Ox - xt; //第二象限
(0617) point();
(0618) row = Oy + yt; //第三象限
(0619) point();
(0620) col = Ox + xt; //第四象限
(0621) point();
(0622)
(0623) // ***************45度镜象画另一半************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -