?? ds18b20_main.s
字號:
.even
_readdata::
st -y,R10
.dbline -1
.dbline 101
; }
;
;
; //讀數據
; uchar readdata(void)
; {
.dbline 103
; uchar temp;
; busy();
xcall _busy
.dbline 104
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 105
; PORTA|=(1<<RS); //RS=1
sbi 0x1b,5
.dbline 106
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 107
; PORTA|=(1<<RW); //RW=1
sbi 0x1b,6
.dbline 108
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 109
; PORTA|=(1<<EN); //EN=1
sbi 0x1b,7
.dbline 110
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 111
; DDRD=0x00; //A端口變輸入
clr R2
out 0x11,R2
.dbline 112
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 113
; temp = PIND; //讀A端口
in R10,0x10
.dbline 114
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 115
; DDRD=0xff; //A端口變輸出
ldi R24,255
out 0x11,R24
.dbline 116
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 117
; PORTA&=~(1<<EN); //EN=0
cbi 0x1b,7
.dbline 118
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 119
; return temp;
mov R16,R10
.dbline -2
L50:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r temp 10 c
.dbend
.dbfunc e WriteCGRAM _WriteCGRAM fV
; t -> R10,R11
; i -> R20,R21
; pBuffer -> R22,R23
; num -> R10,R11
.even
_WriteCGRAM::
xcall push_xgsetF00C
movw R22,R18
movw R10,R16
.dbline -1
.dbline 129
; }
;
; //=================================================
; // 描述: 寫LCD內部CGRAM函數
; // 入口: ‘num’要寫的數據個數
; // ‘pbuffer’要寫的數據的首地址
; // 出口: 無
; //================================================
; void WriteCGRAM(uint num, const uint *pBuffer)
; {
.dbline 131
; uint i,t;
; writecom(0x40);
ldi R16,64
xcall _writecom
.dbline 132
; PORTA|=(1<<RS);
sbi 0x1b,5
.dbline 133
; PORTA&=~(1<<RW);
cbi 0x1b,6
.dbline 134
; for(i=num;i!=0;i--)
movw R20,R10
xjmp L55
L52:
.dbline 135
; {
.dbline 136
; t = *pBuffer;
movw R30,R22
ldd R10,z+0
ldd R11,z+1
.dbline 137
; PORTA|=(1<<EN);
sbi 0x1b,7
.dbline 138
; PORTD = t;
out 0x12,R10
.dbline 139
; PORTA&=~(1<<EN);
cbi 0x1b,7
.dbline 140
; pBuffer++;
subi R22,254 ; offset = 2
sbci R23,255
.dbline 141
; }
L53:
.dbline 134
subi R20,1
sbci R21,0
L55:
.dbline 134
cpi R20,0
cpc R20,R21
brne L52
X12:
.dbline -2
L51:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r t 10 i
.dbsym r i 20 i
.dbsym r pBuffer 22 pki
.dbsym r num 10 i
.dbend
.dbfunc e WriteMenu _WriteMenu fV
; t -> R10
; i -> R22
; pBuffer -> R20,R21
.even
_WriteMenu::
xcall push_xgsetF00C
movw R20,R16
.dbline -1
.dbline 151
;
; }
;
; //=================================================
; //描述:寫菜單函數,本程序使用的LCD規格為 16 * 2
; //入口:菜單數組首地址
; //出口:無
; //=================================================
; void WriteMenu(const uchar *pBuffer)
; {
.dbline 153
; uchar i,t;
; writecom(0x80); //數據地址
ldi R16,128
xcall _writecom
.dbline 155
;
; PORTA|=(1<<RS);
sbi 0x1b,5
.dbline 156
; PORTA&=~(1<<RW);
cbi 0x1b,6
.dbline 157
; s_ms(50);
ldi R16,50
ldi R17,0
xcall _s_ms
.dbline 158
; for(i=0;i<16;i++)
clr R22
xjmp L60
L57:
.dbline 159
; {
.dbline 160
; t = *pBuffer;
movw R30,R20
ldd R10,z+0
.dbline 161
; PORTD = t;
out 0x12,R10
.dbline 162
; PORTA|=(1<<EN);
sbi 0x1b,7
.dbline 163
; s_ms(50);
ldi R16,50
ldi R17,0
xcall _s_ms
.dbline 164
; PORTA&=~(1<<EN);
cbi 0x1b,7
.dbline 165
; pBuffer++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 166
; }
L58:
.dbline 158
inc R22
L60:
.dbline 158
cpi R22,16
brlo L57
X13:
.dbline 167
; writecom(0xC0);
ldi R16,192
xcall _writecom
.dbline 169
;
; PORTA|=(1<<RS);
sbi 0x1b,5
.dbline 170
; PORTA&=~(1<<RW);
cbi 0x1b,6
.dbline 171
; s_ms(50);
ldi R16,50
ldi R17,0
xcall _s_ms
.dbline 172
; for(i=0;i<16;i++)
clr R22
xjmp L64
L61:
.dbline 173
; {
.dbline 174
; t = *pBuffer;
movw R30,R20
ldd R10,z+0
.dbline 175
; PORTD = t;
out 0x12,R10
.dbline 176
; PORTA|=(1<<EN);
sbi 0x1b,7
.dbline 177
; s_ms(50);
ldi R16,50
ldi R17,0
xcall _s_ms
.dbline 178
; PORTA&=~(1<<EN);
cbi 0x1b,7
.dbline 179
; pBuffer++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 180
; }
L62:
.dbline 172
inc R22
L64:
.dbline 172
cpi R22,16
brlo L61
X14:
.dbline -2
L56:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r t 10 c
.dbsym r i 22 c
.dbsym r pBuffer 20 pkc
.dbend
.dbfunc e WriteNum _WriteNum fV
; num -> R20,R21
; col -> R10,R11
; row -> R22,R23
.even
_WriteNum::
xcall push_xgsetF00C
movw R10,R18
movw R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 190
; }
; //====================================================
; // 描述:在任意位置寫數字函數
; // 入口:’row‘表示要寫數字所在的行地址,只能為1或2
; // ’col‘表示要寫數字所在的列地址,只能為0--15
; // ‘num’表示要寫的數字,只能為0--9
; // 出口:無
; //===================================================
; void WriteNum(uint row,uint col,uint num)
; {
.dbline 191
; if (row == 1) row = 0x80 + col;
cpi R22,1
ldi R30,0
cpc R23,R30
brne L66
X15:
.dbline 191
movw R22,R10
subi R22,128 ; offset = 128
sbci R23,255
xjmp L67
L66:
.dbline 192
; else row = 0xC0 + col;
movw R22,R10
subi R22,64 ; offset = 192
sbci R23,255
L67:
.dbline 193
; writecom(row);
mov R16,R22
xcall _writecom
.dbline 194
; if (num<=0 | num>9) num =0x30;
cpi R20,0
cpc R20,R21
brne L70
X16:
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L71
L70:
clr R10
clr R11
L71:
ldi R24,9
ldi R25,0
cp R24,R20
cpc R25,R21
brsh L72
X17:
ldi R22,1
ldi R23,0
xjmp L73
L72:
clr R22
clr R23
L73:
movw R2,R10
or R2,R22
or R3,R23
tst R2
brne X18
tst R3
breq L68
X18:
.dbline 194
ldi R20,48
ldi R21,0
xjmp L69
L68:
.dbline 195
; else num = 0x30 + num;
subi R20,208 ; offset = 48
sbci R21,255
L69:
.dbline 197
;
; PORTA|=(1<<RS);
sbi 0x1b,5
.dbline 198
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 199
; PORTA&=~(1<<RW);
cbi 0x1b,6
.dbline 200
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 201
; PORTD = num;
out 0x12,R20
.dbline 202
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 203
; PORTA|=(1<<EN);
sbi 0x1b,7
.dbline 204
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 205
; PORTA&=~(1<<EN);
cbi 0x1b,7
.dbline 206
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline -2
L65:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r num 20 i
.dbsym r col 10 i
.dbsym r row 22 i
.dbend
.dbfunc e WriteChar _WriteChar fV
; t -> R12
; i -> R10
; pBuffer -> R20,R21
; num -> y+8
; col -> R10
; row -> R22
.even
_WriteChar::
xcall push_xgsetF03C
mov R10,R18
mov R22,R16
ldd R20,y+10
ldd R21,y+11
.dbline -1
.dbline 216
; }
; //================================================================
; // 描述:在任意位置寫任意多個字符
; // 入口:’row‘要寫的字符所在的行,只能為1或2;
; // ‘col’要寫的字符所在的列,只能為0---15
; // ‘num’要寫字符的個數
; // ‘pbuffer’要寫字符的首地址
; //==================================================================
; void WriteChar(uchar row,uchar col,uint num,uchar *pBuffer)
; {
.dbline 218
; uchar i,t;
; if (row == 1) row = 0x80 + col;
cpi R22,1
brne L75
X19:
.dbline 218
mov R22,R10
subi R22,128 ; addi 128
xjmp L76
L75:
.dbline 219
; else row = 0xC0 + col;
mov R22,R10
subi R22,64 ; addi 192
L76:
.dbline 220
; writecom(row);
mov R16,R22
xcall _writecom
.dbline 224
; //if (num<=0 | num>9) num =0x30;
; //else num = 0x30 + num;
;
; PORTA|=(1<<RS);
sbi 0x1b,5
.dbline 225
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 226
; PORTA&=~(1<<RW);
cbi 0x1b,6
.dbline 227
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 228
; for(i=num;i!=0;i--)
ldd R10,y+8
ldd R11,y+9
xjmp L80
L77:
.dbline 229
; {
.dbline 230
; t = *pBuffer;
movw R30,R20
ldd R12,z+0
.dbline 231
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 232
; PORTD = t;
out 0x12,R12
.dbline 233
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 234
; PORTA|=(1<<EN);
sbi 0x1b,7
.dbline 235
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 236
; PORTA&=~(1<<EN);
cbi 0x1b,7
.dbline 237
; s_ms(500);
ldi R16,500
ldi R17,1
xcall _s_ms
.dbline 238
; pBuffer++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 239
; }
L78:
.dbline 228
dec R10
L80:
.dbline 228
tst R10
brne L77
X20:
.dbline -2
L74:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym r t 12 c
.dbsym r i 10 c
.dbsym r pBuffer 20 pc
.dbsym l num 8 i
.dbsym r col 10 c
.dbsym r row 22 c
.dbend
.area data(ram, con, rel)
.dbfile E:\單片機\16實驗程序\DS18B20\DS18B20\1602.h
_adc_0::
.blkb 13
.area idata
.byte 'T,'e,'m,'p,'e,'r,'a,'t,'u,'r,'e,58,0
.area data(ram, con, rel)
.dbfile E:\單片機\16實驗程序\DS18B20\DS18B20\1602.h
.dbfile E:\單片機\16實驗程序\DS18B20\DS18B20\DS18B20_main.c
.dbsym e adc_0 _adc_0 A[13:13]c
_adc_1::
.blkb 2
.area idata
.byte 223,'C
.area data(ram, con, rel)
.dbfile E:\單片機\16實驗程序\DS18B20\DS18B20\DS18B20_main.c
.dbsym e adc_1 _adc_1 A[2:2]c
.area text(rom, con, rel)
.dbfile E:\單片機\16實驗程序\DS18B20\DS18B20\DS18B20_main.c
.dbfunc e s_1ms _s_1ms fV
; aa -> R20,R21
; ms -> R16,R17
.even
_s_1ms::
st -y,R20
st -y,R21
.dbline -1
.dbline 14
; //溫度傳感器DS18B20試驗
; //間隔2s采集一次溫度值
; //使用1602的液晶作為顯示
; #include <iom16v.h>
; #include <macros.h>
; #include "18B20.h"
; #include "1602.h"
;
; uchar adc_0[]={"Temperature:"};
; uchar adc_1[]={0xdf,0x43}; //溫度ascii代碼
;
; //延時函數在16M時延時1ms
; void s_1ms(unsigned int ms)
; {
.dbline 16
; unsigned int aa;
; for(;ms>=1;ms--)
xjmp L85
L82:
.dbline 17
; {
.dbline 18
; for(aa=0;aa<=2000;aa++)
clr R20
clr R21
xjmp L89
L86:
.dbline 19
; {;}
.dbline 19
.dbline 19
L87:
.dbline 18
subi R20,255 ; offset = 1
sbci R21,255
L89:
.dbline 18
ldi R24,2000
ldi R25,7
cp R24,R20
cpc R25,R21
brsh L86
X21:
.dbline 20
; }
L83:
.dbline 16
subi R16,1
sbci R17,0
L85:
.dbline 16
cpi R16,1
ldi R30,0
cpc R17,R30
brsh L82
X22:
.dbline -2
L81:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r aa 20 i
.dbsym r ms 16 i
.dbend
.dbfunc e main _main fV
; tem3 -> <dead>
; tem1 -> R10,R11
; tem2 -> R12,R13
; i -> R10,R11
.even
_main::
sbiw R28,4
.dbline -1
.dbline 25
; }
;
;
; void main()
; {
.dbline 28
; unsigned int i,tem3,tem2,tem1;
; //端口初始化
; DDRA = 0xff;
ldi R24,255
out 0x1a,R24
.dbline 29
; PORTA = 0x00;
clr R2
out 0x1b,R2
.dbline 30
; DDRB = 0xFF;
out 0x17,R24
.dbline 31
; PORTB = 0xF0;
ldi R24,240
out 0x18,R24
.dbline 32
; DDRC = 0x00;
out 0x14,R2
.dbline 33
; PORTC = 0xFF;
ldi R24,255
out 0x15,R24
.dbline 34
; DDRD = 0xff;
out 0x11,R24
.dbline 35
; PORTD = 0xff;
out 0x12,R24
.dbline 38
;
; //延時200ms
; s_1ms(200);
ldi R16,200
ldi R17,0
xcall _s_1ms
.dbline 40
; //DS18B20復位
; ds1820_reset();
xcall _ds1820_reset
.dbline 42
; //1602 初始化
; LcdInit();
xcall _LcdInit
.dbline 43
; WriteChar(1,0,12,adc_0);
ldi R24,<_adc_0
ldi R25,>_adc_0
std y+3,R25
std y+2,R24
ldi R24,12
ldi R25,0
std y+1,R25
std y+0,R24
clr R18
ldi R16,1
xcall _WriteChar
.dbline 44
; WriteChar(1,14,2,adc_1);
ldi R24,<_adc_1
ldi R25,>_adc_1
std y+3,R25
std y+2,R24
ldi R24,2
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,14
ldi R16,1
xcall _WriteChar
xjmp L92
L91:
.dbline 47
;
; while (1)
; {
.dbline 49
; //進行一次轉換
; ds1820_start();
xcall _ds1820_start
.dbline 50
; s_1ms(1000);
ldi R16,1000
ldi R17,3
xcall _s_1ms
.dbline 51
; i = ds1820_read_temp(); //讀取溫度數值
xcall _ds1820_read_temp
movw R10,R16
.dbline 52
; i = (i * 10) / 16; //數值處理 數值*0.625
ldi R16,10
ldi R17,0
movw R18,R10
xcall empy16s
movw R10,R16
lsr R11
ror R10
lsr R11
ror R10
lsr R11
ror R10
lsr R11
ror R10
.dbline 54
; //第3位沒有顯示
; i = i % 1000;
ldi R18,1000
ldi R19,3
movw R16,R10
xcall mod16u
movw R10,R16
.dbline 56
; //顯示第2位
; tem2= i / 100;
ldi R18,100
ldi R19,0
xcall div16u
movw R12,R16
.dbline 57
; WriteNum(1,12,tem2);
std y+1,R13
std y+0,R12
ldi R18,12
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 58
; i = i % 100;
ldi R18,100
ldi R19,0
movw R16,R10
xcall mod16u
.dbline 60
; //顯示第1位
; tem1= i / 10;
ldi R18,10
ldi R19,0
xcall div16u
movw R10,R16
.dbline 61
; WriteNum(1,13,tem1);
std y+1,R11
std y+0,R10
ldi R18,13
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 62
; }
L92:
.dbline 46
xjmp L91
X23:
.dbline -2
L90:
.dbline 0 ; func end
adiw R28,4
ret
.dbsym l tem3 5 i
.dbsym r tem1 10 i
.dbsym r tem2 12 i
.dbsym r i 10 i
.dbend
.area bss(ram, con, rel)
.dbfile E:\單片機\16實驗程序\DS18B20\DS18B20\DS18B20_main.c
_init_f::
.blkb 1
.dbfile E:\單片機\16實驗程序\DS18B20\DS18B20\18B20.h
.dbsym e init_f _init_f c
; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -