?? ds18b20_main.s
字號(hào):
.module DS18B20_main.c
.area text(rom, con, rel)
.dbfile E:\單片機(jī)\16實(shí)驗(yàn)程序\DS18B20\DS18B20\DS18B20_main.c
.dbfile E:\單片機(jī)\16實(shí)驗(yàn)程序\DS18B20\DS18B20\18B20.h
.dbfunc e s_10us _s_10us fV
; aa -> R20,R21
; ms -> R16,R17
.even
_s_10us::
st -y,R20
st -y,R21
.dbline -1
.dbline 19
; //DS18B20連接在端口C的第7引腳
;
; //設(shè)置成輸入
; #define DQ_INPUT DDRC &= ~(1 << PC7)
; //設(shè)置成輸出
; #define DQ_OUT DDRC |= (1 << PC7)
; //設(shè)置成低電平
; #define DQ_LO PORTC &= ~(1 << PC7)
; //設(shè)置成高電平
; #define DQ_HI PORTC |= (1 << PC7)
; //讀出
; #define DQ_R PINC & (1 << PC7)
;
; //中斷標(biāo)志
; unsigned char init_f;
;
; //延時(shí)函數(shù)
; void s_10us(unsigned int ms)
; {
.dbline 21
; unsigned int aa;
; for(;ms>=1;ms--)
L2:
.dbline 22
; {
.dbline 23
; for(aa=0;aa<=17;aa++)
clr R20
clr R21
xjmp L9
L6:
.dbline 24
; {;}
.dbline 24
.dbline 24
L7:
.dbline 23
subi R20,255 ; offset = 1
sbci R21,255
L9:
.dbline 23
ldi R24,17
ldi R25,0
cp R24,R20
cpc R25,R21
brsh L6
X0:
.dbline 25
; }
L3:
.dbline 21
subi R16,1
sbci R17,0
L5:
.dbline 21
cpi R16,1
ldi R30,0
cpc R17,R30
brsh L2
X1:
.dbline -2
L1:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r aa 20 i
.dbsym r ms 16 i
.dbend
.dbfunc e ds1820_reset _ds1820_reset fV
; i -> R20
.even
_ds1820_reset::
st -y,R20
.dbline -1
.dbline 30
; }
;
; //DS18B20復(fù)位
; void ds1820_reset(void)
; {
.dbline 33
; unsigned char i;
; //中斷保護(hù)
; init_f = SREG;
in R2,0x3f
sts _init_f,R2
.dbline 35
; //關(guān)中斷
; CLI();
cli
.dbline 36
; DQ_OUT;
sbi 0x14,7
.dbline 37
; DQ_LO;
cbi 0x15,7
.dbline 38
; s_10us(50); //延時(shí)500us
ldi R16,50
ldi R17,0
xcall _s_10us
.dbline 39
; DQ_HI;
sbi 0x15,7
.dbline 40
; DQ_INPUT;
cbi 0x14,7
.dbline 41
; s_10us(8); //延時(shí)80us
ldi R16,8
ldi R17,0
xcall _s_10us
.dbline 42
; i = DQ_R;
in R20,0x13
andi R20,128
.dbline 43
; s_10us(50); //延時(shí)500us
ldi R16,50
ldi R17,0
xcall _s_10us
.dbline 44
; if (init_f & 0x80) //恢復(fù)中斷狀態(tài)
lds R2,_init_f
sbrs R2,7
rjmp L11
X2:
.dbline 45
; {
.dbline 46
; SEI();
sei
.dbline 47
; }
L11:
.dbline -2
L10:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r i 20 c
.dbend
.dbfunc e ds1820_read_byte _ds1820_read_byte fc
; value -> R20
; i -> R22
.even
_ds1820_read_byte::
st -y,R20
st -y,R22
.dbline -1
.dbline 52
; }
;
; //DS18B20字節(jié)讀取
; unsigned char ds1820_read_byte(void)
; {
.dbline 54
; unsigned char i;
; unsigned char value = 0;
clr R20
.dbline 56
; //中斷保護(hù)
; init_f = SREG;
in R2,0x3f
sts _init_f,R2
.dbline 58
; //關(guān)中斷
; CLI();
cli
.dbline 59
; for (i = 8; i != 0; i--) {
ldi R22,8
xjmp L17
L14:
.dbline 59
.dbline 60
; value >>= 1;
lsr R20
.dbline 61
; DQ_OUT;
sbi 0x14,7
.dbline 62
; DQ_LO;
cbi 0x15,7
.dbline 63
; s_10us(1);
ldi R16,1
ldi R17,0
xcall _s_10us
.dbline 64
; DQ_HI;
sbi 0x15,7
.dbline 65
; DQ_INPUT;
cbi 0x14,7
.dbline 66
; s_10us(1);
ldi R16,1
ldi R17,0
xcall _s_10us
.dbline 67
; if (DQ_R) {
sbis 0x13,7
rjmp L18
X3:
.dbline 67
.dbline 68
; value|=0x80;
ori R20,128
.dbline 69
; }
L18:
.dbline 70
; s_10us(5); //延時(shí)60us
ldi R16,5
ldi R17,0
xcall _s_10us
.dbline 71
; }
L15:
.dbline 59
dec R22
L17:
.dbline 59
tst R22
brne L14
X4:
.dbline 72
; if (init_f & 0x80) //恢復(fù)中斷狀態(tài)
lds R2,_init_f
sbrs R2,7
rjmp L20
X5:
.dbline 73
; {
.dbline 74
; SEI();
sei
.dbline 75
; }
L20:
.dbline 76
; return(value);
mov R16,R20
.dbline -2
L13:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r value 20 c
.dbsym r i 22 c
.dbend
.dbfunc e ds1820_write_byte _ds1820_write_byte fV
; i -> R20
; value -> R10
.even
_ds1820_write_byte::
st -y,R10
st -y,R20
mov R10,R16
.dbline -1
.dbline 81
; }
;
; //DS18B20字節(jié)寫入
; void ds1820_write_byte(unsigned char value)
; {
.dbline 84
; unsigned char i;
; //中斷保護(hù)
; init_f = SREG;
in R2,0x3f
sts _init_f,R2
.dbline 86
; //關(guān)中斷
; CLI();
cli
.dbline 87
; for (i = 8; i != 0; i--) {
ldi R20,8
xjmp L26
L23:
.dbline 87
.dbline 88
; DQ_OUT;
sbi 0x14,7
.dbline 89
; DQ_LO;
cbi 0x15,7
.dbline 90
; s_10us(1);
ldi R16,1
ldi R17,0
xcall _s_10us
.dbline 91
; if (value & 0x01) {
sbrs R10,0
rjmp L27
X6:
.dbline 91
.dbline 92
; DQ_HI;
sbi 0x15,7
.dbline 93
; }
L27:
.dbline 94
; s_10us(8); //延時(shí)80us
ldi R16,8
ldi R17,0
xcall _s_10us
.dbline 95
; DQ_HI;
sbi 0x15,7
.dbline 96
; value >>= 1;
lsr R10
.dbline 97
; }
L24:
.dbline 87
dec R20
L26:
.dbline 87
tst R20
brne L23
X7:
.dbline 98
; if (init_f & 0x80)//恢復(fù)中斷狀態(tài)
lds R2,_init_f
sbrs R2,7
rjmp L29
X8:
.dbline 99
; {
.dbline 100
; SEI();
sei
.dbline 101
; }
L29:
.dbline -2
L22:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r i 20 c
.dbsym r value 10 c
.dbend
.dbfunc e ds1820_start _ds1820_start fV
.even
_ds1820_start::
.dbline -1
.dbline 106
; }
;
; //啟動(dòng)ds1820轉(zhuǎn)換
; void ds1820_start(void)
; {
.dbline 107
; ds1820_reset();
xcall _ds1820_reset
.dbline 108
; ds1820_write_byte(0xCC); //勿略ROM
ldi R16,204
xcall _ds1820_write_byte
.dbline 109
; ds1820_write_byte(0x44); //啟動(dòng)轉(zhuǎn)換
ldi R16,68
.dbline -2
L31:
.dbline 0 ; func end
xjmp _ds1820_write_byte
.dbend
.dbfunc e ds1820_read_temp _ds1820_read_temp fi
; buf -> y+0
; i -> R20,R21
.even
_ds1820_read_temp::
st -y,R20
st -y,R21
sbiw R28,9
.dbline -1
.dbline 114
; }
;
; //讀溫度
; unsigned int ds1820_read_temp(void)
; {
.dbline 117
; unsigned int i;
; unsigned char buf[9];
; ds1820_reset();
xcall _ds1820_reset
.dbline 118
; ds1820_write_byte(0xCC); //勿略ROM
ldi R16,204
xcall _ds1820_write_byte
.dbline 119
; ds1820_write_byte(0xBE); //讀溫度
ldi R16,190
xcall _ds1820_write_byte
.dbline 120
; for (i = 0; i < 9; i++) {
clr R20
clr R21
xjmp L36
L33:
.dbline 120
.dbline 121
; buf[i] = ds1820_read_byte();
xcall _ds1820_read_byte
movw R24,R28
movw R30,R20
add R30,R24
adc R31,R25
std z+0,R16
.dbline 122
; }
L34:
.dbline 120
subi R20,255 ; offset = 1
sbci R21,255
L36:
.dbline 120
cpi R20,9
ldi R30,0
cpc R21,R30
brlo L33
X9:
.dbline 123
; i = buf[1];
ldd R20,y+1
clr R21
.dbline 124
; i <<= 8;
mov R21,R20
clr R20
.dbline 125
; i |= buf[0];
ldd R2,y+0
clr R3
or R20,R2
or R21,R3
.dbline 126
; return i;
movw R16,R20
.dbline -2
L32:
.dbline 0 ; func end
adiw R28,9
ld R21,y+
ld R20,y+
ret
.dbsym l buf 0 A[9:9]c
.dbsym r i 20 i
.dbend
.dbfile E:\單片機(jī)\16實(shí)驗(yàn)程序\DS18B20\DS18B20\1602.h
.dbfunc e s_ms _s_ms fV
; ms -> R16,R17
.even
_s_ms::
.dbline -1
.dbline 9
; #define uchar unsigned char
; #define uint unsigned int
;
; #define RS 5
; #define RW 6
; #define EN 7
;
; void s_ms(uint ms)
; {
.dbline 10
; for(;ms>1;ms--);
xjmp L42
L39:
.dbline 10
L40:
.dbline 10
subi R16,1
sbci R17,0
L42:
.dbline 10
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L39
X10:
.dbline -2
L38:
.dbline 0 ; func end
ret
.dbsym r ms 16 i
.dbend
.dbfunc e busy _busy fV
; temp -> R20
.even
_busy::
st -y,R20
.dbline -1
.dbline 15
; }
;
; //查忙
; void busy(void)
; {
.dbline 17
; uchar temp;
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 18
; PORTA&=~(1<<RS); //RS=0
cbi 0x1b,5
.dbline 19
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 20
; PORTA|=(1<<RW); //RW=1
sbi 0x1b,6
.dbline 21
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
xjmp L45
L44:
.dbline 23
; while(temp)
; {
.dbline 24
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 25
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 26
; DDRD=0x00; //A口變輸入
clr R2
out 0x11,R2
.dbline 27
; PORTD=0xff; //上拉使能
ldi R24,255
out 0x12,R24
.dbline 28
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 29
; temp = PIND&0x80; //讀取A口
in R20,0x10
andi R20,128
.dbline 30
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 31
; DDRD=0xff;
ldi R24,255
out 0x11,R24
.dbline 32
; PORTD=0xff; //A口變輸出
out 0x12,R24
.dbline 33
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 34
; PORTA&=~(1<<EN); //EN=0
cbi 0x1b,7
.dbline 35
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 36
; }
L45:
.dbline 22
tst R20
brne L44
X11:
.dbline -2
L43:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r temp 20 c
.dbend
.dbfunc e writecom _writecom fV
; com -> R10
.even
_writecom::
st -y,R10
mov R10,R16
.dbline -1
.dbline 41
; }
;
; //寫指令
; void writecom(uchar com)
; {
.dbline 42
; busy();
xcall _busy
.dbline 43
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 44
; PORTA&=~(1<<RS); //RS=0
cbi 0x1b,5
.dbline 45
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 46
; PORTA&=~(1<<RW); //RW=0
cbi 0x1b,6
.dbline 47
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 48
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 49
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 50
; PORTD = com; //輸出指令
out 0x12,R10
.dbline 51
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 52
; PORTA&=~(1<<EN); //EN=0
cbi 0x1b,7
.dbline 53
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline -2
L47:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r com 10 c
.dbend
.dbfunc e LcdInit _LcdInit fV
.even
_LcdInit::
.dbline -1
.dbline 58
; }
;
; //1602初始化
; void LcdInit(void)
; {
.dbline 59
; DDRD = 0xff;
ldi R24,255
out 0x11,R24
.dbline 60
; PORTD = 0x00;
clr R2
out 0x12,R2
.dbline 61
; writecom(0x38);
ldi R16,56
xcall _writecom
.dbline 62
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 63
; writecom(0x01);
ldi R16,1
xcall _writecom
.dbline 64
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 65
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 66
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 67
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 68
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 69
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 70
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 71
; writecom(0x02);
ldi R16,2
xcall _writecom
.dbline 72
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 73
; writecom(0x06);
ldi R16,6
xcall _writecom
.dbline 74
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 75
; writecom(0x0c);
ldi R16,12
xcall _writecom
.dbline 76
; s_ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_ms
.dbline 77
; writecom(0x38);
ldi R16,56
xcall _writecom
.dbline 78
; s_ms(1000);
ldi R16,1000
ldi R17,3
.dbline -2
L48:
.dbline 0 ; func end
xjmp _s_ms
.dbend
.dbfunc e writedata _writedata fV
; data -> R10
.even
_writedata::
st -y,R10
mov R10,R16
.dbline -1
.dbline 83
; }
;
; //寫數(shù)據(jù)
; void writedata(uchar data)
; {
.dbline 84
; busy();
xcall _busy
.dbline 85
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 86
; PORTA|=(1<<RS); //RS=1
sbi 0x1b,5
.dbline 87
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 88
; PORTA&=~(1<<RW); //RW=0
cbi 0x1b,6
.dbline 89
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 90
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 91
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 92
; PORTD = data; //輸出數(shù)據(jù)
out 0x12,R10
.dbline 93
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 94
; PORTA&=~(1<<EN); //EN=0
cbi 0x1b,7
.dbline 95
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline -2
L49:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r data 10 c
.dbend
.dbfunc e readdata _readdata fc
; temp -> R10
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -