📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\main.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; b -> R20
0000 ; i -> R16,R17
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 30
0004 ; /*
0004 ; 实验十六:
0004 ;
0004 ; DS18B20实验,动态LED数据管显示温度。
0004 ; 1、AVR单片机读取DS18B20实验,并通过学习板上在LED数码管显示温度。
0004 ; 2、晶振频率为内部1MHz。
0004 ; 3、DS18B20由PA7口实现单总线访问,实现读取温度。
0004 ; 4、低层驱动函数中带有中断保护,程序可直接用于商业产品中。
0004 ; 5、LED数码管显示采用定时器中断方式,全中断驱动,不需要主程序管理,
0004 ; 只要把要显示的内部放到显示缓存区就行了。
0004 ; 6、进行此实验请插上SPI短路块。
0004 ; 7、DS18B20的电源脚接到VCC及GND上面,数据线接到PF2口。
0004 ;
0004 ; AVR mega128学习板
0004 ; AVR_AFA
0004 ; www.iccavr.com
0004 ; 11:48 2007-10-170
0004 ; */
0004 ;
0004 ; #include "iom128v.h" /*包含相关头文件*/
0004 ; #include "ds1820.h"
0004 ; #include "led4.h"
0004 ;
0004 ; /*
0004 ; 延时函数
0004 ;
0004 ; 延时单位为:mS。
0004 ; CPU频率为:1MHz。
0004 ; */
0004 ; void delay_ms(unsigned int i) {
0004 05C0 xjmp L3
0006 L2:
0006 .dbline 33
0006 ;
0006 ; unsigned char b;
0006 ; while (i --) {
0006 .dbline 34
0006 41E0 ldi R20,1
0008 01C0 xjmp L8
000A L5:
000A .dbline 34
000A L6:
000A .dbline 34
000A 4395 inc R20
000C L8:
000C .dbline 34
000C 4423 tst R20
000E E9F7 brne L5
0010 .dbline 35
0010 L3:
0010 .dbline 33
0010 1801 movw R2,R16
0012 0150 subi R16,1
0014 1040 sbci R17,0
0016 2220 tst R2
0018 B1F7 brne L2
001A 3320 tst R3
001C A1F7 brne L2
001E X0:
001E .dbline -2
001E L1:
001E 0E940000 xcall pop_gset1
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbsym r b 20 c
0024 .dbsym r i 16 i
0024 .dbend
0024 .dbfunc e io_init _io_init fV
.even
0024 _io_init::
0024 .dbline -1
0024 .dbline 39
0024 ; for (b = 1; b; b++);
0024 ; }
0024 ; }
0024 ;
0024 ; /*IO口初始化函数*/
0024 ; void io_init(void) {
0024 .dbline 41
0024 ;
0024 ; DDRA = 0x00; /*方向输入*/
0024 2224 clr R2
0026 2ABA out 0x1a,R2
0028 .dbline 42
0028 ; PORTA = 0xFF; /*打开上拉*/
0028 8FEF ldi R24,255
002A 8BBB out 0x1b,R24
002C .dbline 43
002C ; DDRB = 0xFF; /*方向输出*/
002C 87BB out 0x17,R24
002E .dbline 44
002E ; PORTB = 0xFF; /*输出高电平*/
002E 88BB out 0x18,R24
0030 .dbline 45
0030 ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
0030 24BA out 0x14,R2
0032 .dbline 46
0032 ; PORTC = 0xFF;
0032 85BB out 0x15,R24
0034 .dbline 47
0034 ; DDRD = 0x00;
0034 21BA out 0x11,R2
0036 .dbline 48
0036 ; PORTD = 0xFF;
0036 82BB out 0x12,R24
0038 .dbline 49
0038 ; DDRE = 0x00;
0038 22B8 out 0x2,R2
003A .dbline 50
003A ; PORTE = 0xFF;
003A 83B9 out 0x3,R24
003C .dbline 51
003C ; DDRF = 0x00;
003C 20926100 sts 97,R2
0040 .dbline 52
0040 ; PORTF = 0xFF;
0040 80936200 sts 98,R24
0044 .dbline 53
0044 ; DDRG = 0x00;
0044 20926400 sts 100,R2
0048 .dbline 54
0048 ; PORTG = 0xFF;
0048 80936500 sts 101,R24
004C .dbline -2
004C L9:
004C .dbline 0 ; func end
004C 0895 ret
004E .dbend
004E .dbfunc e int_to_bcd _int_to_bcd fV
004E ; i -> R20
004E ; temp -> R22,R23
.even
004E _int_to_bcd::
004E 0E940000 xcall push_gset2
0052 B801 movw R22,R16
0054 .dbline -1
0054 .dbline 58
0054 ; }
0054 ;
0054 ; /*十六进制转十进制函数*/
0054 ; void int_to_bcd(unsigned int temp) {
0054 .dbline 61
0054 4427 clr R20
0056 13C0 xjmp L14
0058 L11:
0058 .dbline 61
0058 .dbline 62
0058 2AE0 ldi R18,10
005A 30E0 ldi R19,0
005C 8B01 movw R16,R22
005E 0E940000 xcall mod16u
0062 80E0 ldi R24,<_led_buf
0064 90E0 ldi R25,>_led_buf
0066 E42F mov R30,R20
0068 FF27 clr R31
006A E80F add R30,R24
006C F91F adc R31,R25
006E 0083 std z+0,R16
0070 .dbline 63
0070 2AE0 ldi R18,10
0072 30E0 ldi R19,0
0074 8B01 movw R16,R22
0076 0E940000 xcall div16u
007A B801 movw R22,R16
007C .dbline 64
007C L12:
007C .dbline 61
007C 4395 inc R20
007E L14:
007E .dbline 61
007E ; unsigned char i;
007E ;
007E ; for (i = 0; i < 4; i++) {
007E 4430 cpi R20,4
0080 58F3 brlo L11
0082 .dbline -2
0082 L10:
0082 0E940000 xcall pop_gset2
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r i 20 c
0088 .dbsym r temp 22 i
0088 .dbend
0088 .dbfunc e main _main fV
0088 ; i -> R20,R21
.even
0088 _main::
0088 .dbline -1
0088 .dbline 75
0088 ; led_buf[i] = temp % 10; /*提取当前变量最低位*/
0088 ; temp = temp / 10; /*去掉当前最低位值*/
0088 ; }
0088 ; }
0088 ;
0088 ; /*
0088 ; 主函数
0088 ;
0088 ; 实现系统的初始化操作。
0088 ; 周期性读取温度。
0088 ; 然后放入显示缓存区。
0088 ; 上面两个任务之间完全独立运行,方便移植。
0088 ; */
0088 ; void main(void) {
0088 .dbline 79
0088 ;
0088 ; unsigned int i;
0088 ;
0088 ; io_init();
0088 CDDF xcall _io_init
008A .dbline 80
008A ; delay_ms(200);
008A 08EC ldi R16,200
008C 10E0 ldi R17,0
008E B8DF xcall _delay_ms
0090 .dbline 81
0090 ; ds1820_reset(); /*复位D18B20*/
0090 0E940000 xcall _ds1820_reset
0094 .dbline 82
0094 ; disp_init(); /*启动显示任务*/
0094 0E940000 xcall _disp_init
0098 .dbline 83
0098 ; led_buf[4] = 1; /*小数点位置*/
0098 81E0 ldi R24,1
009A 80930400 sts _led_buf+4,R24
009E 18C0 xjmp L18
00A0 L17:
00A0 .dbline 84
00A0 .dbline 85
00A0 0E940000 xcall _ds1820_start
00A4 .dbline 86
00A4 00ED ldi R16,2000
00A6 17E0 ldi R17,7
00A8 ABDF xcall _delay_ms
00AA .dbline 87
00AA 0E940000 xcall _ds1820_read_temp
00AE A801 movw R20,R16
00B0 .dbline 88
00B0 0AE0 ldi R16,10
00B2 10E0 ldi R17,0
00B4 9A01 movw R18,R20
00B6 0E940000 xcall empy16s
00BA A801 movw R20,R16
00BC 5695 lsr R21
00BE 4795 ror R20
00C0 5695 lsr R21
00C2 4795 ror R20
00C4 5695 lsr R21
00C6 4795 ror R20
00C8 5695 lsr R21
00CA 4795 ror R20
00CC .dbline 89
00CC 8A01 movw R16,R20
00CE BFDF xcall _int_to_bcd
00D0 .dbline 90
00D0 L18:
00D0 .dbline 84
00D0 E7CF xjmp L17
00D2 X1:
00D2 .dbline -2
00D2 L15:
00D2 .dbline 0 ; func end
00D2 0895 ret
00D4 .dbsym r i 20 i
00D4 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -