📄 mega32-lcm.lst
字号:
06CC 9D8A MUL R24,R10
06CD 0110 MOVW R2,R0
06CE E584 LDI R24,0x54
06CF E092 LDI R25,2
06D0 0E28 ADD R2,R24
06D1 1E39 ADC R3,R25
06D2 2FE4 MOV R30,R20
06D3 27FF CLR R31
06D4 0DE2 ADD R30,R2
06D5 1DF3 ADC R31,R3
06D6 9164 LPM R22,0(Z)
(0492) ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j];
06D7 E18A LDI R24,0x1A
06D8 9D8A MUL R24,R10
06D9 0110 MOVW R2,R0
06DA E584 LDI R24,0x54
06DB E092 LDI R25,2
06DC 0E28 ADD R2,R24
06DD 1E39 ADC R3,R25
06DE 2FE4 MOV R30,R20
06DF 27FF CLR R31
06E0 963C ADIW R30,0xC
06E1 0DE2 ADD R30,R2
06E2 1DF3 ADC R31,R3
06E3 90E4 LPM R14,0(Z)
(0493) ch_r=ch_r>>4;
06E4 2F86 MOV R24,R22
06E5 9582 SWAP R24
06E6 708F ANDI R24,0xF
06E7 2F68 MOV R22,R24
(0494) ch_w=ch_w<<4;
06E8 2D8E MOV R24,R14
06E9 708F ANDI R24,0xF
06EA 9582 SWAP R24
06EB 2EE8 MOV R14,R24
(0495) ch_w|=ch_r;
06EC 2AE6 OR R14,R22
(0496) SetPageCol(uPage+1,uCol+j);
06ED 2D2C MOV R18,R12
06EE 0F24 ADD R18,R20
06EF 8109 LDD R16,Y+1
06F0 5F0F SUBI R16,0xFF
06F1 DD9F RCALL _SetPageCol
(0497) if(uCol+j<64) write_LCD(LEFT,DATA,ch_w);
06F2 2D8C MOV R24,R12
06F3 0F84 ADD R24,R20
06F4 3480 CPI R24,0x40
06F5 F428 BCC 0x06FB
06F6 82E8 STD Y+0,R14
06F7 E021 LDI R18,1
06F8 2700 CLR R16
06F9 DC27 RCALL _write_LCD
06FA C004 RJMP 0x06FF
(0498) else write_LCD(RIGHT,DATA,ch_w);
06FB 82E8 STD Y+0,R14
06FC E021 LDI R18,1
06FD E001 LDI R16,1
06FE DC22 RCALL _write_LCD
06FF 9543 INC R20
0700 304C CPI R20,0xC
0701 F408 BCC 0x0703
0702 CFC3 RJMP 0x06C6
(0499) }
(0500) SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
0703 2D2C MOV R18,R12
0704 5F24 SUBI R18,0xF4
0705 8109 LDD R16,Y+1
0706 DD8A RCALL _SetPageCol
(0501) }
(0502) }
0707 9622 ADIW R28,2
0708 940E09C1 CALL pop_gset5
070A 9508 RET
_disp_str:
i --> R20
p --> R22
070B 940E09DB CALL push_gset2
070D 01B8 MOVW R22,R16
(0503)
(0504) void disp_str(unsigned char *p)
(0505) {
(0506) unsigned char i=0;
070E 2744 CLR R20
070F C015 RJMP 0x0725
(0507) while(p[i]>0)
(0508) {
(0509) if(p[i] < 128)
0710 2FE4 MOV R30,R20
0711 27FF CLR R31
0712 0FE6 ADD R30,R22
0713 1FF7 ADC R31,R23
0714 8180 LDD R24,Z+0
0715 3880 CPI R24,0x80
0716 F438 BCC 0x071E
(0510) { /* ASCII */
(0511) disp_ch(p[i]);
0717 2FE4 MOV R30,R20
0718 27FF CLR R31
0719 0FE6 ADD R30,R22
071A 1FF7 ADC R31,R23
071B 8100 LDD R16,Z+0
071C DDC7 RCALL _disp_ch
(0512) }
071D C006 RJMP 0x0724
(0513) else
(0514) { /* 中文 */
(0515) disp_hz(&p[i]);
071E 2F04 MOV R16,R20
071F 2711 CLR R17
0720 0F06 ADD R16,R22
0721 1F17 ADC R17,R23
0722 DED6 RCALL _disp_hz
(0516) i++;
0723 9543 INC R20
(0517) }
(0518) i++;
0724 9543 INC R20
0725 2FE4 MOV R30,R20
0726 27FF CLR R31
0727 0FE6 ADD R30,R22
0728 1FF7 ADC R31,R23
0729 8020 LDD R2,Z+0
072A 2433 CLR R3
072B 1432 CP R3,R2
072C F318 BCS 0x0710
(0519) }
(0520) }
072D 940E09BB CALL pop_gset2
072F 9508 RET
_pixel:
ch --> R22
y --> R20
flag --> R10
yy --> R14
xx --> R12
0730 940E09E7 CALL push_gset5
0732 2EE2 MOV R14,R18
0733 2EC0 MOV R12,R16
0734 9721 SBIW R28,1
0735 84AB LDD R10,Y+11
(0521)
(0522) /*************************************/
(0523) /* 绘点函数 */
(0524) /*************************************/
(0525) /* XX--(0-128) YY--(0-63) FLAG=1绘点 FLAG=0 清点 */
(0526) void pixel(unsigned char xx,unsigned char yy,unsigned char flag)
(0527) {
(0528) unsigned int y,ch;
(0529) ch=yy%8; //余数
0736 E028 LDI R18,0x8
0737 E030 LDI R19,0
0738 2D0E MOV R16,R14
0739 2711 CLR R17
073A 940E0971 CALL mod16s
073C 01B8 MOVW R22,R16
(0530)
(0531) y=1;
073D E041 LDI R20,1
073E E050 LDI R21,0
(0532) for(;ch!=0;)
073F C008 RJMP 0x0748
(0533) {
(0534) y=y*2;
0740 E002 LDI R16,2
0741 E010 LDI R17,0
0742 019A MOVW R18,R20
0743 940E09AB CALL empy16s
0745 01A8 MOVW R20,R16
(0535) ch--;
0746 5061 SUBI R22,1
0747 4070 SBCI R23,0
0748 3060 CPI R22,0
0749 0767 CPC R22,R23
074A F7A9 BNE 0x0740
(0536) }
(0537) if(xx<64)
074B 2D8C MOV R24,R12
074C 3480 CPI R24,0x40
074D F518 BCC 0x0771
(0538) {
(0539) set_page_L(yy/8);
074E 2D0E MOV R16,R14
074F 9506 LSR R16
0750 9506 LSR R16
0751 9506 LSR R16
0752 DCCC RCALL _set_page_L
(0540) set_col_addr_L(xx);
0753 2D0C MOV R16,R12
0754 DCE6 RCALL _set_col_addr_L
(0541) ch=read_LCD(LEFT);
0755 2700 CLR R16
0756 DC1B RCALL _read_LCD
0757 2F60 MOV R22,R16
0758 2777 CLR R23
(0542) set_col_addr_L(xx);
0759 2D0C MOV R16,R12
075A DCE0 RCALL _set_col_addr_L
(0543) if(flag)
075B 20AA TST R10
075C F041 BEQ 0x0765
(0544) write_LCD(LEFT,DATA,ch|y);
075D 011B MOVW R2,R22
075E 2A24 OR R2,R20
075F 2A35 OR R3,R21
0760 8228 STD Y+0,R2
0761 E021 LDI R18,1
0762 2700 CLR R16
0763 DBBD RCALL _write_LCD
0764 C030 RJMP 0x0795
(0545) else
(0546) {
(0547) y=~y;
0765 9540 COM R20
0766 9550 COM R21
(0548) ch&=y;
0767 2364 AND R22,R20
0768 2375 AND R23,R21
(0549) write_LCD(LEFT,DATA,ch|y);
0769 011B MOVW R2,R22
076A 2A24 OR R2,R20
076B 2A35 OR R3,R21
076C 8228 STD Y+0,R2
076D E021 LDI R18,1
076E 2700 CLR R16
076F DBB1 RCALL _write_LCD
(0550) }
(0551) }
0770 C024 RJMP 0x0795
(0552) else
(0553) {
(0554) set_page_R(yy/8);
0771 2D0E MOV R16,R14
0772 9506 LSR R16
0773 9506 LSR R16
0774 9506 LSR R16
0775 DCB7 RCALL _set_page_R
(0555) set_col_addr_R(xx-64);
0776 2D0C MOV R16,R12
0777 5400 SUBI R16,0x40
0778 DCD0 RCALL _set_col_addr_R
(0556) ch=read_LCD(RIGHT);
0779 E001 LDI R16,1
077A DBF7 RCALL _read_LCD
077B 2F60 MOV R22,R16
077C 2777 CLR R23
(0557) set_col_addr_R(xx-64);
077D 2D0C MOV R16,R12
077E 5400 SUBI R16,0x40
077F DCC9 RCALL _set_col_addr_R
(0558) if(flag)
0780 20AA TST R10
0781 F041 BEQ 0x078A
(0559) write_LCD(RIGHT,DATA,ch|y);
0782 011B MOVW R2,R22
0783 2A24 OR R2,R20
0784 2A35 OR R3,R21
0785 8228 STD Y+0,R2
0786 E021 LDI R18,1
0787 E001 LDI R16,1
0788 DB98 RCALL _write_LCD
0789 C00B RJMP 0x0795
(0560) else
(0561) {
(0562) y=~y;
078A 9540 COM R20
078B 9550 COM R21
(0563) ch&=y;
078C 2364 AND R22,R20
078D 2375 AND R23,R21
(0564) write_LCD(RIGHT,DATA,ch|y);
078E 011B MOVW R2,R22
078F 2A24 OR R2,R20
0790 2A35 OR R3,R21
0791 8228 STD Y+0,R2
0792 E021 LDI R18,1
0793 E001 LDI R16,1
0794 DB8C RCALL _write_LCD
(0565) }
(0566) }
(0567) }
0795 9621 ADIW R28,1
0796 940E09C1 CALL pop_gset5
0798 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
0799 940E09E7 CALL push_gset5
079B 2EC2 MOV R12,R18
079C 2F40 MOV R20,R16
079D 972B SBIW R28,0xB
(0568) /*void point(void)
(0569) {
(0570) uchar x1, y1, y;
(0571)
(0572) x1 = CurCol;
(0573) y1 = CurRow;
(0574) CurRow = y1 >> 3; //取Y方向分页地址
(0575) Rddata(); // get cbyte on screen
(0576) y = y1 & 0x07; //字节内位置计算
(0577) Wrdata(cbyte | (1 << y)); //画上屏幕 /
(0578) CurCol = x1; ///恢复xy坐标 /
(0579) CurRow = y1;
(0580) } */
(0581)
(0582) /************************************************/
(0583) /*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
(0584) /************************************************/
(0585)
(0586) /*void circle(uchar Ox, uchar Oy, uchar Rx)
(0587) {
(0588) unsigned int xx, rr, xt, yt, rs;
(0589)
(0590) yt = Rx;
(0591) rr = Rx * Rx + 1; //补偿 1 修正方形
(0592) rs = (yt + (yt >> 1)) >> 1; //(*0.75)分开1/8圆弧来画
(0593) for (xt = 0; xt <= rs; xt++)
(0594) {
(0595) xx = xt * xt;
(0596) while ((yt * yt) > (rr - xx))
(0597) yt--;
(0598) col = Ox + xt; //第一象限
(0599) row=Oy-yt;
(0600) point();
(0601) col = Ox - xt; //第二象限
(0602) point();
(0603) row = Oy + yt; //第三象限
(0604) point();
(0605) col = Ox + xt; //第四象限
(0606) point();
(0607)
(0608) // ***************45度镜象画另一半***************
(0609)
(0610) col = Ox + yt; //第一象限
(0611) row = Oy - xt;
(0612) point();
(0613) col = Ox - yt; //第二象限
(0614) point();
(0615) row = Oy + xt; //第三象限
(0616) point();
(0617) col = Ox + yt; //第四象限
(0618) point();
(0619) }
(0620) }
(0621) */
(0622)
(0623) /************************************************/
(0624) /*画线。任意方向的斜线,直线数学方程 aX+bY=1 */
(0625) /************************************************/
(0626)
(0627) /*void Linexy(uchar x0,uchar y0,uchar xt,uchar yt)
(0628) {
(0629) uchar t;
(0630) int xerr = 0, yerr = 0, delta_x, delta_y, distance;
(0631) int incx, incy;
(0632)
(0633) delta_x = xt - x0; // 计算坐标增量
(0634) delta_y = yt - y0;
(0635) col = x0;
(0636) row = y0;
(0637)
(0638) if (delta_x > 0)
(0639) {
(0640) incx = 1; // 水平+方向
(0641) }
(0642) else if (delta_x == 0 )
(0643) {
(0644) incx = 0; // 垂直线
(0645) }
(0646) else
(0647) {
(0648) incx =- 1; //水平负方向
(0649) delta_x =- delta_x;
(0650) }
(0651)
(0652) if (delta_y > 0)
(0653) {
(0654) incy = 1; // 垂直+方向
(0655) }
(0656) else
(0657) if (delta_y == 0)
(0658) {
(0659) incy = 0; // 水平线
(0660) }
(0661) else
(0662) {
(0663) incy =- 1; //垂直-方向
(0664) delta_y =- delta_y;
(0665) }
(0666)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -