⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 16ds18b20.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0040) 
(0041) 	DDRA = 0x00;										/*方向输入*/
_io_init:
    0158 2422      CLR	R2
    0159 BA2A      OUT	0x1A,R2
(0042) 	PORTA = 0xFF;										/*打开上拉*/
    015A EF8F      LDI	R24,0xFF
    015B BB8B      OUT	0x1B,R24
(0043) 	DDRB = 0xFF;										/*方向输出*/
    015C BB87      OUT	0x17,R24
(0044) 	PORTB = 0xFF;										/*输出高电平*/
    015D BB88      OUT	0x18,R24
(0045) 	DDRC = 0x00;										/*不用的IO口建议设置为输入带上拉*/
    015E BA24      OUT	0x14,R2
(0046) 	PORTC = 0xFF;
    015F BB85      OUT	0x15,R24
(0047) 	DDRD = 0x00;
    0160 BA21      OUT	0x11,R2
(0048) 	PORTD = 0xFF;
    0161 BB82      OUT	0x12,R24
(0049) 	DDRE = 0x00;
    0162 B822      OUT	0x02,R2
(0050) 	PORTE = 0xFF;
    0163 B983      OUT	0x03,R24
(0051) 	DDRF = 0x00;
    0164 92200061  STS	0x61,R2
(0052) 	PORTF = 0xFF;
    0166 93800062  STS	0x62,R24
(0053) 	DDRG = 0x00;
    0168 92200064  STS	0x64,R2
(0054) 	PORTG = 0xFF;
    016A 93800065  STS	0x65,R24
    016C 9508      RET
_int_to_bcd:
  i                    --> R20
  temp                 --> R22
    016D 940E026E  CALL	push_gset2
    016F 01B8      MOVW	R22,R16
(0055) }
(0056) 
(0057) /*十六进制转十进制函数*/
(0058) void int_to_bcd(unsigned int temp) { 
(0059) 	unsigned char i;
(0060) 
(0061) 	for (i = 0; i < 4; i++) {
    0170 2744      CLR	R20
    0171 C013      RJMP	0x0185
(0062) 	led_buf[i] = temp % 10;								/*提取当前变量最低位*/
    0172 E02A      LDI	R18,0xA
    0173 E030      LDI	R19,0
    0174 018B      MOVW	R16,R22
    0175 940E0221  CALL	mod16u
    0177 E180      LDI	R24,0x10
    0178 E091      LDI	R25,1
    0179 2FE4      MOV	R30,R20
    017A 27FF      CLR	R31
    017B 0FE8      ADD	R30,R24
    017C 1FF9      ADC	R31,R25
    017D 8300      STD	Z+0,R16
(0063) 	temp = temp / 10;									/*去掉当前最低位值*/
    017E E02A      LDI	R18,0xA
    017F E030      LDI	R19,0
    0180 018B      MOVW	R16,R22
    0181 940E0223  CALL	div16u
    0183 01B8      MOVW	R22,R16
    0184 9543      INC	R20
    0185 3044      CPI	R20,4
    0186 F358      BCS	0x0172
    0187 940E0265  CALL	pop_gset2
    0189 9508      RET
(0064)     }
(0065) }
(0066) 
(0067) /*
(0068) 主函数
(0069) 
(0070) 实现系统的初始化操作。
(0071) 周期性读取温度。
(0072) 然后放入显示缓存区。
(0073) 上面两个任务之间完全独立运行,方便移植。
(0074) */
(0075) void main(void) {
(0076) 
(0077) 	unsigned int i;
(0078) 
(0079) 	io_init();
_main:
  i                    --> R20
    018A DFCD      RCALL	_io_init
(0080) 	delay_ms(200);
    018B EC08      LDI	R16,0xC8
    018C E010      LDI	R17,0
    018D DFB8      RCALL	_delay_ms
(0081) 	ds1820_reset();										/*复位D18B20*/
    018E 940E007F  CALL	_ds1820_reset
(0082) 	disp_init();										/*启动显示任务*/
    0190 940E01B0  CALL	_disp_init
(0083) 	led_buf[4] = 1;										/*小数点位置*/
    0192 E081      LDI	R24,1
    0193 93800114  STS	0x114,R24
    0195 C018      RJMP	0x01AE
(0084) 	while (1) {
(0085) 		ds1820_start();									/*启动一次转换*/
    0196 940E011C  CALL	_ds1820_start
(0086) 		delay_ms(2000);									/*等待转换结束*/
    0198 ED00      LDI	R16,0xD0
    0199 E017      LDI	R17,7
    019A DFAB      RCALL	_delay_ms
(0087) 		i = ds1820_read_temp();							/*读取温度数值*/
    019B 940E0122  CALL	_ds1820_read_temp
    019D 01A8      MOVW	R20,R16
(0088) 		i = (i * 10) / 16;								/*数值处理*/
    019E E00A      LDI	R16,0xA
    019F E010      LDI	R17,0
    01A0 019A      MOVW	R18,R20
    01A1 940E0255  CALL	empy16s
    01A3 01A8      MOVW	R20,R16
    01A4 9556      LSR	R21
    01A5 9547      ROR	R20
    01A6 9556      LSR	R21
    01A7 9547      ROR	R20
    01A8 9556      LSR	R21
    01A9 9547      ROR	R20
    01AA 9556      LSR	R21
    01AB 9547      ROR	R20
(0089) 		int_to_bcd(i);									/*整值分解*/
    01AC 018A      MOVW	R16,R20
    01AD DFBF      RCALL	_int_to_bcd
    01AE CFE7      RJMP	0x0196
    01AF 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\LED4.C
(0001) /*
(0002) 模块说明:
(0003) 
(0004) 	LED数码管中断动态显示程序。
(0005) 	1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0006) 	2、动态调度由片内定时器1中断产生,中断周期为5mS。
(0007) 	3、内部1 M晶振,程序采用单任务方式,软件延时。
(0008) 	4、此模块文件为使用文件,可直接用于项目中。
(0009) 	www.iccavr.com 阿发
(0010) 	
(0011) */
(0012) #include "iom128v.h"
(0013) #include <macros.h>
(0014) 
(0015) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
(0016) 
(0017) /*
(0018) 前4位为显示数值。
(0019) 最后一位为小数点显示位置。
(0020) */
(0021) unsigned char led_buf[] = {0, 0, 0, 0, 1};	/*显示信息*/
(0022) 
(0023) /*------------------------------------------------------------------*-
(0024) 
(0025) 	 Disp_Init()
(0026) 	 显示初始化
(0027) 
(0028) -*------------------------------------------------------------------*/
(0029) void disp_init(void) {
(0030) 
(0031) 	/*初始化定时器*/
(0032) 	OCR1A = 625;							/*计数周期为5mS,F=1M*/
_disp_init:
    01B0 E781      LDI	R24,0x71
    01B1 E092      LDI	R25,2
    01B2 BD9B      OUT	0x2B,R25
    01B3 BD8A      OUT	0x2A,R24
(0033) 	TIMSK |= (1 << OCIE1A);					/*比较中断A允许*/
    01B4 B787      IN	R24,0x37
    01B5 6180      ORI	R24,0x10
    01B6 BF87      OUT	0x37,R24
(0034) 	TCCR1A = 0x00;
    01B7 2422      CLR	R2
    01B8 BC2F      OUT	0x2F,R2
(0035) 	TCCR1B = (1 << WGM12);					/*定时器工作在CTC计数器模式*/
    01B9 E088      LDI	R24,0x8
    01BA BD8E      OUT	0x2E,R24
(0036) 	TCCR1B |= (1 << CS11);					/*设置定时器的分频值为8分频*/
    01BB B58E      IN	R24,0x2E
    01BC 6082      ORI	R24,2
    01BD BD8E      OUT	0x2E,R24
(0037) 	
(0038) 	/*SPI接口初始化*/
(0039) 	
(0040) 	DDRB = 0xFF;							/* 设置PB口为输出*/
    01BE EF8F      LDI	R24,0xFF
    01BF BB87      OUT	0x17,R24
(0041) 	SPCR = (1<<SPE) | (1<<MSTR)
    01C0 E583      LDI	R24,0x53
    01C1 B98D      OUT	0x0D,R24
(0042) 		| (1<<SPR1) | (1<<SPR0);			/* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0043) 	
(0044) 	/*中断使能*/
(0045) 	SEI();
    01C2 9478      BSET	7
    01C3 9508      RET
_Int_TCCR1A:
  temp                 --> R20
    01C4 922A      ST	R2,-Y
    01C5 923A      ST	R3,-Y
    01C6 930A      ST	R16,-Y
    01C7 931A      ST	R17,-Y
    01C8 938A      ST	R24,-Y
    01C9 939A      ST	R25,-Y
    01CA 93EA      ST	R30,-Y
    01CB 93FA      ST	R31,-Y
    01CC B62F      IN	R2,0x3F
    01CD 922A      ST	R2,-Y
    01CE 940E0270  CALL	push_gset1
(0046) }
(0047) 
(0048) /*------------------------------------------------------------------*-
(0049)   
(0050)  	Int_TCCR1A()
(0051)  	LED数码管动态显示函数
(0052) 
(0053) 	定时器'T1',A组比较中断产生5mS周期性中断
(0054) 	在中断里刷新显示
(0055)  
(0056) -*------------------------------------------------------------------*/
(0057) #pragma interrupt_handler Int_TCCR1A: 13
(0058) void Int_TCCR1A(void) {
(0059) 
(0060) 	unsigned char temp;
(0061) 	static unsigned char i;
(0062) 	
(0063) 	PORTB &= ~(1 << PB0);					/*准备锁存*/
    01D0 98C0      CBI	0x18,0
(0064) 	PORTB |= 0xF0;							/*复位段选择口*/
    01D1 B388      IN	R24,0x18
    01D2 6F80      ORI	R24,0xF0
    01D3 BB88      OUT	0x18,R24
(0065) 	PORTB |= (1 << PB0);					/*锁存数据*/
    01D4 9AC0      SBI	0x18,0
(0066) 	if (i == 3) {
    01D5 91800116  LDS	R24,i
    01D7 3083      CPI	R24,3
    01D8 F409      BNE	0x01DA
(0067) 		PORTB &= ~(1 << PB6);				/*由于此处显示数值滞后一个周期所以显示位也要修改*/
    01D9 98C6      CBI	0x18,6
(0068) 		}									/*此处逻辑性很强,如不能理解可先跳过,以后熟练来再看*/
(0069) 	if (i == 2) {
    01DA 91800116  LDS	R24,i
    01DC 3082      CPI	R24,2
    01DD F409      BNE	0x01DF
(0070) 		PORTB &= ~(1 << PB5);
    01DE 98C5      CBI	0x18,5
(0071) 		}
(0072) 	if (i == 1) {
    01DF 91800116  LDS	R24,i
    01E1 3081      CPI	R24,1
    01E2 F409      BNE	0x01E4
(0073) 		PORTB &= ~(1 << PB4);
    01E3 98C4      CBI	0x18,4
(0074) 		}
(0075) 	if (i == 0) {
    01E4 90200116  LDS	R2,i
    01E6 2022      TST	R2
    01E7 F409      BNE	0x01E9
(0076) 		PORTB &= ~(1 << PB7);
    01E8 98C7      CBI	0x18,7
(0077) 		}
(0078) 	temp = led_buf[i] % 16;					/*滤除溢出的数值*/
    01E9 E180      LDI	R24,0x10
    01EA E091      LDI	R25,1
    01EB 91E00116  LDS	R30,i
    01ED 27FF      CLR	R31
    01EE 0FE8      ADD	R30,R24
    01EF 1FF9      ADC	R31,R25
    01F0 8100      LDD	R16,Z+0
    01F1 E110      LDI	R17,0x10
    01F2 940E023D  CALL	mod8u
    01F4 2F40      MOV	R20,R16
(0079) 	temp = disp[temp];						/*取出当前显示信息*/
    01F5 E080      LDI	R24,0
    01F6 E091      LDI	R25,1
    01F7 2FE4      MOV	R30,R20
    01F8 27FF      CLR	R31
    01F9 0FE8      ADD	R30,R24
    01FA 1FF9      ADC	R31,R25
    01FB 8140      LDD	R20,Z+0
(0080) 	if (led_buf[4] == i) {					/*显示小数点*/
    01FC 90200116  LDS	R2,i
    01FE 90300114  LDS	R3,0x114
    0200 1432      CP	R3,R2
    0201 F421      BNE	0x0206
(0081) 		SPDR = temp & 0x7F;
    0202 2F84      MOV	R24,R20
    0203 778F      ANDI	R24,0x7F
    0204 B98F      OUT	0x0F,R24
(0082) 		}
    0205 C001      RJMP	0x0207
(0083) 	else {
(0084) 		SPDR = temp;
    0206 B94F      OUT	0x0F,R20
(0085) 		}
(0086) 
(0087) 	i ++;
    0207 91800116  LDS	R24,i
    0209 5F8F      SUBI	R24,0xFF
    020A 93800116  STS	i,R24
(0088) 	if (i > 3) {							/*溢出处理*/
    020C E083      LDI	R24,3
    020D 90200116  LDS	R2,i
    020F 1582      CP	R24,R2
    0210 F418      BCC	0x0214
(0089) 		i = 0;
    0211 2422      CLR	R2
    0212 92200116  STS	i,R2
(0090) 		}
FILE: <library>
    0214 940E0273  CALL	pop_gset1
    0216 9029      LD	R2,Y+
    0217 BE2F      OUT	0x3F,R2
    0218 91F9      LD	R31,Y+
    0219 91E9      LD	R30,Y+
    021A 9199      LD	R25,Y+
    021B 9189      LD	R24,Y+
    021C 9119      LD	R17,Y+
    021D 9109      LD	R16,Y+
    021E 9039      LD	R3,Y+
    021F 9029      LD	R2,Y+
    0220 9518      RETI
mod16u:
    0221 9468      BSET	6
    0222 C001      RJMP	xdiv16u
div16u:
    0223 94E8      BCLR	6
xdiv16u:
    0224 92EA      ST	R14,-Y
    0225 92FA      ST	R15,-Y
    0226 938A      ST	R24,-Y
    0227 24EE      CLR	R14
    0228 24FF      CLR	R15
    0229 E180      LDI	R24,0x10
    022A 0F00      LSL	R16
    022B 1F11      ROL	R17
    022C 1CEE      ROL	R14
    022D 1CFF      ROL	R15
    022E 16E2      CP	R14,R18
    022F 06F3      CPC	R15,R19
    0230 F018      BCS	0x0234
    0231 1AE2      SUB	R14,R18
    0232 0AF3      SBC	R15,R19
    0233 9503      INC	R16
    0234 958A      DEC	R24
    0235 F7A1      BNE	0x022A
    0236 F416      BRTC	0x0239
    0237 2D0E      MOV	R16,R14
    0238 2D1F      MOV	R17,R15
    0239 9189      LD	R24,Y+
    023A 90F9      LD	R15,Y+
    023B 90E9      LD	R14,Y+
    023C 9508      RET
mod8u:
    023D 9468      BSET	6
    023E C001      RJMP	xdiv8u
div8u:
    023F 94E8      BCLR	6
xdiv8u:
    0240 932A      ST	R18,-Y
    0241 92FA      ST	R15,-Y
    0242 92EA      ST	R14,-Y
    0243 24FF      CLR	R15
    0244 24EE      CLR	R14
    0245 E120      LDI	R18,0x10
    0246 0F00      LSL	R16
    0247 1CFF      ROL	R15
    0248 1CEE      ROL	R14
    0249 16E1      CP	R14,R17
    024A F010      BCS	0x024D
    024B 1AE1      SUB	R14,R17
    024C 9503      INC	R16
    024D 952A      DEC	R18
    024E F7B9      BNE	0x0246
    024F F40E      BRTC	0x0251
    0250 2D0E      MOV	R16,R14
    0251 90E9      LD	R14,Y+
    0252 90F9      LD	R15,Y+
    0253 9129      LD	R18,Y+
    0254 9508      RET
empy16s:
    0255 920A      ST	R0,-Y
    0256 921A      ST	R1,-Y
    0257 938A      ST	R24,-Y
    0258 939A      ST	R25,-Y
    0259 9F02      MUL	R16,R18
    025A 01C0      MOVW	R24,R0
    025B 9F12      MUL	R17,R18
    025C 0D90      ADD	R25,R0
    025D 9F03      MUL	R16,R19
    025E 0D90      ADD	R25,R0
    025F 018C      MOVW	R16,R24
    0260 9199      LD	R25,Y+
    0261 9189      LD	R24,Y+
    0262 9019      LD	R1,Y+
    0263 9009      LD	R0,Y+
    0264 9508      RET
pop_gset2:
    0265 E0E2      LDI	R30,2
    0266 940C0274  JMP	pop
push_gset5:
    0268 92FA      ST	R15,-Y
    0269 92EA      ST	R14,-Y
push_gset4:
    026A 92DA      ST	R13,-Y
    026B 92CA      ST	R12,-Y
push_gset3:
    026C 92BA      ST	R11,-Y
    026D 92AA      ST	R10,-Y
push_gset2:
    026E 937A      ST	R23,-Y
    026F 936A      ST	R22,-Y
push_gset1:
    0270 935A      ST	R21,-Y
    0271 934A      ST	R20,-Y
    0272 9508      RET
pop_gset1:
    0273 E0E1      LDI	R30,1
pop:
    0274 9149      LD	R20,Y+
    0275 9159      LD	R21,Y+
    0276 FDE0      SBRC	R30,0
    0277 9508      RET
    0278 9169      LD	R22,Y+
    0279 9179      LD	R23,Y+
    027A FDE1      SBRC	R30,1
    027B 9508      RET
    027C 90A9      LD	R10,Y+
    027D 90B9      LD	R11,Y+
    027E FDE2      SBRC	R30,2
    027F 9508      RET
    0280 90C9      LD	R12,Y+
    0281 90D9      LD	R13,Y+
    0282 FDE3      SBRC	R30,3
    0283 9508      RET
    0284 90E9      LD	R14,Y+
    0285 90F9      LD	R15,Y+
    0286 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -