📄 lcdsd1335.lst
字号:
194E 5F4F SUBI R20,0xFF
194F 4F5F SBCI R21,0xFF
1950 01C1 MOVW R24,R2
1951 0F88 LSL R24
1952 1F99 ROL R25
1953 0F88 LSL R24
1954 1F99 ROL R25
1955 9606 ADIW R24,6
1956 0EC8 ADD R12,R24
1957 1ED9 ADC R13,R25
1958 C010 RJMP 0x1969
(0337) else
(0338) p += ((xc++ - yc--)<<2) + 10;
1959 011A MOVW R2,R20
195A 5F4F SUBI R20,0xFF
195B 4F5F SBCI R21,0xFF
195C 017B MOVW R14,R22
195D 5061 SUBI R22,1
195E 4070 SBCI R23,0
195F 01C1 MOVW R24,R2
1960 198E SUB R24,R14
1961 099F SBC R25,R15
1962 0F88 LSL R24
1963 1F99 ROL R25
1964 0F88 LSL R24
1965 1F99 ROL R25
1966 960A ADIW R24,0xA
1967 0EC8 ADD R12,R24
1968 1ED9 ADC R13,R25
1969 1764 CP R22,R20
196A 0775 CPC R23,R21
196B F00C BLT 0x196D
196C CF8B RJMP 0x18F8
196D 9621 ADIW R28,1
196E 940E 1ACE CALL pop_xgsetF0FC
1970 9624 ADIW R28,4
1971 9508 RET
_lcd_line:
stepy --> R12
stepx --> R14
dx --> R22
dy --> R20
fraction --> R10
show --> Y,+19
y2 --> Y,+17
x2 --> Y,+15
y1 --> Y,+13
x1 --> Y,+11
1972 940E 1A64 CALL push_arg4
1974 940E 1AD9 CALL push_xgsetF0FC
1976 9721 SBIW R28,1
(0339) }
(0340) }
(0341)
(0342)
(0343) /***********************************************************************
(0344) Draws a line from x1,y1 go x2,y2. Line can be drawn in any direction.
(0345) Set show to 1 to draw pixel, set to 0 to hide pixel.
(0346) ***********************************************************************/
(0347) void lcd_line(int x1, int y1, int x2, int y2, unsigned char show)
(0348) {
(0349) int dy = y2 - y1;
1977 8949 LDD R20,Y+17
1978 895A LDD R21,Y+18
1979 840D LDD R0,Y+13
197A 841E LDD R1,Y+14
197B 1940 SUB R20,R0
197C 0951 SBC R21,R1
(0350) int dx = x2 - x1;
197D 856F LDD R22,Y+15
197E 8978 LDD R23,Y+16
197F 840B LDD R0,Y+11
1980 841C LDD R1,Y+12
1981 1960 SUB R22,R0
1982 0971 SBC R23,R1
(0351) int stepx, stepy, fraction;
(0352) if (dy < 0)
1983 3040 CPI R20,0
1984 E0E0 LDI R30,0
1985 075E CPC R21,R30
1986 F444 BGE 0x198F
(0353) {
(0354) dy = -dy;
1987 9540 COM R20
1988 9550 COM R21
1989 5F4F SUBI R20,0xFF
198A 4F5F SBCI R21,0xFF
(0355) stepy = -1;
198B EF8F LDI R24,0xFF
198C EF9F LDI R25,0xFF
198D 016C MOVW R12,R24
(0356) }
198E C003 RJMP 0x1992
(0357) else
(0358) {
(0359) stepy = 1;
198F E081 LDI R24,1
1990 E090 LDI R25,0
1991 016C MOVW R12,R24
(0360) }
(0361) if (dx < 0)
1992 3060 CPI R22,0
1993 E0E0 LDI R30,0
1994 077E CPC R23,R30
1995 F444 BGE 0x199E
(0362) {
(0363) dx = -dx;
1996 9560 COM R22
1997 9570 COM R23
1998 5F6F SUBI R22,0xFF
1999 4F7F SBCI R23,0xFF
(0364) stepx = -1;
199A EF8F LDI R24,0xFF
199B EF9F LDI R25,0xFF
199C 017C MOVW R14,R24
(0365) }
199D C003 RJMP 0x19A1
(0366) else
(0367) {
(0368) stepx = 1;
199E E081 LDI R24,1
199F E090 LDI R25,0
19A0 017C MOVW R14,R24
(0369) }
(0370) dy <<= 1;
19A1 0F44 LSL R20
19A2 1F55 ROL R21
(0371) dx <<= 1;
19A3 0F66 LSL R22
19A4 1F77 ROL R23
(0372) lcd_pixel(x1,y1,show);
19A5 880B LDD R0,Y+19
19A6 8208 STD Y+0,R0
19A7 852D LDD R18,Y+13
19A8 853E LDD R19,Y+14
19A9 850B LDD R16,Y+11
19AA 851C LDD R17,Y+12
19AB DD8D RCALL _lcd_pixel
(0373) if (dx > dy)
19AC 1746 CP R20,R22
19AD 0757 CPC R21,R23
19AE F55C BGE 0x19DA
(0374) {
(0375) fraction = dy - (dx >> 1);
19AF 011B MOVW R2,R22
19B0 9435 ASR R3
19B1 9427 ROR R2
19B2 015A MOVW R10,R20
19B3 18A2 SUB R10,R2
19B4 08B3 SBC R11,R3
19B5 C01C RJMP 0x19D2
(0376) while (x1 != x2)
(0377) {
(0378) if (fraction >= 0)
19B6 01C5 MOVW R24,R10
19B7 3080 CPI R24,0
19B8 E0E0 LDI R30,0
19B9 079E CPC R25,R30
19BA F044 BLT 0x19C3
(0379) {
(0380) y1 += stepy;
19BB 840D LDD R0,Y+13
19BC 841E LDD R1,Y+14
19BD 0C0C ADD R0,R12
19BE 1C1D ADC R1,R13
19BF 861E STD Y+14,R1
19C0 860D STD Y+13,R0
(0381) fraction -= dx;
19C1 1AA6 SUB R10,R22
19C2 0AB7 SBC R11,R23
(0382) }
(0383) x1 += stepx;
19C3 840B LDD R0,Y+11
19C4 841C LDD R1,Y+12
19C5 0C0E ADD R0,R14
19C6 1C1F ADC R1,R15
19C7 861C STD Y+12,R1
19C8 860B STD Y+11,R0
(0384) fraction += dy;
19C9 0EA4 ADD R10,R20
19CA 1EB5 ADC R11,R21
(0385) lcd_pixel(x1,y1,show);
19CB 880B LDD R0,Y+19
19CC 8208 STD Y+0,R0
19CD 852D LDD R18,Y+13
19CE 853E LDD R19,Y+14
19CF 850B LDD R16,Y+11
19D0 851C LDD R17,Y+12
19D1 DD67 RCALL _lcd_pixel
19D2 840B LDD R0,Y+11
19D3 841C LDD R1,Y+12
19D4 850F LDD R16,Y+15
19D5 8918 LDD R17,Y+16
19D6 1600 CP R0,R16
19D7 0611 CPC R1,R17
19D8 F6E9 BNE 0x19B6
(0386) }
(0387) }
19D9 C02A RJMP 0x1A04
(0388) else
(0389) {
(0390) fraction = dx - (dy >> 1);
19DA 011A MOVW R2,R20
19DB 9435 ASR R3
19DC 9427 ROR R2
19DD 015B MOVW R10,R22
19DE 18A2 SUB R10,R2
19DF 08B3 SBC R11,R3
19E0 C01C RJMP 0x19FD
(0391) while (y1 != y2)
(0392) {
(0393) if (fraction >= 0)
19E1 01C5 MOVW R24,R10
19E2 3080 CPI R24,0
19E3 E0E0 LDI R30,0
19E4 079E CPC R25,R30
19E5 F044 BLT 0x19EE
(0394) {
(0395) x1 += stepx;
19E6 840B LDD R0,Y+11
19E7 841C LDD R1,Y+12
19E8 0C0E ADD R0,R14
19E9 1C1F ADC R1,R15
19EA 861C STD Y+12,R1
19EB 860B STD Y+11,R0
(0396) fraction -= dy;
19EC 1AA4 SUB R10,R20
19ED 0AB5 SBC R11,R21
(0397) }
(0398) y1 += stepy;
19EE 840D LDD R0,Y+13
19EF 841E LDD R1,Y+14
19F0 0C0C ADD R0,R12
19F1 1C1D ADC R1,R13
19F2 861E STD Y+14,R1
19F3 860D STD Y+13,R0
(0399) fraction += dx;
19F4 0EA6 ADD R10,R22
19F5 1EB7 ADC R11,R23
(0400) lcd_pixel(x1,y1,show);
19F6 880B LDD R0,Y+19
19F7 8208 STD Y+0,R0
19F8 852D LDD R18,Y+13
19F9 853E LDD R19,Y+14
19FA 850B LDD R16,Y+11
19FB 851C LDD R17,Y+12
19FC DD3C RCALL _lcd_pixel
19FD 840D LDD R0,Y+13
19FE 841E LDD R1,Y+14
19FF 8909 LDD R16,Y+17
1A00 891A LDD R17,Y+18
1A01 1600 CP R0,R16
1A02 0611 CPC R1,R17
1A03 F6E9 BNE 0x19E1
(0401) }
(0402) }
1A04 9621 ADIW R28,1
1A05 940E 1ACE CALL pop_xgsetF0FC
1A07 9624 ADIW R28,4
1A08 9508 RET
_lcd_chinesechar:
Address --> R20
high --> R20
low --> R22
k --> R10
i --> R12
lcd_fanxian --> Y,+16
length --> R14
width --> Y,+12
code1 --> Y,+10
y --> R20
x --> R22
1A09 940E 1AD9 CALL push_xgsetF0FC
1A0B 01A9 MOVW R20,R18
1A0C 01B8 MOVW R22,R16
1A0D 84EE LDD R14,Y+14
(0403) }
(0404)
(0405) /***********************************************************************
(0406) Happy end :-)
(0407) ***********************************************************************/
(0408)
(0409)
(0410) /*
(0411) *******************************************************************************
(0412) *
(0413) *函数名称:void lcd_chinesechar(int x, int y,unsigned char *code1 ,
(0414) unsigned char width,unsigned char length,unsigned char lcd_fanxian)
(0415) *
(0416) *功能: 在指定位置显示一个width*length的汉字
(0417) *
(0418) *变量说明:
(0419) *
(0420) *
(0421) *
(0422) *
(0423) *
(0424) *
(0425) *作者:段胜柱
(0426) *
(0427) *时间:
(0428) ***************************************************************************
(0429) */
(0430)
(0431)
(0432)
(0433)
(0434)
(0435) void lcd_chinesechar(int x, int y,unsigned char const *code1 ,
(0436) unsigned char width,unsigned char length,unsigned char lcd_fanxian)
(0437) {
(0438) unsigned char i,k;
(0439) int Address;
(0440)
(0441) unsigned char low,high;
(0442) x--;
1A0E 5061 SUBI R22,1
1A0F 4070 SBCI R23,0
(0443) y--;
1A10 5041 SUBI R20,1
1A11 4050 SBCI R21,0
(0444) Address = (y * (LCD_X_SIZE/8)) + (x / 8);
1A12 E028 LDI R18,0x8
1A13 E030 LDI R19,0
1A14 018B MOVW R16,R22
1A15 940E 1A74 CALL div16s
1A17 0118 MOVW R2,R16
1A18 E208 LDI R16,0x28
1A19 E010 LDI R17,0
1A1A 019A MOVW R18,R20
1A1B 940E 1ABE CALL empy16s
1A1D 01A8 MOVW R20,R16
1A1E 0D42 ADD R20,R2
1A1F 1D53 ADC R21,R3
(0445) low = (unsigned char) (Address & 0x00ff);
1A20 2F64 MOV R22,R20
1A21 7070 ANDI R23,0
(0446) high = (unsigned char) (((Address & 0xff00) >> 8));
1A22 7040 ANDI R20,0
1A23 2F45 MOV R20,R21
1A24 2755 CLR R21
(0447) lcd_write_command(0x4f);
1A25 E40F LDI R16,0x4F
1A26 DC27 RCALL _lcd_write_command
(0448)
(0449) for(k=0;k<width;k++)
1A27 24AA CLR R10
1A28 C035 RJMP 0x1A5E
(0450) {
(0451)
(0452) lcd_write_command(0x46);
1A29 E406 LDI R16,0x46
1A2A DC23 RCALL _lcd_write_command
(0453) lcd_write_data(low + k*length);
1A2B 9CAE MUL R10,R14
1A2C 2F06 MOV R16,R22
1A2D 0D00 ADD R16,R0
1A2E DC24 RCALL _lcd_write_data
(0454) lcd_write_data(high);
1A2F 2F04 MOV R16,R20
1A30 DC22 RCALL _lcd_write_data
(0455) lcd_write_command(0x42);
1A31 E402 LDI R16,0x42
1A32 DC1B RCALL _lcd_write_command
(0456)
(0457) for(i=0;i<length;i++)
1A33 24CC CLR R12
1A34 C026 RJMP 0x1A5B
(0458) {
(0459) if(lcd_fanxian == 1)
1A35 8988 LDD R24,Y+16
1A36 3081 CPI R24,1
1A37 F491 BNE 0x1A4A
(0460) {
(0461) lcd_write_data(~code1[i * width + k]);lcd_delay(20000);
1A38 840C LDD R0,Y+12
1A39 9CC0 MUL R12,R0
1A3A 01F0 MOVW R30,R0
1A3B 2C2A MOV R2,R10
1A3C 2433 CLR R3
1A3D 0DE2 ADD R30,R2
1A3E 1DF3 ADC R31,R3
1A3F 840A LDD R0,Y+10
1A40 841B LDD R1,Y+11
1A41 0DE0 ADD R30,R0
1A42 1DF1 ADC R31,R1
1A43 9106 ELPM R16,11(Z)
1A44 9500 COM R16
1A45 DC0D RCALL _lcd_write_data
1A46 E200 LDI R16,0x20
1A47 E41E LDI R17,0x4E
1A48 DBF0 RCALL _lcd_delay
(0462) }
1A49 C010
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -