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

📄 ds1820.lst

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0035 E5CF      LDI	R28,0x5F
    0036 E0D4      LDI	R29,4
    0037 BFCD      OUT	0x3D,R28
    0038 BFDE      OUT	0x3E,R29
    0039 51C0      SUBI	R28,0x10
    003A 40D0      SBCI	R29,0
    003B EA0A      LDI	R16,0xAA
    003C 8308      STD	Y+0,R16
    003D 2400      CLR	R0
    003E E7E5      LDI	R30,0x75
    003F E0F0      LDI	R31,0
    0040 E010      LDI	R17,0
    0041 37E7      CPI	R30,0x77
    0042 07F1      CPC	R31,R17
    0043 F011      BEQ	0x0046
    0044 9201      ST	R0,Z+
    0045 CFFB      RJMP	0x0041
    0046 8300      STD	Z+0,R16
    0047 E5E4      LDI	R30,0x54
    0048 E0F0      LDI	R31,0
    0049 E6A0      LDI	R26,0x60
    004A E0B0      LDI	R27,0
    004B E010      LDI	R17,0
    004C 36E9      CPI	R30,0x69
    004D 07F1      CPC	R31,R17
    004E F021      BEQ	0x0053
    004F 95C8      LPM
    0050 9631      ADIW	R30,1
    0051 920D      ST	R0,X+
    0052 CFF9      RJMP	0x004C
    0053 940E0068  CALL	_main
_exit:
    0055 CFFF      RJMP	_exit
_delay_ms:
  b                    --> R20
  i                    --> R16
    0056 940E0223  CALL	push_gset1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\main.c
(0001) /*
(0002) 实验四:
(0003) 	SPI接口实险,LED数据管显示。
(0004) 	1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0005) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 	3、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块。
(0007) 
(0008) 	AVR  mega16学习板
(0009) 	www.iccavr.com
(0010) 	2006-01-10
(0011) */
(0012) 
(0013) #include "iom16v.h"
(0014) #include "ds1820.h"
(0015) #include "led4.h"
(0016) 
(0017) /*延时函数*/
(0018) void delay_ms(unsigned int i) {
    0058 C005      RJMP	0x005E
(0019) 
(0020) 	unsigned char b;
(0021) 	while (i --) {
(0022) 		for (b = 1; b; b++) {
    0059 E041      LDI	R20,1
    005A C001      RJMP	0x005C
    005B 9543      INC	R20
    005C 2344      TST	R20
    005D F7E9      BNE	0x005B
    005E 0118      MOVW	R2,R16
    005F 5001      SUBI	R16,1
    0060 4010      SBCI	R17,0
    0061 2022      TST	R2
    0062 F7B1      BNE	0x0059
    0063 2033      TST	R3
    0064 F7A1      BNE	0x0059
    0065 940E0226  CALL	pop_gset1
    0067 9508      RET
(0023) 			;
(0024) 			}
(0025) 		}
(0026) }
(0027) 
(0028) void main(void) {
(0029) 
(0030) 	unsigned int i;
(0031) 
(0032) 	DDRA = 0x00;						/*方向输入*/
_main:
  i                    --> R20
    0068 2422      CLR	R2
    0069 BA2A      OUT	0x1A,R2
(0033) 	PORTA = 0xFF;						/*打开上拉*/
    006A EF8F      LDI	R24,0xFF
    006B BB8B      OUT	0x1B,R24
(0034) 	DDRB = 0xFF;						/*方向输出*/
    006C BB87      OUT	0x17,R24
(0035) 	PORTB = 0xF0;						/*电平设置*/
    006D EF80      LDI	R24,0xF0
    006E BB88      OUT	0x18,R24
(0036) 	DDRC = 0x00;
    006F BA24      OUT	0x14,R2
(0037) 	PORTC = 0xFF;
    0070 EF8F      LDI	R24,0xFF
    0071 BB85      OUT	0x15,R24
(0038) 	DDRD = 0x00;
    0072 BA21      OUT	0x11,R2
(0039) 	PORTD = 0xFF;
    0073 BB82      OUT	0x12,R24
(0040) 
(0041) 	delay_ms(200);
    0074 EC08      LDI	R16,0xC8
    0075 E010      LDI	R17,0
    0076 DFDF      RCALL	_delay_ms
(0042) 	ds1820_reset();
    0077 940E013E  CALL	_ds1820_reset
(0043) 	led4_init();
    0079 940E00BD  CALL	_led4_init
    007B C03F      RJMP	0x00BB
(0044) 	while (1) {
(0045) 		ds1820_start();
    007C 940E01AA  CALL	_ds1820_start
(0046) 		delay_ms(2000);
    007E ED00      LDI	R16,0xD0
    007F E017      LDI	R17,7
    0080 DFD5      RCALL	_delay_ms
(0047) 		i = ds1820_read_temp();
    0081 940E01B0  CALL	_ds1820_read_temp
    0083 01A8      MOVW	R20,R16
(0048) 		i = (i * 10) / 16;				/*数值处理*/
    0084 E00A      LDI	R16,0xA
    0085 E010      LDI	R17,0
    0086 019A      MOVW	R18,R20
    0087 940E0208  CALL	empy16s
    0089 01A8      MOVW	R20,R16
    008A 9556      LSR	R21
    008B 9547      ROR	R20
    008C 9556      LSR	R21
    008D 9547      ROR	R20
    008E 9556      LSR	R21
    008F 9547      ROR	R20
    0090 9556      LSR	R21
    0091 9547      ROR	R20
(0049) 		led_buf[3] = i / 1000;
    0092 EE28      LDI	R18,0xE8
    0093 E033      LDI	R19,3
    0094 018A      MOVW	R16,R20
    0095 940E01D6  CALL	div16u
    0097 93000073  STS	led_buf+3,R16
(0050) 		i = i % 1000;
    0099 EE28      LDI	R18,0xE8
    009A E033      LDI	R19,3
    009B 018A      MOVW	R16,R20
    009C 940E01D4  CALL	mod16u
    009E 01A8      MOVW	R20,R16
(0051) 		led_buf[2] = i / 100;
    009F E624      LDI	R18,0x64
    00A0 E030      LDI	R19,0
    00A1 940E01D6  CALL	div16u
    00A3 93000072  STS	led_buf+2,R16
(0052) 		i = i % 100;
    00A5 E624      LDI	R18,0x64
    00A6 E030      LDI	R19,0
    00A7 018A      MOVW	R16,R20
    00A8 940E01D4  CALL	mod16u
    00AA 01A8      MOVW	R20,R16
(0053) 		led_buf[1] = i / 10;
    00AB E02A      LDI	R18,0xA
    00AC E030      LDI	R19,0
    00AD 940E01D6  CALL	div16u
    00AF 93000071  STS	led_buf+1,R16
(0054) 		led_buf[0] = i % 10;
    00B1 E02A      LDI	R18,0xA
    00B2 E030      LDI	R19,0
    00B3 018A      MOVW	R16,R20
    00B4 940E01D4  CALL	mod16u
    00B6 93000070  STS	led_buf,R16
(0055) 		led_buf[4] = 1;					/*小数点位置*/
    00B8 E081      LDI	R24,1
    00B9 93800074  STS	0x74,R24
    00BB CFC0      RJMP	0x007C
    00BC 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~2\icc\030-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) #include "iom16v.h"
(0012) #include <macros.h>
(0013) 
(0014) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
(0015) 
(0016) /*
(0017) 前4位为显示数值。
(0018) 最后一位为小数点显示位置。
(0019) */
(0020) unsigned char led_buf[] = {1, 2, 3, 4, 8};			/*显示信息*/
(0021) 
(0022) /*------------------------------------------------------------------*-
(0023) 
(0024) 	 Disp_Init()
(0025) 	 显示初始化
(0026) 
(0027) -*------------------------------------------------------------------*/
(0028) void led4_init(void) {
(0029) 
(0030) 	/*初始化定时器*/
(0031) 	OCR1A = 625;						/*计数周期为5mS,F=1M*/
_led4_init:
    00BD E781      LDI	R24,0x71
    00BE E092      LDI	R25,2
    00BF BD9B      OUT	0x2B,R25
    00C0 BD8A      OUT	0x2A,R24
(0032) 	TIMSK |= (1 << OCIE1A);				/*比较中断A允许*/
    00C1 B789      IN	R24,0x39
    00C2 6180      ORI	R24,0x10
    00C3 BF89      OUT	0x39,R24
(0033) 	SREG = 0x80;
    00C4 E880      LDI	R24,0x80
    00C5 BF8F      OUT	0x3F,R24
(0034) 	TCCR1A = 0x00;
    00C6 2422      CLR	R2
    00C7 BC2F      OUT	0x2F,R2
(0035) 	TCCR1B = 0x08;						/*定时器工作在CTC计数器模式*/
    00C8 E088      LDI	R24,0x8
    00C9 BD8E      OUT	0x2E,R24
(0036) 	TCCR1B |= 0x02;						/*设置定时器的分频值为8分频*/
    00CA B58E      IN	R24,0x2E
    00CB 6082      ORI	R24,2
    00CC BD8E      OUT	0x2E,R24
(0037) 	
(0038) 	/*SPI接口初始化*/
(0039) 	DDRB |= (1<<PB5) | (1<<PB7);		/* 设置MOSI 和SCK 为输出,其他为输入 */
    00CD B387      IN	R24,0x17
    00CE 6A80      ORI	R24,0xA0
    00CF BB87      OUT	0x17,R24
(0040) 	SPCR = (1<<SPE) | (1<<MSTR)
    00D0 E583      LDI	R24,0x53
    00D1 B98D      OUT	0x0D,R24
(0041) 		| (1<<SPR1) | (1<<SPR0);		/* 使能SPI 主机模式,时钟为fck/128 */
(0042) 	
(0043) 	/*中断使能*/
(0044) 	SEI();
    00D2 9478      BSET	7
    00D3 9508      RET
_Int_TCCR1A:
  temp                 --> R20
    00D4 922A      ST	R2,-Y
    00D5 923A      ST	R3,-Y
    00D6 930A      ST	R16,-Y
    00D7 931A      ST	R17,-Y
    00D8 938A      ST	R24,-Y
    00D9 939A      ST	R25,-Y
    00DA 93EA      ST	R30,-Y
    00DB 93FA      ST	R31,-Y
    00DC B62F      IN	R2,0x3F
    00DD 922A      ST	R2,-Y
    00DE 940E0223  CALL	push_gset1
(0045) }
(0046) 
(0047) /*------------------------------------------------------------------*-
(0048)   
(0049)  	Int_TCCR1A()
(0050)  	LED数码管动态显示函数
(0051) 
(0052) 	定时器'T1',A组比较中断产生5mS周期性中断
(0053) 	在中断里刷新显示
(0054)  
(0055) -*------------------------------------------------------------------*/
(0056) #pragma interrupt_handler Int_TCCR1A: 7
(0057) void Int_TCCR1A(void) {
(0058) 
(0059) 	unsigned char temp;
(0060) 	static unsigned char i;
(0061) 
(0062) 	PORTB &= ~(1 << 4);					/*准备锁存*/
    00E0 98C4      CBI	0x18,4
(0063) 	PORTB |= 0x0F;
    00E1 B388      IN	R24,0x18
    00E2 608F      ORI	R24,0xF
    00E3 BB88      OUT	0x18,R24
(0064) 	PORTB |= (1 << 4);					/*锁存数据*/
    00E4 9AC4      SBI	0x18,4
(0065) 	if (i == 3) {						/*显示位*/
    00E5 91800075  LDS	R24,i
    00E7 3083      CPI	R24,3
    00E8 F409      BNE	0x00EA
(0066) 		PORTB &= ~(1 << 2);
    00E9 98C2      CBI	0x18,2
(0067) 		}
(0068) 	if (i == 2) {
    00EA 91800075  LDS	R24,i
    00EC 3082      CPI	R24,2
    00ED F409      BNE	0x00EF
(0069) 		PORTB &= ~(1 << 1);
    00EE 98C1      CBI	0x18,1
(0070) 		}
(0071) 	if (i == 1) {
    00EF 91800075  LDS	R24,i
    00F1 3081      CPI	R24,1
    00F2 F409      BNE	0x00F4
(0072) 		PORTB &= ~(1 << 0);
    00F3 98C0      CBI	0x18,0
(0073) 		}
(0074) 	if (i == 0) {
    00F4 90200075  LDS	R2,i
    00F6 2022      TST	R2
    00F7 F409      BNE	0x00F9
(0075) 		PORTB &= ~(1 << 3);
    00F8 98C3      CBI	0x18,3
(0076) 		}
(0077) 	
(0078) 	temp = led_buf[i] % 16;
    00F9 E780      LDI	R24,0x70
    00FA E090      LDI	R25,0
    00FB 91E00075  LDS	R30,i
    00FD 27FF      CLR	R31
    00FE 0FE8      ADD	R30,R24
    00FF 1FF9      ADC	R31,R25
    0100 8100      LDD	R16,Z+0
    0101 E110      LDI	R17,0x10
    0102 940E01F0  CALL	mod8u
    0104 2F40      MOV	R20,R16
(0079) 	temp = disp[temp];
    0105 E680      LDI	R24,0x60
    0106 E090      LDI	R25,0
    0107 2FE4      MOV	R30,R20
    0108 27FF      CLR	R31
    0109 0FE8      ADD	R30,R24
    010A 1FF9      ADC	R31,R25
    010B 8140      LDD	R20,Z+0
(0080) 	if (led_buf[4] == i) {				/*显示小数点*/
    010C 90200075  LDS	R2,i
    010E 90300074  LDS	R3,0x74
    0110 1432      CP	R3,R2
    0111 F421      BNE	0x0116
(0081) 		SPDR = temp & 0x7F;
    0112 2F84      MOV	R24,R20
    0113 778F      ANDI	R24,0x7F
    0114 B98F      OUT	0x0F,R24
(0082) 		}
    0115 C001      RJMP	0x0117
(0083) 	else {
(0084) 		SPDR = temp;
    0116 B94F      OUT	0x0F,R20
(0085) 		}
(0086) 
(0087) 	i ++;
    0117 91800075  LDS	R24,i
    0119 5F8F      SUBI	R24,0xFF
    011A 93800075  STS	i,R24
(0088) 	if (i > 3) {						/*溢出处理*/
    011C E083      LDI	R24,3
    011D 90200075  LDS	R2,i
    011F 1582      CP	R24,R2
    0120 F418      BCC	0x0124
(0089) 		i = 0;
    0121 2422      CLR	R2
    0122 92200075  STS	i,R2
(0090) 		}
    0124 940E0226  CALL	pop_gset1
    0126 9029      LD	R2,Y+
    0127 BE2F      OUT	0x3F,R2
    0128 91F9      LD	R31,Y+
    0129 91E9      LD	R30,Y+
    012A 9199      LD	R25,Y+
    012B 9189      LD	R24,Y+
    012C 9119      LD	R17,Y+
    012D 9109      LD	R16,Y+
    012E 9039      LD	R3,Y+
    012F 9029      LD	R2,Y+
    0130 9518      RETI
FILE: E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\DS1820.C
(0001) /*
(0002)  LCD12864液晶屏驱动模块
(0003)  1、可直接嵌入到项目中使用
(0004)  2、晶振频率:1M
(0005)  3、如晶振提高低层驱动延时要作相应修改
(0006)  AVR_AFA
(0007)  www.iccavr.com
(0008) */
(0009) 
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) 
(0013) #define DQ_IN	DDRA &= ~(1 << PA7)		/*设置输入*/
(0014) #define DQ_OUT	DDRA |= (1 << PA7)		/*设置输出*/
(0015) #define DQ_CLR	PORTA &= ~(1 << PA7)	/*置低电平*/
(0016) #define DQ_SET	PORTA |= (1 << PA7)		/*置高电平*/
(0017) #define DQ_R	PINA & (1 << PA7)		/*读了电平*/
(0018) 
(0019) unsigned char flag;						/*中断标志缓存*/
(0020) 
(0021) /*===================================================================
(0022) //	函数功能:	DS18B20数据校验函数
(0023) //	形参:		void
(0024) //	返回:		unsigned char	校验结果
(0025) //	编写:		2004/8/25
(0026) //	备注:		CRC公式为:CRC = X^8 + X^5 + X^4 + 1
(0027) ===================================================================*/
(0028) /*unsigned char crc(unsigned char *p,unsigned char len)
(0029) {
(0030) 	unsigned char bit0,cbit,r,temp,i,j,byte;
(0031) 	temp = 0;
(0032) 	for(j = 0; j < len; j++)
(0033) 	{
(0034) 		byte = p[j];
(0035) 		for(i = 0; i < 8; i++)
(0036) 		{
(0037)         		cbit = temp & 0x01;
(0038)         		bit0 = byte&0x01;
(0039)         		temp >>=   1;
(0040)         		r = cbit ^ bit0;
(0041)         		if(r == 1)
(0042)         			temp ^= 0x8c;
(0043)         		byte >>= 1;
(0044)         	}
(0045)     	}
(0046) 	return	temp;	
(0047) }*/

⌨️ 快捷键说明

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