⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_240128.lst

📁 基于AVR和51的240*128液晶显示模块驱动程序。很有用的喔~
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0280)     {
    0170 850B      LDD	R16,Y+11
    0171 DFB4      RCALL	_Lcd_Point
    0172 842D      LDD	R2,Y+13
(0281)         if (x1 > x2) e=-1;
(0282)         else e=1;
    0173 2433      CLR	R3
    0174 0C2C      ADD	R2,R12
    0175 1C3D      ADC	R3,R13
    0176 862D      STD	Y+13,R2
    0177 840D      LDD	R0,Y+13
    0178 8909      LDD	R16,Y+17
    0179 1600      CP	R0,R16
(0283)         for (;x1 != x2; x1 += e)	Lcd_Point(x1,y1,draw);
    017A F799      BNE	0x016E
    017B 82E8      STD	Y+0,R14
    017C 2D20      MOV	R18,R0
(0284) 		Lcd_Point(x1,y1,draw);
    017D 850B      LDD	R16,Y+11
    017E DFA7      RCALL	_Lcd_Point
    017F C097      RJMP	0x0217
    0180 840D      LDD	R0,Y+13
    0181 8909      LDD	R16,Y+17
    0182 1600      CP	R0,R16
    0183 F4F1      BNE	0x01A2
    0184 840F      LDD	R0,Y+15
    0185 850B      LDD	R16,Y+11
    0186 1600      CP	R0,R16
    0187 F420      BCC	0x018C
    0188 EF8F      LDI	R24,0xFF
    0189 EF9F      LDI	R25,0xFF
    018A 016C      MOVW	R12,R24
    018B C00D      RJMP	0x0199
    018C E081      LDI	R24,1
    018D E090      LDI	R25,0
(0285)         return;
    018E 016C      MOVW	R12,R24
(0286)     }
(0287) 
(0288)     dx=x2-x1;
    018F C009      RJMP	0x0199
    0190 82E8      STD	Y+0,R14
    0191 852D      LDD	R18,Y+13
    0192 850B      LDD	R16,Y+11
    0193 DF92      RCALL	_Lcd_Point
    0194 842B      LDD	R2,Y+11
(0289)     if (dx<0)       //将第2、3象限转为1、4象限
    0195 2433      CLR	R3
    0196 0C2C      ADD	R2,R12
    0197 1C3D      ADC	R3,R13
    0198 862B      STD	Y+11,R2
    0199 840B      LDD	R0,Y+11
(0290)     {
(0291)             t=x1;x1=x2;x2=t;
    019A 850F      LDD	R16,Y+15
    019B 1600      CP	R0,R16
    019C F799      BNE	0x0190
    019D 82E8      STD	Y+0,R14
(0292)             t=y1;y1=y2;y2=t;
    019E 852D      LDD	R18,Y+13
    019F 2D00      MOV	R16,R0
    01A0 DF85      RCALL	_Lcd_Point
    01A1 C075      RJMP	0x0217
(0293)             dx=-dx;
    01A2 842B      LDD	R2,Y+11
    01A3 2433      CLR	R3
    01A4 84AF      LDD	R10,Y+15
    01A5 24BB      CLR	R11
    01A6 18A2      SUB	R10,R2
(0294)     }
(0295) 
(0296)     dy=y2-y1;       
    01A7 08B3      SBC	R11,R3
    01A8 01C5      MOVW	R24,R10
    01A9 3080      CPI	R24,0
    01AA E0E0      LDI	R30,0
    01AB 079E      CPC	R25,R30
    01AC F47C      BGE	0x01BC
(0297)     if (dy>0)       //第4象限,步进为1
    01AD 2D42      MOV	R20,R2
    01AE 2755      CLR	R21
    01AF 840F      LDD	R0,Y+15
    01B0 860B      STD	Y+11,R0
(0298)     {
(0299)         t=1;
    01B1 874F      STD	Y+15,R20
    01B2 854D      LDD	R20,Y+13
(0300)     }
    01B3 2755      CLR	R21
(0301)     else            //第1象限,步进为-1
(0302)     {
(0303)         t=-1;
    01B4 8809      LDD	R0,Y+17
    01B5 860D      STD	Y+13,R0
(0304)         dy=-dy;
    01B6 8B49      STD	Y+17,R20
    01B7 9580      COM	R24
    01B8 9590      COM	R25
    01B9 5F8F      SUBI	R24,0xFF
(0305)     }
(0306) 
(0307)     Lcd_Point(x1,y1,draw);
    01BA 4F9F      SBCI	R25,0xFF
    01BB 015C      MOVW	R10,R24
    01BC 842D      LDD	R2,Y+13
    01BD 2433      CLR	R3
    01BE 8969      LDD	R22,Y+17
    01BF 2777      CLR	R23
    01C0 1962      SUB	R22,R2
    01C1 0973      SBC	R23,R3
(0308)     if (dx>=dy)     //斜率<1,x步进1,y由差值决定是否加t
    01C2 2422      CLR	R2
    01C3 1626      CP	R2,R22
    01C4 0637      CPC	R3,R23
(0309)     {
(0310)         e=dy-(dx>>1);
    01C5 F41C      BGE	0x01C9
    01C6 E041      LDI	R20,1
    01C7 E050      LDI	R21,0
    01C8 C006      RJMP	0x01CF
    01C9 EF4F      LDI	R20,0xFF
    01CA EF5F      LDI	R21,0xFF
    01CB 9560      COM	R22
(0311)         while (x1 != x2)
(0312)         {
(0313)             if (e>0)
    01CC 9570      COM	R23
    01CD 5F6F      SUBI	R22,0xFF
    01CE 4F7F      SBCI	R23,0xFF
    01CF 82E8      STD	Y+0,R14
    01D0 852D      LDD	R18,Y+13
(0314)             {
(0315)                 y1+=t;
    01D1 850B      LDD	R16,Y+11
    01D2 DF53      RCALL	_Lcd_Point
    01D3 16A6      CP	R10,R22
    01D4 06B7      CPC	R11,R23
    01D5 F10C      BLT	0x01F7
(0316)                 e-=dx;
    01D6 0115      MOVW	R2,R10
    01D7 9435      ASR	R3
(0317)             }
(0318)             x1++;
    01D8 9427      ROR	R2
(0319)             e+=dy;
    01D9 016B      MOVW	R12,R22
    01DA 18C2      SUB	R12,R2
(0320)             Lcd_Point(x1,y1,draw);
    01DB 08D3      SBC	R13,R3
    01DC C015      RJMP	0x01F2
    01DD 2422      CLR	R2
    01DE 2433      CLR	R3
    01DF 142C      CP	R2,R12
    01E0 043D      CPC	R3,R13
    01E1 F43C      BGE	0x01E9
    01E2 842D      LDD	R2,Y+13
    01E3 2433      CLR	R3
    01E4 0E24      ADD	R2,R20
    01E5 1E35      ADC	R3,R21
(0321)         }    
(0322)     }
    01E6 862D      STD	Y+13,R2
(0323)     else            //斜率>1,y步进t,x由差值决定是否加1
(0324)     {
(0325)         e=dx-(dy>>1);
    01E7 18CA      SUB	R12,R10
    01E8 08DB      SBC	R13,R11
    01E9 840B      LDD	R0,Y+11
    01EA 9403      INC	R0
    01EB 860B      STD	Y+11,R0
    01EC 0EC6      ADD	R12,R22
    01ED 1ED7      ADC	R13,R23
(0326)         while (y1 != y2)
(0327)         {
(0328)             if (e>0)
    01EE 82E8      STD	Y+0,R14
    01EF 852D      LDD	R18,Y+13
    01F0 2D00      MOV	R16,R0
    01F1 DF34      RCALL	_Lcd_Point
    01F2 840B      LDD	R0,Y+11
(0329)             {
(0330)                 x1++;
    01F3 850F      LDD	R16,Y+15
(0331)                 e-=dy;
    01F4 1600      CP	R0,R16
    01F5 F739      BNE	0x01DD
(0332)             }
(0333)             y1+=t;
    01F6 C020      RJMP	0x0217
    01F7 011B      MOVW	R2,R22
    01F8 9435      ASR	R3
    01F9 9427      ROR	R2
(0334)             e+=dx;
    01FA 0165      MOVW	R12,R10
    01FB 18C2      SUB	R12,R2
(0335)             Lcd_Point(x1,y1,draw);
    01FC 08D3      SBC	R13,R3
    01FD C015      RJMP	0x0213
    01FE 2422      CLR	R2
    01FF 2433      CLR	R3
    0200 142C      CP	R2,R12
    0201 043D      CPC	R3,R13
    0202 F42C      BGE	0x0208
    0203 840B      LDD	R0,Y+11
    0204 9403      INC	R0
    0205 860B      STD	Y+11,R0
    0206 1AC6      SUB	R12,R22
(0336)         }    
(0337)     }
    0207 0AD7      SBC	R13,R23
    0208 842D      LDD	R2,Y+13
    0209 2433      CLR	R3
    020A 0E24      ADD	R2,R20
    020B 1E35      ADC	R3,R21
    020C 862D      STD	Y+13,R2
    020D 0CCA      ADD	R12,R10
    020E 1CDB      ADC	R13,R11
    020F 82E8      STD	Y+0,R14
    0210 2D22      MOV	R18,R2
    0211 850B      LDD	R16,Y+11
(0338) }
(0339) 
(0340) 
(0341) /***********************************************************************
(0342) 以x,y为圆心,以radius为半径画贺
(0343) (show=1画点,show=0清点)
(0344) ***********************************************************************/
(0345) void Lcd_Circle(unsigned char x, unsigned char y, unsigned char r, unsigned char draw)
(0346) {
(0347) 	int xc = 0;
    0212 DF13      RCALL	_Lcd_Point
    0213 840D      LDD	R0,Y+13
(0348) 	int yc ;
(0349) 	int p ;
(0350) 	yc=r;
    0214 8909      LDD	R16,Y+17
    0215 1600      CP	R0,R16
(0351) 	p = 3 - (r<<1);
    0216 F739      BNE	0x01FE
    0217 9621      ADIW	R28,1
    0218 940E03E0  CALL	pop_gset5
    021A 9624      ADIW	R28,4
    021B 9508      RET
_Lcd_Circle:
  p                    --> R20
  yc                   --> R22
  xc                   --> R10
  draw                 --> R12
  r                    --> Y+15
  y                    --> R14
  x                    --> Y+11
    021C 940E03D5  CALL	push_arg4
    021E 940E03E3  CALL	push_gset5
(0352) 	while (xc <= yc)  
(0353) 	{
(0354) 		Lcd_Point(x + xc, y + yc, draw);
    0220 2EE2      MOV	R14,R18
    0221 9721      SBIW	R28,1
    0222 88C9      LDD	R12,Y+17
    0223 24AA      CLR	R10
    0224 24BB      CLR	R11
    0225 856F      LDD	R22,Y+15
    0226 2777      CLR	R23
    0227 2E26      MOV	R2,R22
    0228 2433      CLR	R3
(0355) 		Lcd_Point(x + xc, y - yc, draw);
    0229 0C22      LSL	R2
    022A 1C33      ROL	R3
    022B E043      LDI	R20,3
    022C E050      LDI	R21,0
    022D 1942      SUB	R20,R2
    022E 0953      SBC	R21,R3
    022F C072      RJMP	0x02A2
    0230 82C8      STD	Y+0,R12
    0231 2D2E      MOV	R18,R14
    0232 2733      CLR	R19
(0356) 		Lcd_Point(x - xc, y + yc, draw);
    0233 0F26      ADD	R18,R22
    0234 1F37      ADC	R19,R23
    0235 850B      LDD	R16,Y+11
    0236 2711      CLR	R17
    0237 0D0A      ADD	R16,R10
    0238 1D1B      ADC	R17,R11
    0239 DEEC      RCALL	_Lcd_Point
    023A 82C8      STD	Y+0,R12
    023B 2D2E      MOV	R18,R14
    023C 2733      CLR	R19
(0357) 		Lcd_Point(x - xc, y - yc, draw);
    023D 1B26      SUB	R18,R22
    023E 0B37      SBC	R19,R23
    023F 850B      LDD	R16,Y+11
    0240 2711      CLR	R17
    0241 0D0A      ADD	R16,R10
    0242 1D1B      ADC	R17,R11
    0243 DEE2      RCALL	_Lcd_Point
    0244 82C8      STD	Y+0,R12
    0245 2D2E      MOV	R18,R14
    0246 2733      CLR	R19
(0358) 		Lcd_Point(x + yc, y + xc, draw);
    0247 0F26      ADD	R18,R22
    0248 1F37      ADC	R19,R23
    0249 850B      LDD	R16,Y+11
    024A 2711      CLR	R17
    024B 190A      SUB	R16,R10
    024C 091B      SBC	R17,R11
    024D DED8      RCALL	_Lcd_Point
    024E 82C8      STD	Y+0,R12
    024F 2D2E      MOV	R18,R14
    0250 2733      CLR	R19
(0359) 		Lcd_Point(x + yc, y - xc, draw);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -