📄 16ds18b20.lst
字号:
(0040)
(0041) DDRA = 0x00; /*方向输入*/
_io_init:
0158 2422 CLR R2
0159 BA2A OUT 0x1A,R2
(0042) PORTA = 0xFF; /*打开上拉*/
015A EF8F LDI R24,0xFF
015B BB8B OUT 0x1B,R24
(0043) DDRB = 0xFF; /*方向输出*/
015C BB87 OUT 0x17,R24
(0044) PORTB = 0xFF; /*输出高电平*/
015D BB88 OUT 0x18,R24
(0045) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
015E BA24 OUT 0x14,R2
(0046) PORTC = 0xFF;
015F BB85 OUT 0x15,R24
(0047) DDRD = 0x00;
0160 BA21 OUT 0x11,R2
(0048) PORTD = 0xFF;
0161 BB82 OUT 0x12,R24
(0049) DDRE = 0x00;
0162 B822 OUT 0x02,R2
(0050) PORTE = 0xFF;
0163 B983 OUT 0x03,R24
(0051) DDRF = 0x00;
0164 92200061 STS 0x61,R2
(0052) PORTF = 0xFF;
0166 93800062 STS 0x62,R24
(0053) DDRG = 0x00;
0168 92200064 STS 0x64,R2
(0054) PORTG = 0xFF;
016A 93800065 STS 0x65,R24
016C 9508 RET
_int_to_bcd:
i --> R20
temp --> R22
016D 940E026E CALL push_gset2
016F 01B8 MOVW R22,R16
(0055) }
(0056)
(0057) /*十六进制转十进制函数*/
(0058) void int_to_bcd(unsigned int temp) {
(0059) unsigned char i;
(0060)
(0061) for (i = 0; i < 4; i++) {
0170 2744 CLR R20
0171 C013 RJMP 0x0185
(0062) led_buf[i] = temp % 10; /*提取当前变量最低位*/
0172 E02A LDI R18,0xA
0173 E030 LDI R19,0
0174 018B MOVW R16,R22
0175 940E0221 CALL mod16u
0177 E180 LDI R24,0x10
0178 E091 LDI R25,1
0179 2FE4 MOV R30,R20
017A 27FF CLR R31
017B 0FE8 ADD R30,R24
017C 1FF9 ADC R31,R25
017D 8300 STD Z+0,R16
(0063) temp = temp / 10; /*去掉当前最低位值*/
017E E02A LDI R18,0xA
017F E030 LDI R19,0
0180 018B MOVW R16,R22
0181 940E0223 CALL div16u
0183 01B8 MOVW R22,R16
0184 9543 INC R20
0185 3044 CPI R20,4
0186 F358 BCS 0x0172
0187 940E0265 CALL pop_gset2
0189 9508 RET
(0064) }
(0065) }
(0066)
(0067) /*
(0068) 主函数
(0069)
(0070) 实现系统的初始化操作。
(0071) 周期性读取温度。
(0072) 然后放入显示缓存区。
(0073) 上面两个任务之间完全独立运行,方便移植。
(0074) */
(0075) void main(void) {
(0076)
(0077) unsigned int i;
(0078)
(0079) io_init();
_main:
i --> R20
018A DFCD RCALL _io_init
(0080) delay_ms(200);
018B EC08 LDI R16,0xC8
018C E010 LDI R17,0
018D DFB8 RCALL _delay_ms
(0081) ds1820_reset(); /*复位D18B20*/
018E 940E007F CALL _ds1820_reset
(0082) disp_init(); /*启动显示任务*/
0190 940E01B0 CALL _disp_init
(0083) led_buf[4] = 1; /*小数点位置*/
0192 E081 LDI R24,1
0193 93800114 STS 0x114,R24
0195 C018 RJMP 0x01AE
(0084) while (1) {
(0085) ds1820_start(); /*启动一次转换*/
0196 940E011C CALL _ds1820_start
(0086) delay_ms(2000); /*等待转换结束*/
0198 ED00 LDI R16,0xD0
0199 E017 LDI R17,7
019A DFAB RCALL _delay_ms
(0087) i = ds1820_read_temp(); /*读取温度数值*/
019B 940E0122 CALL _ds1820_read_temp
019D 01A8 MOVW R20,R16
(0088) i = (i * 10) / 16; /*数值处理*/
019E E00A LDI R16,0xA
019F E010 LDI R17,0
01A0 019A MOVW R18,R20
01A1 940E0255 CALL empy16s
01A3 01A8 MOVW R20,R16
01A4 9556 LSR R21
01A5 9547 ROR R20
01A6 9556 LSR R21
01A7 9547 ROR R20
01A8 9556 LSR R21
01A9 9547 ROR R20
01AA 9556 LSR R21
01AB 9547 ROR R20
(0089) int_to_bcd(i); /*整值分解*/
01AC 018A MOVW R16,R20
01AD DFBF RCALL _int_to_bcd
01AE CFE7 RJMP 0x0196
01AF 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\LED4.C
(0001) /*
(0002) 模块说明:
(0003)
(0004) LED数码管中断动态显示程序。
(0005) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0006) 2、动态调度由片内定时器1中断产生,中断周期为5mS。
(0007) 3、内部1 M晶振,程序采用单任务方式,软件延时。
(0008) 4、此模块文件为使用文件,可直接用于项目中。
(0009) www.iccavr.com 阿发
(0010)
(0011) */
(0012) #include "iom128v.h"
(0013) #include <macros.h>
(0014)
(0015) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
(0016)
(0017) /*
(0018) 前4位为显示数值。
(0019) 最后一位为小数点显示位置。
(0020) */
(0021) unsigned char led_buf[] = {0, 0, 0, 0, 1}; /*显示信息*/
(0022)
(0023) /*------------------------------------------------------------------*-
(0024)
(0025) Disp_Init()
(0026) 显示初始化
(0027)
(0028) -*------------------------------------------------------------------*/
(0029) void disp_init(void) {
(0030)
(0031) /*初始化定时器*/
(0032) OCR1A = 625; /*计数周期为5mS,F=1M*/
_disp_init:
01B0 E781 LDI R24,0x71
01B1 E092 LDI R25,2
01B2 BD9B OUT 0x2B,R25
01B3 BD8A OUT 0x2A,R24
(0033) TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
01B4 B787 IN R24,0x37
01B5 6180 ORI R24,0x10
01B6 BF87 OUT 0x37,R24
(0034) TCCR1A = 0x00;
01B7 2422 CLR R2
01B8 BC2F OUT 0x2F,R2
(0035) TCCR1B = (1 << WGM12); /*定时器工作在CTC计数器模式*/
01B9 E088 LDI R24,0x8
01BA BD8E OUT 0x2E,R24
(0036) TCCR1B |= (1 << CS11); /*设置定时器的分频值为8分频*/
01BB B58E IN R24,0x2E
01BC 6082 ORI R24,2
01BD BD8E OUT 0x2E,R24
(0037)
(0038) /*SPI接口初始化*/
(0039)
(0040) DDRB = 0xFF; /* 设置PB口为输出*/
01BE EF8F LDI R24,0xFF
01BF BB87 OUT 0x17,R24
(0041) SPCR = (1<<SPE) | (1<<MSTR)
01C0 E583 LDI R24,0x53
01C1 B98D OUT 0x0D,R24
(0042) | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0043)
(0044) /*中断使能*/
(0045) SEI();
01C2 9478 BSET 7
01C3 9508 RET
_Int_TCCR1A:
temp --> R20
01C4 922A ST R2,-Y
01C5 923A ST R3,-Y
01C6 930A ST R16,-Y
01C7 931A ST R17,-Y
01C8 938A ST R24,-Y
01C9 939A ST R25,-Y
01CA 93EA ST R30,-Y
01CB 93FA ST R31,-Y
01CC B62F IN R2,0x3F
01CD 922A ST R2,-Y
01CE 940E0270 CALL push_gset1
(0046) }
(0047)
(0048) /*------------------------------------------------------------------*-
(0049)
(0050) Int_TCCR1A()
(0051) LED数码管动态显示函数
(0052)
(0053) 定时器'T1',A组比较中断产生5mS周期性中断
(0054) 在中断里刷新显示
(0055)
(0056) -*------------------------------------------------------------------*/
(0057) #pragma interrupt_handler Int_TCCR1A: 13
(0058) void Int_TCCR1A(void) {
(0059)
(0060) unsigned char temp;
(0061) static unsigned char i;
(0062)
(0063) PORTB &= ~(1 << PB0); /*准备锁存*/
01D0 98C0 CBI 0x18,0
(0064) PORTB |= 0xF0; /*复位段选择口*/
01D1 B388 IN R24,0x18
01D2 6F80 ORI R24,0xF0
01D3 BB88 OUT 0x18,R24
(0065) PORTB |= (1 << PB0); /*锁存数据*/
01D4 9AC0 SBI 0x18,0
(0066) if (i == 3) {
01D5 91800116 LDS R24,i
01D7 3083 CPI R24,3
01D8 F409 BNE 0x01DA
(0067) PORTB &= ~(1 << PB6); /*由于此处显示数值滞后一个周期所以显示位也要修改*/
01D9 98C6 CBI 0x18,6
(0068) } /*此处逻辑性很强,如不能理解可先跳过,以后熟练来再看*/
(0069) if (i == 2) {
01DA 91800116 LDS R24,i
01DC 3082 CPI R24,2
01DD F409 BNE 0x01DF
(0070) PORTB &= ~(1 << PB5);
01DE 98C5 CBI 0x18,5
(0071) }
(0072) if (i == 1) {
01DF 91800116 LDS R24,i
01E1 3081 CPI R24,1
01E2 F409 BNE 0x01E4
(0073) PORTB &= ~(1 << PB4);
01E3 98C4 CBI 0x18,4
(0074) }
(0075) if (i == 0) {
01E4 90200116 LDS R2,i
01E6 2022 TST R2
01E7 F409 BNE 0x01E9
(0076) PORTB &= ~(1 << PB7);
01E8 98C7 CBI 0x18,7
(0077) }
(0078) temp = led_buf[i] % 16; /*滤除溢出的数值*/
01E9 E180 LDI R24,0x10
01EA E091 LDI R25,1
01EB 91E00116 LDS R30,i
01ED 27FF CLR R31
01EE 0FE8 ADD R30,R24
01EF 1FF9 ADC R31,R25
01F0 8100 LDD R16,Z+0
01F1 E110 LDI R17,0x10
01F2 940E023D CALL mod8u
01F4 2F40 MOV R20,R16
(0079) temp = disp[temp]; /*取出当前显示信息*/
01F5 E080 LDI R24,0
01F6 E091 LDI R25,1
01F7 2FE4 MOV R30,R20
01F8 27FF CLR R31
01F9 0FE8 ADD R30,R24
01FA 1FF9 ADC R31,R25
01FB 8140 LDD R20,Z+0
(0080) if (led_buf[4] == i) { /*显示小数点*/
01FC 90200116 LDS R2,i
01FE 90300114 LDS R3,0x114
0200 1432 CP R3,R2
0201 F421 BNE 0x0206
(0081) SPDR = temp & 0x7F;
0202 2F84 MOV R24,R20
0203 778F ANDI R24,0x7F
0204 B98F OUT 0x0F,R24
(0082) }
0205 C001 RJMP 0x0207
(0083) else {
(0084) SPDR = temp;
0206 B94F OUT 0x0F,R20
(0085) }
(0086)
(0087) i ++;
0207 91800116 LDS R24,i
0209 5F8F SUBI R24,0xFF
020A 93800116 STS i,R24
(0088) if (i > 3) { /*溢出处理*/
020C E083 LDI R24,3
020D 90200116 LDS R2,i
020F 1582 CP R24,R2
0210 F418 BCC 0x0214
(0089) i = 0;
0211 2422 CLR R2
0212 92200116 STS i,R2
(0090) }
FILE: <library>
0214 940E0273 CALL pop_gset1
0216 9029 LD R2,Y+
0217 BE2F OUT 0x3F,R2
0218 91F9 LD R31,Y+
0219 91E9 LD R30,Y+
021A 9199 LD R25,Y+
021B 9189 LD R24,Y+
021C 9119 LD R17,Y+
021D 9109 LD R16,Y+
021E 9039 LD R3,Y+
021F 9029 LD R2,Y+
0220 9518 RETI
mod16u:
0221 9468 BSET 6
0222 C001 RJMP xdiv16u
div16u:
0223 94E8 BCLR 6
xdiv16u:
0224 92EA ST R14,-Y
0225 92FA ST R15,-Y
0226 938A ST R24,-Y
0227 24EE CLR R14
0228 24FF CLR R15
0229 E180 LDI R24,0x10
022A 0F00 LSL R16
022B 1F11 ROL R17
022C 1CEE ROL R14
022D 1CFF ROL R15
022E 16E2 CP R14,R18
022F 06F3 CPC R15,R19
0230 F018 BCS 0x0234
0231 1AE2 SUB R14,R18
0232 0AF3 SBC R15,R19
0233 9503 INC R16
0234 958A DEC R24
0235 F7A1 BNE 0x022A
0236 F416 BRTC 0x0239
0237 2D0E MOV R16,R14
0238 2D1F MOV R17,R15
0239 9189 LD R24,Y+
023A 90F9 LD R15,Y+
023B 90E9 LD R14,Y+
023C 9508 RET
mod8u:
023D 9468 BSET 6
023E C001 RJMP xdiv8u
div8u:
023F 94E8 BCLR 6
xdiv8u:
0240 932A ST R18,-Y
0241 92FA ST R15,-Y
0242 92EA ST R14,-Y
0243 24FF CLR R15
0244 24EE CLR R14
0245 E120 LDI R18,0x10
0246 0F00 LSL R16
0247 1CFF ROL R15
0248 1CEE ROL R14
0249 16E1 CP R14,R17
024A F010 BCS 0x024D
024B 1AE1 SUB R14,R17
024C 9503 INC R16
024D 952A DEC R18
024E F7B9 BNE 0x0246
024F F40E BRTC 0x0251
0250 2D0E MOV R16,R14
0251 90E9 LD R14,Y+
0252 90F9 LD R15,Y+
0253 9129 LD R18,Y+
0254 9508 RET
empy16s:
0255 920A ST R0,-Y
0256 921A ST R1,-Y
0257 938A ST R24,-Y
0258 939A ST R25,-Y
0259 9F02 MUL R16,R18
025A 01C0 MOVW R24,R0
025B 9F12 MUL R17,R18
025C 0D90 ADD R25,R0
025D 9F03 MUL R16,R19
025E 0D90 ADD R25,R0
025F 018C MOVW R16,R24
0260 9199 LD R25,Y+
0261 9189 LD R24,Y+
0262 9019 LD R1,Y+
0263 9009 LD R0,Y+
0264 9508 RET
pop_gset2:
0265 E0E2 LDI R30,2
0266 940C0274 JMP pop
push_gset5:
0268 92FA ST R15,-Y
0269 92EA ST R14,-Y
push_gset4:
026A 92DA ST R13,-Y
026B 92CA ST R12,-Y
push_gset3:
026C 92BA ST R11,-Y
026D 92AA ST R10,-Y
push_gset2:
026E 937A ST R23,-Y
026F 936A ST R22,-Y
push_gset1:
0270 935A ST R21,-Y
0271 934A ST R20,-Y
0272 9508 RET
pop_gset1:
0273 E0E1 LDI R30,1
pop:
0274 9149 LD R20,Y+
0275 9159 LD R21,Y+
0276 FDE0 SBRC R30,0
0277 9508 RET
0278 9169 LD R22,Y+
0279 9179 LD R23,Y+
027A FDE1 SBRC R30,1
027B 9508 RET
027C 90A9 LD R10,Y+
027D 90B9 LD R11,Y+
027E FDE2 SBRC R30,2
027F 9508 RET
0280 90C9 LD R12,Y+
0281 90D9 LD R13,Y+
0282 FDE3 SBRC R30,3
0283 9508 RET
0284 90E9 LD R14,Y+
0285 90F9 LD R15,Y+
0286 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -