📄 ds18b20.s
字号:
.module DS18B20.c
.area text(rom, con, rel)
.dbfile E:\CRAZY\调试AVR_C\电升06~1\DS18B20.c
.dbfunc e process _process fV
; p -> R10,R11
; i -> y+6
.even
_process::
rcall push_arg4
rcall push_gset3
ldd R10,y+10
ldd R11,y+11
.dbline -1
.dbline 20
; #include <iom8v.h>
; #include <macros.h>
;
; #define LCM_Data PORTB
; #define Busy 0x80
;
; #define Set_DQ1 DDRC |= 0x08; PORTC |= 0x08; //总线拉高
; #define Set_DQ0 DDRC |= 0x08; PORTC &= 0xf7; //总线置低
; #define Read_DQ PINC&0x08 //读总线
; #define MatchROM 0xcc //匹配ROM
; #define WriteMode 0x4e //写模式
; #define TH 0x64 //设置温度上限100
; #define TL 0x8a //设置温度下限-10
; #define MatchTemp 0x7f //写温度匹配寄存器,12bit
; #define ConverTem 0x44 //DS18B20温度转换命令
; #define Get_Value 0xbe //读取温度寄存器值
; uchar data[5];
;
; void process(long int i,uchar*p)
; {
.dbline 21
; p[0]=i/1000;
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall div32s
movw R30,R10
std z+0,R16
.dbline 22
; i=i%1000;
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall mod32s
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
.dbline 23
; p[1]=i/100;
ldi R20,100
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall div32s
movw R30,R10
std z+1,R16
.dbline 24
; i=i%100;
ldi R20,100
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall mod32s
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
.dbline 25
; p[2]=i/10;
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall div32s
movw R30,R10
std z+2,R16
.dbline 26
; i=i%10;
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall mod32s
movw R30,R28
std z+6,R16
std z+7,R17
std z+8,R18
std z+9,R19
.dbline 27
; p[3]=i;
movw R30,R28
ldd R2,z+6
ldd R3,z+7
movw R30,R10
std z+3,R2
.dbline 28
; for(i=0;i<4;i++)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+6,R20
std z+7,R21
std z+8,R22
std z+9,R23
L2:
.dbline 29
movw R30,R28
ldd R2,z+6
ldd R3,z+7
add R2,R10
adc R3,R11
movw R30,R2
ldd R24,z+0
subi R24,208 ; addi 48
std z+0,R24
L3:
.dbline 28
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
.dbline 28
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge X0
rjmp L2
X0:
.dbline 30
; p[i]+=0x30;
; p[4]='$';
ldi R24,36
movw R30,R10
std z+4,R24
.dbline -2
L1:
rcall pop_gset3
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r p 10 pc
.dbsym l i 6 L
.dbend
.dbfunc e delayms _delayms fV
; j -> R20,R21
; i -> R16,R17
.even
_delayms::
rcall push_gset1
.dbline -1
.dbline 35
; }
;
;
; void delayms(uint i)
; {
.dbline 37
; uint j;
; for(;i!=0;i--)
rjmp L10
L7:
.dbline 38
; for(j=0;j<8000;j++)
clr R20
clr R21
rjmp L14
L11:
.dbline 39
L12:
.dbline 38
subi R20,255 ; offset = 1
sbci R21,255
L14:
.dbline 38
cpi R20,64
ldi R30,31
cpc R21,R30
brlo L11
L8:
.dbline 37
subi R16,1
sbci R17,0
L10:
.dbline 37
cpi R16,0
cpc R16,R17
brne L7
X1:
.dbline -2
L6:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 i
.dbsym r i 16 i
.dbend
.dbfunc e delayus _delayus fV
; i -> R16,R17
.even
_delayus::
.dbline -1
.dbline 43
; ;
; }
;
; void delayus(uint i)
; {
.dbline 44
; for(;i!=0;i--)
rjmp L19
L16:
.dbline 45
L17:
.dbline 44
subi R16,1
sbci R17,0
L19:
.dbline 44
cpi R16,0
cpc R16,R17
brne L16
X2:
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 52
; ;
; }
;
;
;
;
; void port_init(void)
; {
.dbline 53
; DDRD = 0xfe;
ldi R24,254
out 0x11,R24
.dbline 54
; PORTD = 0xff;
ldi R24,255
out 0x12,R24
.dbline 55
; DDRB = 0xff;
out 0x17,R24
.dbline 56
; PORTB = 0xff;
out 0x18,R24
.dbline 57
; DDRC = 0xff;
out 0x14,R24
.dbline 58
; PORTC = 0xff;
out 0x15,R24
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbend
.dbfunc e WriteDataLCM _WriteDataLCM fV
; WDLCM -> R20
.even
_WriteDataLCM::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 65
; }
;
;
; /**********************************************************/
; //写数据
; void WriteDataLCM(unsigned char WDLCM)
; {
.dbline 67
; //ReadStatusLCM(); //检测忙
; LCM_Data = WDLCM;
out 0x18,R20
.dbline 70
; //PORTC=0B00000100;
; //PORTC=0B00000100;
; delayms(1);
ldi R16,1
ldi R17,0
rcall _delayms
.dbline 71
; PORTC=0B00000101;
ldi R24,5
out 0x15,R24
.dbline 72
; PORTC=0B00000100;
ldi R24,4
out 0x15,R24
.dbline -2
L21:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r WDLCM 20 c
.dbend
.dbfunc e WriteCommandLCM _WriteCommandLCM fV
; BuysC -> R22
; WCLCM -> R20
.even
_WriteCommandLCM::
rcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 78
; }
;
; //写指令
; void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC为0时忽略忙检测
;
; {
.dbline 79
; if (BuysC)
tst R22
breq L23
.dbline 80
; ;//ReadStatusLCM(); //根据需要检测忙
L23:
.dbline 81
; LCM_Data = WCLCM;
out 0x18,R20
.dbline 82
; delayms(1);
ldi R16,1
ldi R17,0
rcall _delayms
.dbline 83
; PORTC=0B00000001;
ldi R24,1
out 0x15,R24
.dbline 84
; delayms(1);
ldi R16,1
ldi R17,0
rcall _delayms
.dbline 85
; PORTC=0B00000000;
clr R2
out 0x15,R2
.dbline -2
L22:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r BuysC 22 c
.dbsym r WCLCM 20 c
.dbend
.dbfunc e ReadDataLCM _ReadDataLCM fc
.even
_ReadDataLCM::
.dbline -1
.dbline 90
; }
;
; //读数据
; unsigned char ReadDataLCM(void)
; {
.dbline 91
; PORTC=0X00000111;
ldi R24,273
ldi R25,1
out 0x15,R24
.dbline 92
; return(LCM_Data);
in R16,0x18
.dbline -2
L25:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCMInit _LCMInit fV
.even
_LCMInit::
.dbline -1
.dbline 99
; }
;
; //读状态
;
;
; void LCMInit(void) //LCM初始化
; {
.dbline 108
; /* LCM_Data = 0;
; WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
; delayms(5);
; WriteCommandLCM(0x38,0);
; delayms(5);
; WriteCommandLCM(0x38,0);
; delayms(5);
; */
; WriteCommandLCM(0x38,0); //显示模式设置,开始要求每次检测忙信号
clr R18
ldi R16,56
rcall _WriteCommandLCM
.dbline 110
; //WriteCommandLCM(0x08,0); //关闭显示
; WriteCommandLCM(0x01,0); //显示清屏
clr R18
ldi R16,1
rcall _WriteCommandLCM
.dbline 111
; WriteCommandLCM(0x06,0); // 显示光标移动设置
clr R18
ldi R16,6
rcall _WriteCommandLCM
.dbline 112
; WriteCommandLCM(0x0c,0); // 显示开及光标设置
clr R18
ldi R16,12
rcall _WriteCommandLCM
.dbline -2
L26:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DisplayOneChar _DisplayOneChar fV
; DData -> y+4
; Y -> R22
; X -> R20
.even
_DisplayOneChar::
rcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 120
; }
;
; /*****************************************************************************/
;
;
; //按指定位置显示一个字符
; void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
; {
.dbline 121
; Y &= 0x1;
andi R22,1
.dbline 122
; X &= 0xF; //限制X不能大于15,Y不能大于1
andi R20,15
.dbline 123
; if (Y) X += 0x40; //当要显示第二行时地址码+0x40;
tst R22
breq L28
.dbline 123
subi R20,192 ; addi 64
L28:
.dbline 124
; X += 0x80; // 算出指令码
subi R20,128 ; addi 128
.dbline 125
; WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
clr R18
mov R16,R20
rcall _WriteCommandLCM
.dbline 126
; WriteDataLCM(DData);
ldd R16,y+4
rcall _WriteDataLCM
.dbline -2
L27:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l DData 4 c
.dbsym r Y 22 c
.dbsym r X 20 c
.dbend
.dbfunc e DisplayListChar _DisplayListChar fV
; ListLength -> R20
; DData -> R22,R23
; Y -> R10
; X -> R12
.even
_DisplayListChar::
rcall push_gset4
mov R10,R18
mov R12,R16
sbiw R28,1
ldd R22,y+9
ldd R23,y+10
.dbline -1
.dbline 131
; }
;
; //按指定位置显示一串字符
; void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
; {
.dbline 134
; unsigned char ListLength;
;
; ListLength = 0;
clr R20
.dbline 135
; Y &= 0x1;
mov R24,R10
andi R24,1
mov R10,R24
.dbline 136
; X &= 0xF; //限制X不能大于15,Y不能大于1
mov R24,R12
andi R24,15
mov R12,R24
rjmp L32
L31:
.dbline 138
; while (DData[ListLength]!= '$') //若到达字串尾则退出
; {
.dbline 139
; if (X <= 0xF) //X坐标应小于0xF
ldi R24,15
cp R24,R12
brlo L34
.dbline 140
; {
.dbline 141
; DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R2,z+0
std y+0,R2
mov R18,R10
mov R16,R12
rcall _DisplayOneChar
.dbline 142
; ListLength++;
inc R20
.dbline 143
; X++;
inc R12
.dbline 144
; }
L34:
.dbline 145
L32:
.dbline 137
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R24,z+0
cpi R24,36
brne L31
.dbline -2
L30:
adiw R28,1
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r ListLength 20 c
.dbsym r DData 22 pc
.dbsym r Y 10 c
.dbsym r X 12 c
.dbend
.dbfunc e Writr0 _Writr0 fV
.even
_Writr0::
.dbline -1
.dbline 155
; }
; }
;
; /**********************************************************/
;
;
; /***************************************************************
; * 功能:主机向总线写0 *
; ***************************************************************/
; void Writr0(void)
; {
.dbline 156
; Set_DQ1;
sbi 0x14,3
.dbline 156
sbi 0x15,3
.dbline 156
.dbline 157
; Set_DQ0;
sbi 0x14,3
.dbline 157
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 157
.dbline 158
; delayus(700);
ldi R16,700
ldi R17,2
rcall _delayus
.dbline 160
;
; Set_DQ1;
sbi 0x14,3
.dbline 160
sbi 0x15,3
.dbline 160
.dbline 161
; asm("nop");
nop
.dbline 162
; delayus(15);
ldi R16,15
ldi R17,0
rcall _delayus
.dbline -2
L36:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Writr1 _Writr1 fV
.even
_Writr1::
.dbline -1
.dbline 169
; }
;
; /***************************************************************
; * 功能:主机向总线写1 *
; ***************************************************************/
; void Writr1(void)
; {
.dbline 170
; Set_DQ1;
sbi 0x14,3
.dbline 170
sbi 0x15,3
.dbline 170
.dbline 171
; Set_DQ0;
sbi 0x14,3
.dbline 171
in R24,0x15
andi R24,247
out 0x15,R24
.dbline 171
.dbline 172
; asm("nop");
nop
.dbline 173
; asm("nop");
nop
.dbline 174
; asm("nop");
nop
.dbline 175
; asm("nop");
nop
.dbline 176
; asm("nop");
nop
.dbline 177
; asm("nop");
nop
.dbline 178
; asm("nop");
nop
.dbline 179
; asm("nop");
nop
.dbline 180
; asm("nop");
nop
.dbline 181
; asm("nop");
nop
.dbline 182
; asm("nop");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -