📄 电池放电器v2.lst
字号:
0293 91E0007A LDS R30,add
0295 27FF CLR R31
0296 0FE8 ADD R30,R24
0297 1FF9 ADC R31,R25
0298 8220 STD Z+0,R2
(0224) add++;
0299 9180007A LDS R24,add
029B 5F8F SUBI R24,0xFF
029C 9380007A STS add,R24
(0225) b=1;
029E 24CC CLR R12
029F 94C3 INC R12
02A0 94E3 INC R14
02A1 2D8E MOV R24,R14
02A2 308B CPI R24,0xB
02A3 F408 BCC 0x02A5
02A4 CF83 RJMP 0x0228
02A5 C024 RJMP 0x02CA
(0226) }
(0227) }
(0228) while (*s)
(0229) {
(0230) if(lcd_data[add]==*s)//如果LCD上显示的数和
02A6 E98B LDI R24,0x9B
02A7 E090 LDI R25,0
02A8 91E0007A LDS R30,add
02AA 27FF CLR R31
02AB 0FE8 ADD R30,R24
02AC 1FF9 ADC R31,R25
02AD 8020 LDD R2,Z+0
02AE 01F4 MOVW R30,R8
02AF 91E4 LPM R30,0(Z)
02B0 162E CP R2,R30
02B1 F409 BNE 0x02B3
(0231) {} //待写入的数相同的话
02B2 C00F RJMP 0x02C2
(0232) else{data[add]=*s;}//要显示的数据存入显存
02B3 E78B LDI R24,0x7B
02B4 E090 LDI R25,0
02B5 91E0007A LDS R30,add
02B7 27FF CLR R31
02B8 0FE8 ADD R30,R24
02B9 1FF9 ADC R31,R25
02BA 01D4 MOVW R26,R8
02BB 93FA ST R31,-Y
02BC 93EA ST R30,-Y
02BD 01FD MOVW R30,R26
02BE 91A4 LPM R26,0(Z)
02BF 91E9 LD R30,Y+
02C0 91F9 LD R31,Y+
02C1 83A0 STD Z+0,R26
(0233) s ++;//指针加1
02C2 01C4 MOVW R24,R8
02C3 9601 ADIW R24,1
02C4 014C MOVW R8,R24
(0234) add++;//显存地址加1
02C5 9180007A LDS R24,add
02C7 5F8F SUBI R24,0xFF
02C8 9380007A STS add,R24
02CA 01F4 MOVW R30,R8
02CB 91E4 LPM R30,0(Z)
02CC 23EE TST R30
02CD F6C1 BNE 0x02A6
(0235) }
(0236) if(y==1)
02CE 898C LDD R24,Y+20
02CF 3081 CPI R24,1
02D0 F491 BNE 0x02E3
(0237) e+=16;
02D1 2D86 MOV R24,R6
02D2 5F80 SUBI R24,0xF0
02D3 2E68 MOV R6,R24
(0238) for(;e>=add;add++)
02D4 C00E RJMP 0x02E3
(0239) {data[add]=' ';}
02D5 E78B LDI R24,0x7B
02D6 E090 LDI R25,0
02D7 91E0007A LDS R30,add
02D9 27FF CLR R31
02DA 0FE8 ADD R30,R24
02DB 1FF9 ADC R31,R25
02DC E280 LDI R24,0x20
02DD 8380 STD Z+0,R24
02DE 9180007A LDS R24,add
02E0 5F8F SUBI R24,0xFF
02E1 9380007A STS add,R24
02E3 9020007A LDS R2,add
02E5 1462 CP R6,R2
02E6 F770 BCC 0x02D5
(0240) LCD_updata;
02E7 2422 CLR R2
02E8 92200060 STS new,R2
02EA 962A ADIW R28,0xA
02EB DC47 RCALL pop_gset5
02EC 9622 ADIW R28,2
02ED 9508 RET
_LCD_write_time:
lcd --> Y+0
i --> R20
z --> R22
s --> Y+18
m --> Y+16
h --> Y+14
y --> R10
x --> R20
02EE DC4A RCALL push_gset3
02EF 2EA2 MOV R10,R18
02F0 2F40 MOV R20,R16
02F1 9728 SBIW R28,0x8
02F2 896C LDD R22,Y+20
(0241) }
(0242) /*-----------------------------------------------------------------------
(0243) LCD_write_time : 数字显示函数
(0244)
(0245) 输入参数:
(0246) X、Y : 显示数据的起始的位置
(0247) h,m,s :时,分,秒
(0248) 编写日期 :2005-10-19
(0249) -----------------------------------------------------------------------*/
(0250) void LCD_write_time(unsigned char x,unsigned char y,unsigned char h,unsigned char m,unsigned char s,unsigned char z)
(0251) {
(0252) unsigned char i;
(0253) unsigned char lcd[8]={0};
02F3 E380 LDI R24,0x30
02F4 E090 LDI R25,0
02F5 01FE MOVW R30,R28
02F6 E008 LDI R16,0x8
02F7 E010 LDI R17,0
02F8 93FA ST R31,-Y
02F9 93EA ST R30,-Y
02FA 939A ST R25,-Y
02FB 938A ST R24,-Y
02FC DC91 RCALL asgncblk
(0254) if(y<2)
02FD 2D8A MOV R24,R10
02FE 3082 CPI R24,2
02FF F430 BCC 0x0306
(0255) add=y*16+x;//设置起始座标LCD_set_xy( X, Y );
0300 E180 LDI R24,0x10
0301 9D8A MUL R24,R10
0302 2C20 MOV R2,R0
0303 0E24 ADD R2,R20
0304 9220007A STS add,R2
(0256) lcd[0]=h/10+48;
0306 E01A LDI R17,0xA
0307 850E LDD R16,Y+14
0308 DBFE RCALL div8u
0309 2F80 MOV R24,R16
030A 5D80 SUBI R24,0xD0
030B 8388 STD Y+0,R24
(0257) lcd[1]=h%10+48;
030C E01A LDI R17,0xA
030D 850E LDD R16,Y+14
030E DBF6 RCALL mod8u
030F 2F80 MOV R24,R16
0310 5D80 SUBI R24,0xD0
0311 8389 STD Y+1,R24
(0258) lcd[2]=':';
0312 E38A LDI R24,0x3A
0313 838A STD Y+2,R24
(0259) lcd[3]=m/10+48;
0314 E01A LDI R17,0xA
0315 8908 LDD R16,Y+16
0316 DBF0 RCALL div8u
0317 2F80 MOV R24,R16
0318 5D80 SUBI R24,0xD0
0319 838B STD Y+3,R24
(0260) lcd[4]=m%10+48;
031A E01A LDI R17,0xA
031B 8908 LDD R16,Y+16
031C DBE8 RCALL mod8u
031D 2F80 MOV R24,R16
031E 5D80 SUBI R24,0xD0
031F 838C STD Y+4,R24
(0261) lcd[5]=':';
0320 E38A LDI R24,0x3A
0321 838D STD Y+5,R24
(0262) lcd[6]=s/10+48;
0322 E01A LDI R17,0xA
0323 890A LDD R16,Y+18
0324 DBE2 RCALL div8u
0325 2F80 MOV R24,R16
0326 5D80 SUBI R24,0xD0
0327 838E STD Y+6,R24
(0263) lcd[7]=s%10+48;
0328 E01A LDI R17,0xA
0329 890A LDD R16,Y+18
032A DBDA RCALL mod8u
032B 2F80 MOV R24,R16
032C 5D80 SUBI R24,0xD0
032D 838F STD Y+7,R24
(0264) if(z==5){if(lcd[7]%2)
032E 3065 CPI R22,5
032F F451 BNE 0x033A
0330 E012 LDI R17,2
0331 2F08 MOV R16,R24
0332 DBD2 RCALL mod8u
0333 2300 TST R16
0334 F019 BEQ 0x0338
(0265) lcd[2]=':';
0335 E38A LDI R24,0x3A
0336 838A STD Y+2,R24
0337 C002 RJMP 0x033A
(0266) else
(0267) lcd[2]=' ';}
0338 E280 LDI R24,0x20
0339 838A STD Y+2,R24
(0268)
(0269) for (i=0;i<z;i++)
033A 2744 CLR R20
033B C025 RJMP 0x0361
(0270) {
(0271) if(lcd_data[add]==lcd[i])
033C 01CE MOVW R24,R28
033D 2FE4 MOV R30,R20
033E 27FF CLR R31
033F 0FE8 ADD R30,R24
0340 1FF9 ADC R31,R25
0341 8020 LDD R2,Z+0
0342 E98B LDI R24,0x9B
0343 E090 LDI R25,0
0344 91E0007A LDS R30,add
0346 27FF CLR R31
0347 0FE8 ADD R30,R24
0348 1FF9 ADC R31,R25
0349 8030 LDD R3,Z+0
034A 1432 CP R3,R2
034B F409 BNE 0x034D
(0272) {}
034C C00E RJMP 0x035B
(0273) else
(0274) {data[add]=lcd[i];}
034D 01CE MOVW R24,R28
034E 2FE4 MOV R30,R20
034F 27FF CLR R31
0350 0FE8 ADD R30,R24
0351 1FF9 ADC R31,R25
0352 8020 LDD R2,Z+0
0353 E78B LDI R24,0x7B
0354 E090 LDI R25,0
0355 91E0007A LDS R30,add
0357 27FF CLR R31
0358 0FE8 ADD R30,R24
0359 1FF9 ADC R31,R25
035A 8220 STD Z+0,R2
(0275) add++;
035B 9180007A LDS R24,add
035D 5F8F SUBI R24,0xFF
035E 9380007A STS add,R24
0360 9543 INC R20
0361 1746 CP R20,R22
0362 F2C8 BCS 0x033C
(0276) }
(0277) LCD_updata;
0363 2422 CLR R2
0364 92200060 STS new,R2
0366 9628 ADIW R28,0x8
0367 DBC7 RCALL pop_gset3
0368 9508 RET
_LCD_write_new:
address --> R20
new_add --> R22
0369 DBD1 RCALL push_gset2
(0278) }
(0279) /*----------------------------------------------------
(0280) LCD_write_new:写显存函数
(0281) data[]:32字节的显存
(0282) new:显存标号
(0283) 编写日期:2005/10/18
(0284) -----------------------------------------------------*/
(0285) void LCD_write_new(void)
(0286) {
(0287) unsigned char address;
(0288) unsigned char new_add=1;//1表示要更新地址
036A E061 LDI R22,1
036B C04F RJMP 0x03BB
(0289) while(new<32)//显存共32个字节,标号从0--31
(0290) {
(0291) if(new==16)//换行
036C 91800060 LDS R24,new
036E 3180 CPI R24,0x10
036F F409 BNE 0x0371
(0292) new_add=1;
0370 E061 LDI R22,1
(0293) if(data[new])//跳过为0的显存
0371 E78B LDI R24,0x7B
0372 E090 LDI R25,0
0373 91E00060 LDS R30,new
0375 27FF CLR R31
0376 0FE8 ADD R30,R24
0377 1FF9 ADC R31,R25
0378 8020 LDD R2,Z+0
0379 2022 TST R2
037A F409 BNE 0x037C
037B C039 RJMP 0x03B5
(0294) {
(0295) if(new_add)//当new_add=0时表示无需更新地址
037C 2366 TST R22
037D F081 BEQ 0x038E
(0296) {
(0297) if(new>15)
037E E08F LDI R24,0xF
037F 90200060 LDS R2,new
0381 1582 CP R24,R2
0382 F418 BCC 0x0386
(0298) address=0xb0+new;
0383 2D42 MOV R20,R2
0384 5540 SUBI R20,0x50
0385 C003 RJMP 0x0389
(0299) else
(0300) address=0x80+new;
0386 91400060 LDS R20,new
0388 5840 SUBI R20,0x80
(0301) LCD_write_char(0,address);//设置起始地址
0389 2F24 MOV R18,R20
038A 2733 CLR R19
038B 2700 CLR R16
038C 2711 CLR R17
038D DD71 RCALL _LCD_write_char
(0302) }
(0303) LCD_write_char(1,data[new]);//写数据
038E E78B LDI R24,0x7B
038F E090 LDI R25,0
0390 91E00060 LDS R30,new
0392 27FF CLR R31
0393 0FE8 ADD R30,R24
0394 1FF9 ADC R31,R25
0395 8120 LDD R18,Z+0
0396 2733 CLR R19
0397 E001 LDI R16,1
0398 E010 LDI R17,0
0399 DD65 RCALL _LCD_write_char
(0304) lcd_data[new]=data[new];
039A E78B LDI R24,0x7B
039B E090 LDI R25,0
039C 91E00060 LDS R30,new
039E 27FF CLR R31
039F 0FE8 ADD R30,R24
03A0 1FF9 ADC R31,R25
03A1 8020 LDD R2,Z+0
03A2 E98B LDI R24,0x9B
03A3 E090 LDI R25,0
03A4 91E00060 LDS R30,new
03A6 27FF CLR R31
03A7 0FE8 ADD R30,R24
03A8 1FF9 ADC R31,R25
03A9 8220 STD Z+0,R2
(0305) data[new]=0;//写完数据后,显存清0
03AA E78B LDI R24,0x7B
03AB E090 LDI R25,0
03AC 91E00060 LDS R30,new
03AE 27FF CLR R31
03AF 0FE8 ADD R30,R24
03B0 1FF9 ADC R31,R25
03B1 2422 CLR R2
03B2 8220 STD Z+0,R2
(0306) new_add=0;
03B3 2766 CLR R22
(0307) }
03B4 C001 RJMP 0x03B6
(0308) else
(0309) new_add=1;
03B5 E061 LDI R22,1
(0310) new++;//
03B6 91800060 LDS R24,new
03B8 5F8F SUBI R24,0xFF
03B9 93800060 STS new,R24
03BB 91800060 LDS R24,new
03BD 3280 CPI R24,0x20
03BE F408 BCC 0x03C0
03BF CFAC RJMP 0x036C
03C0 DB6C RCALL pop_gset2
03C1 9508 RET
_T_BT1_T:
BT_T --> R20
a --> R22
i --> R10
03C2 DB76 RCALL push_gset3
FILE: E:\刻录的\电子技术\项目\电池放电器\软件V2.0\read_adc.c
(0001) #include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;
(0002) #include <macros.h>
(0003) #include "discharge.h"
(0004) #include <stdio.h>
(0005) #include "LCD_1602.h"
(0006)
(0007) /*---------------------------------------------
(0008) 电池1温度测量程序
(0009) 最大测量温度:88度
(0010) 测量64次取平均数
(0011) ----------------------------------------------*/
(0012) unsigned int T_BT1_T(void)
(0013) {
(0014) unsigned char i;
(0015) unsigned int a=0;
03C3 2766 CLR R22
03C4 2777 CLR R23
(0016) unsigned int BT_T;//电池1温度
(0017) i=read_adc(0,1);//第一次转换,不要
03C5 E021 LDI R18,1
03C6 2700 CLR R16
03C7 D0BB RCALL _read_adc
(0018) for (i=0;i<1;i++)
03C8 24AA CLR R10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -