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