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

📄 zz.lst

📁 avr基础程序大全
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0016) 	 return addata;
    00150 0185      MOVW	R16,R10
    00151 90B9      LD	R11,Y+
    00152 90A9      LD	R10,Y+
    00153 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\12864_~1\18B20.h
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define  uchar unsigned char
(0004) #define  uint  unsigned int 
(0005) #define DQ_IN	DDRC &= ~(1 << PA3)		/*设置输入*/
(0006) #define DQ_OUT	DDRC |= (1 << PA3)		/*设置输出*/
(0007) #define DQ_CLR	PORTC &= ~(1 << PA3)	/*置低电平*/
(0008) #define DQ_SET	PORTC |= (1 << PA3)		/*置高电平*/
(0009) #define DQ_R	PINC & (1 << PA3)		/*读了电平*/
(0010) 
(0011) uchar flag;/*中断标志缓存*/				
(0012) #define delay4us {NOP();NOP();NOP();NOP();}
(0013) #define delay10us {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();} 
(0014) void delay_10us(unsigned char i) {
(0015) 
(0016) 	if (i == 0) {
_delay_10us:
  i                    --> R16
    00154 2300      TST	R16
    00155 F429      BNE	0x015B
(0017) 		return ;
    00156 C009      RJMP	0x0160
(0018) 		}
(0019) 	while (i--) {
(0020) 		delay4us;
    00157 0000      NOP
    00158 0000      NOP
    00159 0000      NOP
    0015A 0000      NOP
    0015B 2E20      MOV	R2,R16
    0015C 2433      CLR	R3
    0015D 5001      SUBI	R16,1
    0015E 2022      TST	R2
    0015F F7B9      BNE	0x0157
    00160 9508      RET
_ds1820_reset:
  i                    --> R20
    00161 934A      ST	-Y,R20
(0021) 		}
(0022) }
(0023) /*DS18B20复位函数*/
(0024) unsigned char ds1820_reset(void) {
(0025) 
(0026) 	unsigned char i;
(0027) 	flag = SREG;				/*中断保护*/
    00162 B62F      IN	R2,0x3F
    00163 9220 00B9 STS	flag,R2
(0028) 	CLI();						/*关中断*/
    00165 94F8      BCLR	7
(0029) 	DQ_OUT;
    00166 9AA3      SBI	0x14,3
(0030) 	DQ_CLR;
    00167 98AB      CBI	0x15,3
(0031) 	delay_10us(49);				/*延时500uS(480-960)*/
    00168 E301      LDI	R16,0x31
    00169 DFEA      RCALL	_delay_10us
(0032) 	DQ_SET;
    0016A 9AAB      SBI	0x15,3
(0033) 	DQ_IN;
    0016B 98A3      CBI	0x14,3
(0034) 	delay_10us(7);				/*延时80uS*/
    0016C E007      LDI	R16,7
    0016D DFE6      RCALL	_delay_10us
(0035) 	i = DQ_R;
    0016E B343      IN	R20,0x13
    0016F 7048      ANDI	R20,0x8
(0036) 	delay_10us(49);				/*延时500uS(保持>480uS)*/
    00170 E301      LDI	R16,0x31
    00171 DFE2      RCALL	_delay_10us
(0037) 	if (flag & 0x80) {			/*恢复中断状态*/
    00172 9020 00B9 LDS	R2,flag
    00174 FE27      SBRS	R2,7
    00175 C001      RJMP	0x0177
(0038) 		SEI();
    00176 9478      BSET	7
(0039) 		}
(0040) 	if (i) {
    00177 2344      TST	R20
    00178 F011      BEQ	0x017B
(0041) 		return 0x00;
    00179 2700      CLR	R16
    0017A C001      RJMP	0x017C
(0042) 		}
(0043) 	else {
(0044) 		return 0x01;
    0017B E001      LDI	R16,1
    0017C 9149      LD	R20,Y+
    0017D 9508      RET
_ds1820_read_byte:
  value                --> R20
  i                    --> R22
    0017E 934A      ST	-Y,R20
    0017F 936A      ST	-Y,R22
(0045) 		}
(0046) }
(0047) 
(0048) /*DS18B20字节读取函数*/
(0049) unsigned char ds1820_read_byte(void) {
(0050) 
(0051) 	unsigned char i;
(0052) 	unsigned char value = 0;
    00180 2744      CLR	R20
(0053) 	flag = SREG;				/*中断保护*/
    00181 B62F      IN	R2,0x3F
    00182 9220 00B9 STS	flag,R2
(0054) 	CLI();						/*关中断*/
    00184 94F8      BCLR	7
(0055) 	for (i = 8; i != 0; i--) {
    00185 E068      LDI	R22,0x8
    00186 C019      RJMP	0x01A0
(0056) 		value >>= 1;
    00187 9546      LSR	R20
(0057) 		DQ_OUT;
    00188 9AA3      SBI	0x14,3
(0058) 		DQ_CLR;
    00189 98AB      CBI	0x15,3
(0059) 		delay4us;					/*延时4uS*/
    0018A 0000      NOP
    0018B 0000      NOP
    0018C 0000      NOP
    0018D 0000      NOP
(0060) 		DQ_SET;
    0018E 9AAB      SBI	0x15,3
(0061) 		DQ_IN;
    0018F 98A3      CBI	0x14,3
(0062) 		delay10us;					/*延时10uS*/
    00190 0000      NOP
    00191 0000      NOP
    00192 0000      NOP
    00193 0000      NOP
    00194 0000      NOP
    00195 0000      NOP
    00196 0000      NOP
    00197 0000      NOP
    00198 0000      NOP
    00199 0000      NOP
(0063) 		if (DQ_R) {
    0019A 9B9B      SBIS	0x13,3
    0019B C001      RJMP	0x019D
(0064) 			value|=0x80;
    0019C 6840      ORI	R20,0x80
(0065) 			}
(0066) 		delay_10us(5);			/*延时60uS*/
    0019D E005      LDI	R16,5
    0019E DFB5      RCALL	_delay_10us
    0019F 956A      DEC	R22
    001A0 2366      TST	R22
    001A1 F729      BNE	0x0187
(0067) 		}
(0068) 	if (flag & 0x80) {			/*恢复中断状态*/
    001A2 9020 00B9 LDS	R2,flag
    001A4 FE27      SBRS	R2,7
    001A5 C001      RJMP	0x01A7
(0069) 		SEI();
    001A6 9478      BSET	7
(0070) 		}
(0071) 	return(value);
    001A7 2F04      MOV	R16,R20
    001A8 9169      LD	R22,Y+
    001A9 9149      LD	R20,Y+
    001AA 9508      RET
_ds1820_write_byte:
  i                    --> R20
  value                --> R10
    001AB 92AA      ST	-Y,R10
    001AC 934A      ST	-Y,R20
    001AD 2EA0      MOV	R10,R16
(0072) }
(0073) 
(0074) /*DS18B20字节写入函数*/
(0075) void ds1820_write_byte(unsigned char value) {
(0076) 
(0077) 	unsigned char i;
(0078) 	flag = SREG;				/*中断保护*/
    001AE B62F      IN	R2,0x3F
    001AF 9220 00B9 STS	flag,R2
(0079) 	CLI();						/*关中断*/
    001B1 94F8      BCLR	7
(0080) 	for (i = 8; i != 0; i--) {
    001B2 E048      LDI	R20,0x8
    001B3 C00E      RJMP	0x01C2
(0081) 		DQ_OUT;
    001B4 9AA3      SBI	0x14,3
(0082) 		DQ_CLR;
    001B5 98AB      CBI	0x15,3
(0083) 		delay4us;					/*延时4uS*/
    001B6 0000      NOP
    001B7 0000      NOP
    001B8 0000      NOP
    001B9 0000      NOP
(0084) 		if (value & 0x01) {DQ_SET;}
    001BA FEA0      SBRS	R10,0
    001BB C001      RJMP	0x01BD
    001BC 9AAB      SBI	0x15,3
(0085) 		//每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0						
(0086) 		delay_10us(7);			/*延时80uS*/
    001BD E007      LDI	R16,7
    001BE DF95      RCALL	_delay_10us
(0087) 		DQ_SET;					/*位结束*/
    001BF 9AAB      SBI	0x15,3
(0088) 		value >>= 1;
    001C0 94A6      LSR	R10
    001C1 954A      DEC	R20
    001C2 2344      TST	R20
    001C3 F781      BNE	0x01B4
(0089) 		}
(0090) 	if (flag & 0x80) {			/*恢复中断状态*/
    001C4 9020 00B9 LDS	R2,flag
    001C6 FE27      SBRS	R2,7
    001C7 C001      RJMP	0x01C9
(0091) 		SEI();
    001C8 9478      BSET	7
(0092) 		}
    001C9 9149      LD	R20,Y+
    001CA 90A9      LD	R10,Y+
    001CB 9508      RET
_ds1820_read_temp:
  tt                   --> Y,+0
  c                    --> R20
  b                    --> R22
  a                    --> R10
  t                    --> R12
    001CC 940E 04A3 CALL	push_xgsetF03C
    001CE 9724      SBIW	R28,4
(0093) }
(0094) 
(0095) /*DS8B20读取温度信息*/
(0096) ds1820_read_temp(void) 
(0097) {
(0098) 
(0099) 	unsigned int a = 0, b = 0, c = 0, t = 0;
(0100)     float tt = 0; 
    001CF E600      LDI	R16,0x60
    001D0 E010      LDI	R17,0
    001D1 940E 04BE CALL	lpm32
    001D3 8308      ST	Y,R16
    001D4 8319      STD	Y+1,R17
    001D5 832A      STD	Y+2,R18
    001D6 833B      STD	Y+3,R19
(0101) 
(0102)       ds1820_reset();
    001D7 DF89      RCALL	_ds1820_reset
(0103) 	  ds1820_write_byte(0xCC);	/*勿略地址*/
    001D8 EC0C      LDI	R16,0xCC
    001D9 DFD1      RCALL	_ds1820_write_byte
(0104) 	  ds1820_write_byte(0x44);	/*启动转换*/
    001DA E404      LDI	R16,0x44
    001DB DFCF      RCALL	_ds1820_write_byte
(0105) 	  ds1820_reset();
    001DC DF84      RCALL	_ds1820_reset
(0106) 	  ds1820_write_byte(0xCC);	/*勿略地址*/
    001DD EC0C      LDI	R16,0xCC
    001DE DFCC      RCALL	_ds1820_write_byte
(0107) 	  ds1820_write_byte(0xBE);	/*读取温度*/
    001DF EB0E      LDI	R16,0xBE
    001E0 DFCA      RCALL	_ds1820_write_byte
(0108)          a = ds1820_read_byte(); //读取温度寄存器
    001E1 DF9C      RCALL	_ds1820_read_byte
    001E2 2EA0      MOV	R10,R16
    001E3 24BB      CLR	R11
(0109)          b = ds1820_read_byte();
    001E4 DF99      RCALL	_ds1820_read_byte
    001E5 2F60      MOV	R22,R16
    001E6 2777      CLR	R23
(0110)          t = b;
    001E7 016B      MOVW	R12,R22
(0111)          t <<= 8;
    001E8 2CDC      MOV	R13,R12
    001E9 24CC      CLR	R12
(0112)          t = t | a;
    001EA 28CA      OR	R12,R10
    001EB 28DB      OR	R13,R11
(0113) 
(0114)         tt = t * 0.0625;
    001EC E50C      LDI	R16,0x5C
    001ED E010      LDI	R17,0
    001EE 940E 04BE CALL	lpm32
    001F0 0118      MOVW	R2,R16
    001F1 0129      MOVW	R4,R18
    001F2 0186      MOVW	R16,R12
    001F3 940E 0579 CALL	uint2fp
    001F5 933A      ST	-Y,R19
    001F6 932A      ST	-Y,R18
    001F7 931A      ST	-Y,R17
    001F8 930A      ST	-Y,R16
    001F9 0181      MOVW	R16,R2
    001FA 0192      MOVW	R18,R4
    001FB 940E 0686 CALL	fpmule2
    001FD 8308      ST	Y,R16
    001FE 8319      STD	Y+1,R17
    001FF 832A      STD	Y+2,R18
    00200 833B      STD	Y+3,R19
(0115)         t = tt * 10 + 0.5; //放大10倍输出并四舍五入
    00201 E508      LDI	R16,0x58
    00202 E010      LDI	R17,0
    00203 940E 04BE CALL	lpm32
    00205 01CE      MOVW	R24,R28
    00206 939A      ST	-Y,R25
    00207 938A      ST	-Y,R24
    00208 940E 067C CALL	fpmule1
    0020A 0118      MOVW	R2,R16
    0020B 0129      MOVW	R4,R18
    0020C E504      LDI	R16,0x54
    0020D E010      LDI	R17,0
    0020E 940E 04BE CALL	lpm32
    00210 933A      ST	-Y,R19
    00211 932A      ST	-Y,R18
    00212 931A      ST	-Y,R17
    00213 930A      ST	-Y,R16
    00214 0181      MOVW	R16,R2
    00215 0192      MOVW	R18,R4
    00216 940E 053C CALL	fpadd2
    00218 940E 0547 CALL	fpint
    0021A 0168      MOVW	R12,R16
(0116) 
(0117)         a = t / 100;              //十位
    0021B E624      LDI	R18,0x64
    0021C E030      LDI	R19,0
    0021D 940E 046B CALL	div16u
    0021F 0158      MOVW	R10,R16
(0118)         b = t / 10 - a * 10;      //个位
    00220 E00A      LDI	R16,0xA
    00221 E010      LDI	R17,0
    00222 0195      MOVW	R18,R10
    00223 940E 0485 CALL	empy16s
    00225 0118      MOVW	R2,R16
    00226 E02A      LDI	R18,0xA
    00227 E030      LDI	R19,0
    00228 0186      MOVW	R16,R12
    00229 940E 046B CALL	div16u
    0022B 01B8      MOVW	R22,R16
    0022C 1962      SUB	R22,R2
    0022D 0973      SBC	R23,R3
(0119)         c = t - a * 100 - b * 10; //小数位
    0022E E604      LDI	R16,0x64
    0022F E010      LDI	R17,0
    00230 0195      MOVW	R18,R10
    00231 940E 0485 CALL	empy16s
    00233 01A6      MOVW	R20,R12
    00234 1B40      SUB	R20,R16
    00235 0B51      SBC	R21,R17
    00236 E00A      LDI	R16,0xA
    00237 E010      LDI	R17,0
    00238 019B      MOVW	R18,R22
    00239 940E 0485 CALL	empy16s
    0023B 1B40      SUB	R20,R16
    0023C 0B51      SBC	R21,R17
(0120) 		locate(1,7);
    0023D E027      LDI	R18,7
    0023E E001      LDI	R16,1
    0023F DEC2      RCALL	_locate
(0121) 		write_shuju(1,a+0x30);
    00240 0195      MOVW	R18,R10
    00241 5D20      SUBI	R18,0xD0
    00242 4F3F      SBCI	R19,0xFF
    00243 E001      LDI	R16,1
    00244 DE65      RCALL	_write_shuju
(0122) 		write_shuju(1,b+0x30);
    00245 019B      MOVW	R18,R22
    00246 5D20      SUBI	R18,0xD0
    00247 4F3F      SBCI	R19,0xFF
    00248 E001      LDI	R16,1
    00249 DE60      RCALL	_write_shuju
(0123) 		write_hz(".");
    0024A E90F      LDI	R16,0x9F
    0024B E010      LDI	R17,0
    0024C DEA4      RCALL	_write_hz
(0124) 		write_shuju(1,c+0x30);
    0024D 019A      MOVW	R18,R20
    0024E 5D20      SUBI	R18,0xD0
    0024F 4F3F      SBCI	R19,0xFF
    00250 E001      LDI	R16,1
    00251 DE58      RCALL	_write_shuju
(0125) 		delay(100);
    00252 E604      LDI	R16,0x64
    00253 E010      LDI	R17,0
    00254 DE21      RCALL	_delay
    00255 9624      ADIW	R28,4
    00256 940C 04AC JMP	pop_xgsetF03C
FILE: C:\DOCUME~1\Administrator\桌面\12864_~1\zz.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "12864.h"
(0004) #include "adc.h"
(0005) #include "18B20.h"
(0006) #define  uchar unsigned char
(0007) #define  uint  unsigned int
(0008) uint A ,B;
(0009) typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable 	  无符号8位整型变量  */
(0010) typedef signed   char  S8;       /* defined for signed 8-bits integer variable		  有符号8位整型变量  */
(0011) typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable 	  无符号16位整型变量 */
(0012) typedef signed   int   S16;      /* defined for signed 16-bits integer variable 	  有符号16位整型变量 */
(0013) typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable 	  无符号32位整型变量 */
(0014) typedef signed   long  S32;      /* defined for signed 32-bits integer variable 	  有符号32位整型变量 */
(0015) typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
(0016) typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

⌨️ 快捷键说明

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