📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\main.c
.dbfunc e delay_ms _delay_ms fV
; b -> R20
; i -> R16,R17
.even
_delay_ms::
xcall push_gset1
.dbline -1
.dbline 30
; /*
; 实验十六:
;
; DS18B20实验,动态LED数据管显示温度。
; 1、AVR单片机读取DS18B20实验,并通过学习板上在LED数码管显示温度。
; 2、晶振频率为内部1MHz。
; 3、DS18B20由PA7口实现单总线访问,实现读取温度。
; 4、低层驱动函数中带有中断保护,程序可直接用于商业产品中。
; 5、LED数码管显示采用定时器中断方式,全中断驱动,不需要主程序管理,
; 只要把要显示的内部放到显示缓存区就行了。
; 6、进行此实验请插上SPI短路块。
; 7、DS18B20的电源脚接到VCC及GND上面,数据线接到PF2口。
;
; AVR mega128学习板
; AVR_AFA
; www.iccavr.com
; 11:48 2007-10-170
; */
;
; #include "iom128v.h" /*包含相关头文件*/
; #include "ds1820.h"
; #include "led4.h"
;
; /*
; 延时函数
;
; 延时单位为:mS。
; CPU频率为:1MHz。
; */
; void delay_ms(unsigned int i) {
xjmp L3
L2:
.dbline 33
;
; unsigned char b;
; while (i --) {
.dbline 34
ldi R20,1
xjmp L8
L5:
.dbline 34
L6:
.dbline 34
inc R20
L8:
.dbline 34
tst R20
brne L5
.dbline 35
L3:
.dbline 33
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L2
tst R3
brne L2
X0:
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r b 20 c
.dbsym r i 16 i
.dbend
.dbfunc e io_init _io_init fV
.even
_io_init::
.dbline -1
.dbline 39
; for (b = 1; b; b++);
; }
; }
;
; /*IO口初始化函数*/
; void io_init(void) {
.dbline 41
;
; DDRA = 0x00; /*方向输入*/
clr R2
out 0x1a,R2
.dbline 42
; PORTA = 0xFF; /*打开上拉*/
ldi R24,255
out 0x1b,R24
.dbline 43
; DDRB = 0xFF; /*方向输出*/
out 0x17,R24
.dbline 44
; PORTB = 0xFF; /*输出高电平*/
out 0x18,R24
.dbline 45
; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
out 0x14,R2
.dbline 46
; PORTC = 0xFF;
out 0x15,R24
.dbline 47
; DDRD = 0x00;
out 0x11,R2
.dbline 48
; PORTD = 0xFF;
out 0x12,R24
.dbline 49
; DDRE = 0x00;
out 0x2,R2
.dbline 50
; PORTE = 0xFF;
out 0x3,R24
.dbline 51
; DDRF = 0x00;
sts 97,R2
.dbline 52
; PORTF = 0xFF;
sts 98,R24
.dbline 53
; DDRG = 0x00;
sts 100,R2
.dbline 54
; PORTG = 0xFF;
sts 101,R24
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.dbfunc e int_to_bcd _int_to_bcd fV
; i -> R20
; temp -> R22,R23
.even
_int_to_bcd::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 58
; }
;
; /*十六进制转十进制函数*/
; void int_to_bcd(unsigned int temp) {
.dbline 61
clr R20
xjmp L14
L11:
.dbline 61
.dbline 62
ldi R18,10
ldi R19,0
movw R16,R22
xcall mod16u
ldi R24,<_led_buf
ldi R25,>_led_buf
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 63
ldi R18,10
ldi R19,0
movw R16,R22
xcall div16u
movw R22,R16
.dbline 64
L12:
.dbline 61
inc R20
L14:
.dbline 61
; unsigned char i;
;
; for (i = 0; i < 4; i++) {
cpi R20,4
brlo L11
.dbline -2
L10:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r temp 22 i
.dbend
.dbfunc e main _main fV
; i -> R20,R21
.even
_main::
.dbline -1
.dbline 75
; led_buf[i] = temp % 10; /*提取当前变量最低位*/
; temp = temp / 10; /*去掉当前最低位值*/
; }
; }
;
; /*
; 主函数
;
; 实现系统的初始化操作。
; 周期性读取温度。
; 然后放入显示缓存区。
; 上面两个任务之间完全独立运行,方便移植。
; */
; void main(void) {
.dbline 79
;
; unsigned int i;
;
; io_init();
xcall _io_init
.dbline 80
; delay_ms(200);
ldi R16,200
ldi R17,0
xcall _delay_ms
.dbline 81
; ds1820_reset(); /*复位D18B20*/
xcall _ds1820_reset
.dbline 82
; disp_init(); /*启动显示任务*/
xcall _disp_init
.dbline 83
; led_buf[4] = 1; /*小数点位置*/
ldi R24,1
sts _led_buf+4,R24
xjmp L18
L17:
.dbline 84
.dbline 85
xcall _ds1820_start
.dbline 86
ldi R16,2000
ldi R17,7
xcall _delay_ms
.dbline 87
xcall _ds1820_read_temp
movw R20,R16
.dbline 88
ldi R16,10
ldi R17,0
movw R18,R20
xcall empy16s
movw R20,R16
lsr R21
ror R20
lsr R21
ror R20
lsr R21
ror R20
lsr R21
ror R20
.dbline 89
movw R16,R20
xcall _int_to_bcd
.dbline 90
L18:
.dbline 84
xjmp L17
X1:
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -