📄 18b20_test.lis
字号:
01D4 0E940000 xcall div16u
01D8 0983 std y+1,R16
01DA .dbline 120
01DA 2AE0 ldi R18,10
01DC 30E0 ldi R19,0
01DE 8601 movw R16,R12
01E0 0E940000 xcall mod16u
01E4 6801 movw R12,R16
01E6 .dbline 121
01E6 ; dispi[0]=adc;
01E6 C882 std y+0,R12
01E8 .dbline 122
01E8 ; lcd_write(command,wz);
01E8 2A2D mov R18,R10
01EA 0027 clr R16
01EC 33DF xcall _lcd_write
01EE 20C0 xjmp L60
01F0 L59:
01F0 .dbline 124
01F0 ; while(j--)
01F0 ; {
01F0 .dbline 125
01F0 ; if((dispi[j]==0)&&(i==1)&&(j!=0))
01F0 CE01 movw R24,R28
01F2 E42F mov R30,R20
01F4 FF27 clr R31
01F6 E80F add R30,R24
01F8 F91F adc R31,R25
01FA 2080 ldd R2,z+0
01FC 2220 tst R2
01FE 71F4 brne L62
0200 X13:
0200 6130 cpi R22,1
0202 61F4 brne L62
0204 X14:
0204 4423 tst R20
0206 51F0 breq L62
0208 X15:
0208 .dbline 126
0208 ; {
0208 .dbline 127
0208 ; lcd_write(data,dispi[j]+0x20);
0208 CE01 movw R24,R28
020A E42F mov R30,R20
020C FF27 clr R31
020E E80F add R30,R24
0210 F91F adc R31,R25
0212 2081 ldd R18,z+0
0214 205E subi R18,224 ; addi 32
0216 01E0 ldi R16,1
0218 1DDF xcall _lcd_write
021A .dbline 128
021A ; }
021A 0AC0 xjmp L63
021C L62:
021C .dbline 130
021C ; else
021C ; {
021C .dbline 131
021C ; lcd_write(data,dispi[j]+0x30);
021C CE01 movw R24,R28
021E E42F mov R30,R20
0220 FF27 clr R31
0222 E80F add R30,R24
0224 F91F adc R31,R25
0226 2081 ldd R18,z+0
0228 205D subi R18,208 ; addi 48
022A 01E0 ldi R16,1
022C 13DF xcall _lcd_write
022E .dbline 132
022E ; i=0;
022E 6627 clr R22
0230 .dbline 133
0230 ; }
0230 L63:
0230 .dbline 134
0230 ; }
0230 L60:
0230 .dbline 123
0230 242E mov R2,R20
0232 3324 clr R3
0234 4150 subi R20,1
0236 2220 tst R2
0238 D9F6 brne L59
023A X16:
023A .dbline -2
023A L56:
023A .dbline 0 ; func end
023A 2396 adiw R28,3
023C 0C940000 xjmp pop_xgsetF03C
0240 .dbsym r i 22 c
0240 .dbsym l dispi 0 A[3:3]c
0240 .dbsym r j 20 c
0240 .dbsym r adc 12 i
0240 .dbsym r wz 10 c
0240 .dbend
0240 .dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20.h
0240 .dbfunc e Sensor_Delay _Sensor_Delay fV
0240 ; i -> R20,R21
0240 ; US -> R10,R11
.even
0240 _Sensor_Delay::
0240 0E940000 xcall push_xgset300C
0244 5801 movw R10,R16
0246 .dbline -1
0246 .dbline 12
0246 ; #define b20_io PC7
0246 ; #define b20_port PORTC
0246 ; #define b20_pin PINC
0246 ; #define b20_ddr DDRC
0246 ; /********************************************************************************************
0246 ; * 函数名称:Sensor_Delay(uint16 US)//延时函数
0246 ; * 功 能:DS18B20软件延时专用
0246 ; * 入口参数:US
0246 ; * 出口参数:无
0246 ; *********************************************************************************************/
0246 ; void Sensor_Delay(unsigned int US)
0246 ; {
0246 .dbline 14
0246 ; unsigned int i;
0246 ; US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0246 05E0 ldi R16,5
0248 10E0 ldi R17,0
024A 9501 movw R18,R10
024C 0E940000 xcall empy16s
0250 5801 movw R10,R16
0252 B694 lsr R11
0254 A794 ror R10
0256 B694 lsr R11
0258 A794 ror R10
025A .dbline 15
025A ; for(i=0;i<US;i++);
025A 4427 clr R20
025C 5527 clr R21
025E 02C0 xjmp L68
0260 L65:
0260 .dbline 15
0260 L66:
0260 .dbline 15
0260 4F5F subi R20,255 ; offset = 1
0262 5F4F sbci R21,255
0264 L68:
0264 .dbline 15
0264 4A15 cp R20,R10
0266 5B05 cpc R21,R11
0268 D8F3 brlo L65
026A X17:
026A .dbline -2
026A L64:
026A .dbline 0 ; func end
026A 0C940000 xjmp pop_xgset300C
026E .dbsym r i 20 i
026E .dbsym r US 10 i
026E .dbend
026E .dbfunc e B20_init _B20_init fV
.even
026E _B20_init::
026E .dbline -1
026E .dbline 24
026E ; }
026E ; /*******************************************
026E ; 函数名称: B20_init
026E ; 功 能: 复位DS18B20
026E ; 参 数: 无
026E ; 返回值 : 无
026E ; ********************************************/
026E ; void B20_init(void)
026E ; {
026E .dbline 25
026E ; b20_ddr|=(1<<b20_io); //配置为输出
026E A79A sbi 0x14,7
0270 .dbline 26
0270 ; b20_port&=~(1<<b20_io); //拉低
0270 AF98 cbi 0x15,7
0272 .dbline 27
0272 ; Sensor_Delay(600); //等待600微秒
0272 08E5 ldi R16,600
0274 12E0 ldi R17,2
0276 E4DF xcall _Sensor_Delay
0278 .dbline 28
0278 ; b20_port|=(1<<b20_io); //释放总线
0278 AF9A sbi 0x15,7
027A .dbline 29
027A ; Sensor_Delay(60); //等待60微秒
027A 0CE3 ldi R16,60
027C 10E0 ldi R17,0
027E E0DF xcall _Sensor_Delay
0280 .dbline 30
0280 ; b20_ddr&=~(1<<b20_io); //配置为输入
0280 A798 cbi 0x14,7
0282 L70:
0282 .dbline 31
0282 ; while((b20_pin&(1<<b20_io))); //等待DS18B20拉低
0282 L71:
0282 .dbline 31
0282 9F99 sbic 0x13,7
0284 FECF rjmp L70
0286 X18:
0286 L73:
0286 .dbline 32
0286 ; while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
0286 L74:
0286 .dbline 32
0286 9F9B sbis 0x13,7
0288 FECF rjmp L73
028A X19:
028A .dbline -2
028A L69:
028A .dbline 0 ; func end
028A 0895 ret
028C .dbend
028C .dbfunc e B20_readB _B20_readB fc
028C ; retd -> R20
028C ; i -> R22
.even
028C _B20_readB::
028C 4A93 st -y,R20
028E 6A93 st -y,R22
0290 .dbline -1
0290 .dbline 42
0290 ; }
0290 ;
0290 ; /*******************************************
0290 ; 函数名称: B20_readB
0290 ; 功 能: 读取一个字节的数据
0290 ; 参 数: 无
0290 ; 返回值 : retd--返回的一个字节数据
0290 ; ********************************************/
0290 ; unsigned char B20_readB(void)
0290 ; {
0290 .dbline 43
0290 ; unsigned char i,retd=0;
0290 4427 clr R20
0292 .dbline 44
0292 ; for(i=0;i<8;i++) //位计数值
0292 6627 clr R22
0294 0FC0 xjmp L80
0296 L77:
0296 .dbline 45
0296 ; {
0296 .dbline 46
0296 ; retd>>=1; //右移,准备接受新的数据位
0296 4695 lsr R20
0298 .dbline 47
0298 ; b20_ddr|=(1<<b20_io); //配置为输出
0298 A79A sbi 0x14,7
029A .dbline 48
029A ; b20_port&=~(1<<b20_io); //拉低,启动读数据位
029A AF98 cbi 0x15,7
029C .dbline 49
029C ; b20_port|=(1<<b20_io); //释放总线
029C AF9A sbi 0x15,7
029E .dbline 50
029E ; Sensor_Delay(5); //等待5微秒
029E 05E0 ldi R16,5
02A0 10E0 ldi R17,0
02A2 CEDF xcall _Sensor_Delay
02A4 .dbline 51
02A4 ; b20_ddr&=~(1<<b20_io); //配置为输入,开始读取数据位
02A4 A798 cbi 0x14,7
02A6 .dbline 52
02A6 ; if(b20_pin&(1<<b20_io)) //该位是否为高
02A6 9F9B sbis 0x13,7
02A8 01C0 rjmp L81
02AA X20:
02AA .dbline 53
02AA ; {
02AA .dbline 54
02AA ; retd|=0x80; //是就将此位置高
02AA 4068 ori R20,128
02AC .dbline 55
02AC ; }
02AC L81:
02AC .dbline 56
02AC ; Sensor_Delay(50); //等待50微秒
02AC 02E3 ldi R16,50
02AE 10E0 ldi R17,0
02B0 C7DF xcall _Sensor_Delay
02B2 .dbline 57
02B2 ; }
02B2 L78:
02B2 .dbline 44
02B2 6395 inc R22
02B4 L80:
02B4 .dbline 44
02B4 6830 cpi R22,8
02B6 78F3 brlo L77
02B8 X21:
02B8 .dbline 58
02B8 ; return retd; //将读到的一个字节返回
02B8 042F mov R16,R20
02BA .dbline -2
02BA L76:
02BA .dbline 0 ; func end
02BA 6991 ld R22,y+
02BC 4991 ld R20,y+
02BE 0895 ret
02C0 .dbsym r retd 20 c
02C0 .dbsym r i 22 c
02C0 .dbend
02C0 .dbfunc e B20_writeB _B20_writeB fV
02C0 ; i -> R20
02C0 ; wrd -> R10
.even
02C0 _B20_writeB::
02C0 AA92 st -y,R10
02C2 4A93 st -y,R20
02C4 A02E mov R10,R16
02C6 .dbline -1
02C6 .dbline 67
02C6 ; }
02C6 ; /*******************************************
02C6 ; 函数名称: B20_writeB
02C6 ; 功 能: 写入一个字节的数据
02C6 ; 参 数: wrd--要写入的数据
02C6 ; 返回值 : 无
02C6 ; ********************************************/
02C6 ; void B20_writeB(unsigned char wrd)
02C6 ; {
02C6 .dbline 69
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -