📄 ds18b20.lst
字号:
__start:
__text_start:
0055 E5CF LDI R28,0x5F
0056 E0D4 LDI R29,4
0057 BFCD OUT P3D,R28
0058 BFDE OUT P3E,R29
0059 51C0 SUBI R28,0x10
005A 40D0 SBCI R29,0
005B EA0A LDI R16,0xAA
005C 8308 STD R16,0+Y
005D 2400 CLR R0
005E E6E0 LDI R30,0x60
005F E0F0 LDI R31,0
0060 E010 LDI R17,0
0061 36E8 CPI R30,0x68
0062 07F1 CPC R31,R17
0063 F011 BEQ 0x0066
0064 9201 ST R0,Z+
0065 CFFB RJMP 0x0061
0066 8300 STD R16,0+Z
0067 EAEA LDI R30,0xAA
0068 E0F0 LDI R31,0
0069 E6A0 LDI R26,0x60
006A E0B0 LDI R27,0
006B E010 LDI R17,0
006C 3AEA CPI R30,0xAA
006D 07F1 CPC R31,R17
006E F021 BEQ 0x0073
006F 95C8 LPM
0070 9631 ADIW R30,1
0071 920D ST R0,X+
0072 CFF9 RJMP 0x006C
0073 940E01CC CALL _main
_exit:
0075 CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
0076 940E0496 CALL push_gset2
0078 01B8 MOVW R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0079 E005 LDI R16,5
007A E010 LDI R17,0
007B 019B MOVW R18,R22
007C 940E0298 CALL empy16s
007E 01B8 MOVW R22,R16
007F 9576 LSR R23
0080 9567 ROR R22
0081 9576 LSR R23
0082 9567 ROR R22
(0031) for( i=0;i<US;i++);
0083 2744 CLR R20
0084 2755 CLR R21
0085 C002 RJMP 0x0088
0086 5F4F SUBI R20,0xFF
0087 4F5F SBCI R21,0xFF
0088 1746 CP R20,R22
0089 0757 CPC R21,R23
008A F3D8 BCS 0x0086
(0032) }
008B 940E049E CALL pop_gset2
008D 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
008E 940E0496 CALL push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
0090 2744 CLR R20
0091 2755 CLR R21
0092 C00B RJMP 0x009E
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
0093 2766 CLR R22
0094 2777 CLR R23
0095 C002 RJMP 0x0098
0096 5F6F SUBI R22,0xFF
0097 4F7F SBCI R23,0xFF
0098 3765 CPI R22,0x75
0099 E0E4 LDI R30,4
009A 077E CPC R23,R30
009B F3D0 BCS 0x0096
009C 5F4F SUBI R20,0xFF
009D 4F5F SBCI R21,0xFF
009E 1740 CP R20,R16
009F 0751 CPC R21,R17
00A0 F390 BCS 0x0093
(0044) }
00A1 940E049E CALL pop_gset2
00A3 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
00A4 EF8F LDI R24,0xFF
00A5 BB8A OUT P1A,R24
(0054) DDRB=0xFF;
00A6 BB87 OUT P17,R24
(0055) DDRC=0xFF;
00A7 BB84 OUT P14,R24
(0056) DDRD=0xFF;
00A8 BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
00A9 2422 CLR R2
00AA B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
00AB 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
00AC 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
00AD 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
00AE BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
00AF 9ADA SBI P1B,2
(0065) Delayus(5);
00B0 E005 LDI R16,5
00B1 E010 LDI R17,0
00B2 DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
00B3 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
00B4 2422 CLR R2
00B5 BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
00B6 9ADB SBI P1B,3
(0070) Delayus(50);
00B7 E302 LDI R16,0x32
00B8 E010 LDI R17,0
00B9 DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
00BA 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
00BB EF8F LDI R24,0xFF
00BC BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
00BD 9ADC SBI P1B,4
(0075) Delayus(50);
00BE E302 LDI R16,0x32
00BF E010 LDI R17,0
00C0 DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
00C1 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
00C2 EF8F LDI R24,0xFF
00C3 BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
00C4 9ADF SBI P1B,7
(0080) Delayus(50);
00C5 E302 LDI R16,0x32
00C6 E010 LDI R17,0
00C7 DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
00C8 98DF CBI P1B,7
(0082)
(0083)
(0084) }
00C9 9508 RET
_One_smg_display:
number --> R20
data --> R22
00CA 940E0496 CALL push_gset2
00CC 2F42 MOV R20,R18
00CD 2F60 MOV R22,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\11_DS18B20\SMG.C
(0001) /*******************************************
(0002) 文件:SMG.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的数码管,滚动显示1、2、3、4、5、6
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012)
(0013) #pragma data:code
(0014) const SEGMENT[26]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
(0015) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
(0016) 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,
(0017) 0xff,0xef};
(0018)
(0019) /*******************************************
(0020) 函数名称: One_smg_display
(0021) 功 能: 指定的数码管显示指定的内容
(0022) 参 数: data--显示的内容(0-15)
(0023) number--指定的数码管(1-6)
(0024) 返回值 : 无
(0025) /********************************************/
(0026) void One_smg_display(uchar data,uchar number)
(0027) {
(0028) PORTB|=0x3F; //输出位选
00CE B388 IN R24,P18
00CF 638F ORI R24,0x3F
00D0 BB88 OUT P18,R24
(0029) PORTA|=BIT(BITLK); //更新位选
00D1 9ADC SBI P1B,4
(0030) Delayus(50); //调整时序
00D2 E302 LDI R16,0x32
00D3 E010 LDI R17,0
00D4 DFA1 RCALL _Delayus
(0031) PORTA&=~BIT(BITLK); //锁存位选
00D5 98DC CBI P1B,4
(0032)
(0033) PORTB=SEGMENT[data]; //输出段选
00D6 E082 LDI R24,2
00D7 9F86 MUL R24,R22
00D8 01F0 MOVW R30,R0
00D9 E680 LDI R24,0x60
00DA E090 LDI R25,0
00DB 0FE8 ADD R30,R24
00DC 1FF9 ADC R31,R25
00DD 9005 LD R0,R0
00DE 9014 LD R1,R1
00DF 01F0 MOVW R30,R0
00E0 BBE8 OUT P18,R30
(0034) PORTA|=BIT(SEGLK); //更新段选
00E1 9ADB SBI P1B,3
(0035) Delayus(50); //调整时序
00E2 E302 LDI R16,0x32
00E3 E010 LDI R17,0
00E4 DF91 RCALL _Delayus
(0036) PORTA&=~BIT(SEGLK); //锁存段选
00E5 98DB CBI P1B,3
(0037)
(0038) number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)
00E6 2F14 MOV R17,R20
00E7 5011 SUBI R17,1
00E8 E001 LDI R16,1
00E9 940E04C1 CALL lsl8
00EB 2F40 MOV R20,R16
00EC 9540 COM R20
(0039) PORTB=number; //输出位选
00ED BB48 OUT P18,R20
(0040) PORTA|=BIT(BITLK); //更新位选
00EE 9ADC SBI P1B,4
(0041) Delayus(50); //调整时序
00EF E302 LDI R16,0x32
00F0 E010 LDI R17,0
00F1 DF84 RCALL _Delayus
(0042) PORTA&=~BIT(BITLK); //锁存位选
00F2 98DC CBI P1B,4
(0043) }
00F3 940E049E CALL pop_gset2
00F5 9508 RET
_All_smg_display:
i --> R20
pdata --> R22
00F6 940E0496 CALL push_gset2
00F8 01B8 MOVW R22,R16
(0044) /*******************************************
(0045) 函数名称: All_smg_display
(0046) 功 能: 6个数码管显示指定的内容
(0047) 参 数: *pdata--显示内容数组地址
(0048) 返回值 : 无
(0049) /********************************************/
(0050) void All_smg_display(uchar *pdata)
(0051) {
(0052) uchar i;
(0053) for(i=0;i<6;i++)
00F9 2744 CLR R20
00FA C00C RJMP 0x0107
(0054) {
(0055) One_smg_display(pdata[i],i+1);
00FB 2F24 MOV R18,R20
00FC 5F2F SUBI R18,0xFF
00FD 2FE4 MOV R30,R20
00FE 27FF CLR R31
00FF 0FE6 ADD R30,R22
0100 1FF7 ADC R31,R23
0101 8100 LDD R16,0+Z
0102 DFC7 RCALL _One_smg_display
(0056) Delayms(1);
0103 E001 LDI R16,1
0104 E010 LDI R17,0
0105 DF88 RCALL _Delayms
0106 9543 INC R20
0107 3046 CPI R20,6
0108 F390 BCS 0x00FB
(0057) }
(0058) }
0109 940E049E CALL pop_gset2
010B 9508 RET
_Cycle_smg_display:
i --> R20
j --> R10
pdata --> R22
010C 940E049A CALL push_gset3
010E 01B8 MOVW R22,R16
(0059) /*******************************************
(0060) 函数名称: Cycle_smg_display
(0061) 功 能: 6个数码管从右向左循环滚动显示指定的内容(循环一次)
(0062) 参 数: *pdata--显示内容数组地址
(0063) 返回值 : 无
(0064) /********************************************/
(0065) void Cycle_smg_display(uchar *pdata)
(0066) {
(0067) uchar i,j;
(0068) for(i=0;i<240;i++) //共滚动6次,每次内容显示40个循环
010F 2744 CLR R20
0110 C02B RJMP 0x013C
(0069) {
(0070) for(j=0;j<6;j++) //扫描6个数码管
0111 24AA CLR R10
0112 C025 RJMP 0x0138
(0071) {
(0072) One_smg_display(pdata[(i/40+j)%6],j+1);//显示
0113 2D2A MOV R18,R10
0114 5F2F SUBI R18,0xFF
0115 E288 LDI R24,0x28
0116 E090 LDI R25,0
0117 2F04 MOV R16,R20
0118 2711 CLR R17
0119 932F PUSH R18
011A 933F PUSH R19
011B 019C MOVW R18,R24
011C 940E027D CALL div16s
011E 0118 MOVW R2,R16
011F 913F POP R19
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -