📄 电池放电器v2.lst
字号:
(0114) lcd_data[i]=0;
016A E98B LDI R24,0x9B
016B E090 LDI R25,0
016C 2FE4 MOV R30,R20
016D 27FF CLR R31
016E 0FE8 ADD R30,R24
016F 1FF9 ADC R31,R25
0170 2422 CLR R2
0171 8220 STD Z+0,R2
0172 9543 INC R20
0173 3240 CPI R20,0x20
0174 F3A8 BCS 0x016A
(0115) }
(0116) delay_nus(500);
0175 EF04 LDI R16,0xF4
0176 E011 LDI R17,1
0177 D338 RCALL _delay_nus
0178 DDC7 RCALL pop_gset1
0179 9508 RET
_LCD_write_string:
e --> R20
s --> R22
y --> R18
x --> R16
017A DDC0 RCALL push_gset2
017B 816C LDD R22,Y+4
017C 817D LDD R23,Y+5
017D 814E LDD R20,Y+6
(0117) }
(0118) /*-----------------------------------------------------------------------
(0119) LCD_check : 统计发送数据到LCD次数的函数
(0120)
(0121) 输入参数 :x,y 显示结果的座标
(0122) 编写日期 :2005/10/18
(0123) 说明 :如果每秒调用一次,就是统计每秒的次数
(0124) -----------------------------------------------------------------------
(0125) void LCD_check(unsigned char x,unsigned char y) //检测每秒钟写LCD
(0126) //次数的函数
(0127) {
(0128) unsigned char i;
(0129) unsigned char lcd[2]={0};
(0130) add=y*16+x;//设置起始座标
(0131) lcd[0]=num/10+48;
(0132) lcd[1]=num%10+48;
(0133) num=0;
(0134) for (i=0;i<2;i++)
(0135) {
(0136) if(lcd_data[add]==lcd[i]){}
(0137) else
(0138) {data[add]=lcd[i];}
(0139) add++;
(0140) }
(0141) LCD_updata;
(0142) }*/
(0143) /*-----------------------------------------------------------------------
(0144) LCD_write_string : 英文字符串显示函数
(0145)
(0146) 输入参数:*s :英文字符串指针;
(0147) X、Y : 显示字符串的位置
(0148) e : 把从最后一个字符到x=e之间的内容删除
(0149) 编写日期 :2005/10/18
(0150) -----------------------------------------------------------------------*/
(0151) void LCD_write_string(unsigned char x,unsigned char y, const unsigned char *s,unsigned char e)
(0152) {
(0153) if(y<2)
017E 3022 CPI R18,2
017F F550 BCC 0x01AA
(0154) add=y*16+x;//设置起始座标
0180 E180 LDI R24,0x10
0181 9F82 MUL R24,R18
0182 2C20 MOV R2,R0
0183 0E20 ADD R2,R16
0184 9220007A STS add,R2
0186 C023 RJMP 0x01AA
(0155) while (*s)
(0156) {
(0157) if(lcd_data[add]==*s)//如果LCD上显示的数和
0187 E98B LDI R24,0x9B
0188 E090 LDI R25,0
0189 91E0007A LDS R30,add
018B 27FF CLR R31
018C 0FE8 ADD R30,R24
018D 1FF9 ADC R31,R25
018E 8020 LDD R2,Z+0
018F 01FB MOVW R30,R22
0190 91E4 LPM R30,0(Z)
0191 162E CP R2,R30
0192 F409 BNE 0x0194
(0158) {} //待写入的数相同的话
0193 C00F RJMP 0x01A3
(0159) else{data[add]=*s;}//要显示的数据存入显存
0194 E78B LDI R24,0x7B
0195 E090 LDI R25,0
0196 91E0007A LDS R30,add
0198 27FF CLR R31
0199 0FE8 ADD R30,R24
019A 1FF9 ADC R31,R25
019B 01DB MOVW R26,R22
019C 93FA ST R31,-Y
019D 93EA ST R30,-Y
019E 01FD MOVW R30,R26
019F 91A4 LPM R26,0(Z)
01A0 91E9 LD R30,Y+
01A1 91F9 LD R31,Y+
01A2 83A0 STD Z+0,R26
(0160) s ++;//指针加1
01A3 5F6F SUBI R22,0xFF
01A4 4F7F SBCI R23,0xFF
(0161) add++;//显存地址加1
01A5 9180007A LDS R24,add
01A7 5F8F SUBI R24,0xFF
01A8 9380007A STS add,R24
01AA 01FB MOVW R30,R22
01AB 91E4 LPM R30,0(Z)
01AC 23EE TST R30
01AD F6C9 BNE 0x0187
(0162) }
(0163) if(y==1)
01AE 3021 CPI R18,1
01AF F481 BNE 0x01C0
(0164) e+=16;
01B0 5F40 SUBI R20,0xF0
(0165) for(;e>=add;add++)
01B1 C00E RJMP 0x01C0
(0166) {data[add]=' ';}
01B2 E78B LDI R24,0x7B
01B3 E090 LDI R25,0
01B4 91E0007A LDS R30,add
01B6 27FF CLR R31
01B7 0FE8 ADD R30,R24
01B8 1FF9 ADC R31,R25
01B9 E280 LDI R24,0x20
01BA 8380 STD Z+0,R24
01BB 9180007A LDS R24,add
01BD 5F8F SUBI R24,0xFF
01BE 9380007A STS add,R24
01C0 9020007A LDS R2,add
01C2 1542 CP R20,R2
01C3 F770 BCC 0x01B2
(0167) LCD_updata;
01C4 2422 CLR R2
01C5 92200060 STS new,R2
01C7 DD65 RCALL pop_gset2
01C8 9508 RET
_LCD_write_number:
c --> R10
b --> R12
lcd --> Y+0
i --> R14
e --> R6
s --> R8
dat --> Y+24
d --> Y+22
y --> Y+20
x --> R14
01C9 933A ST R19,-Y
01CA 932A ST R18,-Y
01CB DD69 RCALL push_gset5
01CC 2EE0 MOV R14,R16
01CD 972A SBIW R28,0xA
01CE 8C8C LDD R8,Y+28
01CF 8C9D LDD R9,Y+29
01D0 8C6E LDD R6,Y+30
(0168) }
(0169) /*-----------------------------------------------------------------------
(0170) LCD_write_number : 数字显示函数
(0171)
(0172) 输入参数:
(0173) X、Y : 显示字符串的位置
(0174) d :在第d位插入小数点
(0175) data :要显示的数据 长整形
(0176) *s :数据的单位
(0177) e : 把从最后一个字符到x=e之间的内容删除
(0178) 编写日期 :2005/10/18
(0179) -----------------------------------------------------------------------*/
(0180) void LCD_write_number(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
(0181) {
(0182) unsigned char i;
(0183) unsigned char b=0;
01D1 24CC CLR R12
(0184) unsigned char c='.';
01D2 E28E LDI R24,0x2E
01D3 2EA8 MOV R10,R24
(0185) unsigned char lcd[10]={0};
01D4 E286 LDI R24,0x26
01D5 E090 LDI R25,0
01D6 01FE MOVW R30,R28
01D7 E00A LDI R16,0xA
01D8 E010 LDI R17,0
01D9 93FA ST R31,-Y
01DA 93EA ST R30,-Y
01DB 939A ST R25,-Y
01DC 938A ST R24,-Y
01DD DDB0 RCALL asgncblk
(0186) if(y<2)//如果Y>1则不重新计算地址
01DE 898C LDD R24,Y+20
01DF 3082 CPI R24,2
01E0 F438 BCC 0x01E8
(0187) add=y*16+x;//设置起始座标
01E1 E180 LDI R24,0x10
01E2 880C LDD R0,Y+20
01E3 9D80 MUL R24,R0
01E4 2C20 MOV R2,R0
01E5 0C2E ADD R2,R14
01E6 9220007A STS add,R2
(0188)
(0189) for (i=10;i>0;i--)
01E8 E08A LDI R24,0xA
01E9 2EE8 MOV R14,R24
01EA C036 RJMP 0x0221
(0190) {
(0191) lcd[i]=dat%10+48;
01EB E04A LDI R20,0xA
01EC E050 LDI R21,0
01ED E060 LDI R22,0
01EE E070 LDI R23,0
01EF 01FE MOVW R30,R28
01F0 8C20 LDD R2,Z+24
01F1 8C31 LDD R3,Z+25
01F2 8C42 LDD R4,Z+26
01F3 8C53 LDD R5,Z+27
01F4 937A ST R23,-Y
01F5 936A ST R22,-Y
01F6 935A ST R21,-Y
01F7 934A ST R20,-Y
01F8 0181 MOVW R16,R2
01F9 0192 MOVW R18,R4
01FA DC9B RCALL mod32u
01FB 0118 MOVW R2,R16
01FC 0129 MOVW R4,R18
01FD E340 LDI R20,0x30
01FE E050 LDI R21,0
01FF E060 LDI R22,0
0200 E070 LDI R23,0
0201 0E24 ADD R2,R20
0202 1E35 ADC R3,R21
0203 1E46 ADC R4,R22
0204 1E57 ADC R5,R23
0205 01CE MOVW R24,R28
0206 2DEE MOV R30,R14
0207 27FF CLR R31
0208 0FE8 ADD R30,R24
0209 1FF9 ADC R31,R25
020A 8220 STD Z+0,R2
(0192) dat=dat/10;
020B E04A LDI R20,0xA
020C E050 LDI R21,0
020D E060 LDI R22,0
020E E070 LDI R23,0
020F 01FE MOVW R30,R28
0210 8C20 LDD R2,Z+24
0211 8C31 LDD R3,Z+25
0212 8C42 LDD R4,Z+26
0213 8C53 LDD R5,Z+27
0214 937A ST R23,-Y
0215 936A ST R22,-Y
0216 935A ST R21,-Y
0217 934A ST R20,-Y
0218 0181 MOVW R16,R2
0219 0192 MOVW R18,R4
021A DC79 RCALL div32u
021B 01FE MOVW R30,R28
021C 8F00 STD Z+24,R16
021D 8F11 STD Z+25,R17
021E 8F22 STD Z+26,R18
021F 8F33 STD Z+27,R19
0220 94EA DEC R14
0221 2422 CLR R2
0222 142E CP R2,R14
0223 F408 BCC 0x0225
0224 CFC6 RJMP 0x01EB
(0193) }
(0194)
(0195) for(i=1;i<11;i++)
0225 24EE CLR R14
0226 94E3 INC R14
0227 C079 RJMP 0x02A1
(0196) {
(0197) if(i==11-d)
0228 E08B LDI R24,0xB
0229 880E LDD R0,Y+22
022A 1980 SUB R24,R0
022B 16E8 CP R14,R24
022C F4C1 BNE 0x0245
(0198) {
(0199) if(lcd_data[add]==c)
022D E98B LDI R24,0x9B
022E E090 LDI R25,0
022F 91E0007A LDS R30,add
0231 27FF CLR R31
0232 0FE8 ADD R30,R24
0233 1FF9 ADC R31,R25
0234 8020 LDD R2,Z+0
0235 142A CP R2,R10
0236 F409 BNE 0x0238
(0200) {}
0237 C008 RJMP 0x0240
(0201) else
(0202) {data[add]=c;}
0238 E78B LDI R24,0x7B
0239 E090 LDI R25,0
023A 91E0007A LDS R30,add
023C 27FF CLR R31
023D 0FE8 ADD R30,R24
023E 1FF9 ADC R31,R25
023F 82A0 STD Z+0,R10
(0203) add++;
0240 9180007A LDS R24,add
0242 5F8F SUBI R24,0xFF
0243 9380007A STS add,R24
(0204) }
(0205) if((lcd[i]-48+b)==0)
0245 01CE MOVW R24,R28
0246 2DEE MOV R30,R14
0247 27FF CLR R31
0248 0FE8 ADD R30,R24
0249 1FF9 ADC R31,R25
024A 8180 LDD R24,Z+0
024B 5380 SUBI R24,0x30
024C 0D8C ADD R24,R12
024D F009 BEQ 0x024F
024E C02B RJMP 0x027A
(0206) {
(0207) if(i>=(10-d))
024F E08A LDI R24,0xA
0250 880E LDD R0,Y+22
0251 1980 SUB R24,R0
0252 16E8 CP R14,R24
0253 F408 BCC 0x0255
0254 C04B RJMP 0x02A0
(0208) {
(0209) if(lcd_data[add]==lcd[i])
0255 01CE MOVW R24,R28
0256 2DEE MOV R30,R14
0257 27FF CLR R31
0258 0FE8 ADD R30,R24
0259 1FF9 ADC R31,R25
025A 8020 LDD R2,Z+0
025B E98B LDI R24,0x9B
025C E090 LDI R25,0
025D 91E0007A LDS R30,add
025F 27FF CLR R31
0260 0FE8 ADD R30,R24
0261 1FF9 ADC R31,R25
0262 8030 LDD R3,Z+0
0263 1432 CP R3,R2
0264 F409 BNE 0x0266
(0210) {}
0265 C00E RJMP 0x0274
(0211) else
(0212) {data[add]=lcd[i];}
0266 01CE MOVW R24,R28
0267 2DEE MOV R30,R14
0268 27FF CLR R31
0269 0FE8 ADD R30,R24
026A 1FF9 ADC R31,R25
026B 8020 LDD R2,Z+0
026C E78B LDI R24,0x7B
026D E090 LDI R25,0
026E 91E0007A LDS R30,add
0270 27FF CLR R31
0271 0FE8 ADD R30,R24
0272 1FF9 ADC R31,R25
0273 8220 STD Z+0,R2
(0213) add++;
0274 9180007A LDS R24,add
0276 5F8F SUBI R24,0xFF
0277 9380007A STS add,R24
(0214) }
(0215) else
(0216) {}
(0217) }
0279 C026 RJMP 0x02A0
(0218) else
(0219) {
(0220) if(lcd_data[add]==lcd[i])
027A 01CE MOVW R24,R28
027B 2DEE MOV R30,R14
027C 27FF CLR R31
027D 0FE8 ADD R30,R24
027E 1FF9 ADC R31,R25
027F 8020 LDD R2,Z+0
0280 E98B LDI R24,0x9B
0281 E090 LDI R25,0
0282 91E0007A LDS R30,add
0284 27FF CLR R31
0285 0FE8 ADD R30,R24
0286 1FF9 ADC R31,R25
0287 8030 LDD R3,Z+0
0288 1432 CP R3,R2
0289 F409 BNE 0x028B
(0221) {}
028A C00E RJMP 0x0299
(0222) else
(0223) {data[add]=lcd[i];}
028B 01CE MOVW R24,R28
028C 2DEE MOV R30,R14
028D 27FF CLR R31
028E 0FE8 ADD R30,R24
028F 1FF9 ADC R31,R25
0290 8020 LDD R2,Z+0
0291 E78B LDI R24,0x7B
0292 E090 LDI R25,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -