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

📄 ds18b20_1602.lst

📁 ds18b20+1602液晶显示 基于atmega16l单片机的编程
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    004A E5CF      LDI	R28,0x5F
    004B E0D4      LDI	R29,4
    004C BFCD      OUT	0x3D,R28
    004D BFDE      OUT	0x3E,R29
    004E 51C0      SUBI	R28,0x10
    004F 40D0      SBCI	R29,0
    0050 EA0A      LDI	R16,0xAA
    0051 8308      STD	Y+0,R16
    0052 2400      CLR	R0
    0053 EAE0      LDI	R30,0xA0
    0054 E0F0      LDI	R31,0
    0055 E010      LDI	R17,0
    0056 3AE0      CPI	R30,0xA0
    0057 07F1      CPC	R31,R17
    0058 F011      BEQ	0x005B
    0059 9201      ST	R0,Z+
    005A CFFB      RJMP	0x0056
    005B 8300      STD	Z+0,R16
    005C E5E4      LDI	R30,0x54
    005D E0F0      LDI	R31,0
    005E E6A0      LDI	R26,0x60
    005F E0B0      LDI	R27,0
    0060 E010      LDI	R17,0
    0061 39E4      CPI	R30,0x94
    0062 07F1      CPC	R31,R17
    0063 F021      BEQ	0x0068
    0064 95C8      LPM
    0065 9631      ADIW	R30,1
    0066 920D      ST	R0,X+
    0067 CFF9      RJMP	0x0061
    0068 940E033B  CALL	_main
_exit:
    006A CFFF      RJMP	_exit
_DS18B20_Reset:
  err                  --> R20
    006B 940E03C1  CALL	push_gset1
FILE: F:\avr最小系统板\程序代码\ex15_ds18b20_1602\ds18b20.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "ds18b20.h"
(0004) #include "lm1602.h"
(0005) 
(0006) 
(0007) byte DS18B20_Reset(void)	 //DS18B20初始化函数
(0008) {  
(0009) 	 byte err=0;
    006D 2744      CLR	R20
(0010) 	 DQ_OUT;     //DQ复位
    006E 9AA1      SBI	0x14,1
(0011)      _NOP();
    006F 0000      NOP
(0012) 	 _NOP();
    0070 0000      NOP
(0013) 	 DQ_L;
    0071 98A9      CBI	0x15,1
(0014) 	 delay_nus(300);      //延时470us
    0072 E20C      LDI	R16,0x2C
    0073 E011      LDI	R17,1
    0074 940E036A  CALL	_delay_nus
(0015)     // DQ_H;
(0016) 	 DQ_IN;
    0076 98A1      CBI	0x14,1
(0017) 	 delay_nus(60);       //延时100us
    0077 E30C      LDI	R16,0x3C
    0078 E010      LDI	R17,0
    0079 940E036A  CALL	_delay_nus
(0018) 	 if(DQ_IN_H)
    007B B383      IN	R24,0x13
    007C 7082      ANDI	R24,2
    007D 3082      CPI	R24,2
    007E F409      BNE	0x0080
(0019) 	  err = 1;
    007F E041      LDI	R20,1
(0020) 	  delay_nus(60);       //延时100us
    0080 E30C      LDI	R16,0x3C
    0081 E010      LDI	R17,0
    0082 940E036A  CALL	_delay_nus
(0021) 	 return err;
    0084 2F04      MOV	R16,R20
    0085 940E03C4  CALL	pop_gset1
    0087 9508      RET
_DS18B20_WriteBit:
  bitval               --> R20
    0088 940E03C1  CALL	push_gset1
    008A 2F40      MOV	R20,R16
(0022) }
(0023) 
(0024) void DS18B20_WriteBit(byte bitval)
(0025) {
(0026)     DQ_OUT;
    008B 9AA1      SBI	0x14,1
(0027) 	_NOP();
    008C 0000      NOP
(0028) 	_NOP();
    008D 0000      NOP
(0029) 	 DQ_L;//将DQ线拉低,开始写时间隙
    008E 98A9      CBI	0x15,1
(0030) 	 delay_nus(10);      //延时30us
    008F E00A      LDI	R16,0xA
    0090 E010      LDI	R17,0
    0091 940E036A  CALL	_delay_nus
(0031) 	 if(bitval == 1)  //如果写1,DQ线拉高
    0093 3041      CPI	R20,1
    0094 F409      BNE	0x0096
(0032) 	   DQ_H;
    0095 9AA9      SBI	0x15,1
(0033) 	 delay_nus(20);      //延时30us
    0096 E104      LDI	R16,0x14
    0097 E010      LDI	R17,0
    0098 940E036A  CALL	_delay_nus
(0034)      DQ_H;
    009A 9AA9      SBI	0x15,1
    009B 940E03C4  CALL	pop_gset1
    009D 9508      RET
_DS18B20_ReadBit:
  rbit                 --> R20
    009E 940E03C1  CALL	push_gset1
(0035) }
(0036) 
(0037) byte DS18B20_ReadBit(void)
(0038) {
(0039)     byte rbit = 0;
    00A0 2744      CLR	R20
(0040) 	DQ_OUT;
    00A1 9AA1      SBI	0x14,1
(0041) 	_NOP();
    00A2 0000      NOP
(0042) 	_NOP();
    00A3 0000      NOP
(0043) 	 DQ_L;  //将DQ线拉低,开始写时间隙
    00A4 98A9      CBI	0x15,1
(0044)      delay_us();       //延时30us
    00A5 940E0368  CALL	_delay_us
(0045) 	//DQ_H;
(0046) 	// delay_nus(10);      //延时
(0047) 	 DQ_IN;
    00A7 98A1      CBI	0x14,1
(0048) 	 _NOP();
    00A8 0000      NOP
(0049) 	 _NOP();
    00A9 0000      NOP
(0050) 	// 
(0051) 	 if(DQ_IN_H)
    00AA B383      IN	R24,0x13
    00AB 7082      ANDI	R24,2
    00AC 3082      CPI	R24,2
    00AD F409      BNE	0x00AF
(0052) 	 rbit =1;
    00AE E041      LDI	R20,1
(0053) 	 delay_nus(40);
    00AF E208      LDI	R16,0x28
    00B0 E010      LDI	R17,0
    00B1 940E036A  CALL	_delay_nus
(0054)      return (rbit);
    00B3 2F04      MOV	R16,R20
    00B4 940E03C4  CALL	pop_gset1
    00B6 9508      RET
_DS18B20_WriteChar:
  temp                 --> R20
  i                    --> R22
  val                  --> R10
    00B7 940E03BD  CALL	push_gset3
    00B9 2EA0      MOV	R10,R16
(0055) }
(0056) 
(0057) void DS18B20_WriteChar(byte val)
(0058) {
(0059)     byte i;
(0060) 	byte temp;
(0061) 	temp = val;
    00BA 2D4A      MOV	R20,R10
(0062) 	for(i = 0;i<8;i++)
    00BB 2766      CLR	R22
    00BC C00F      RJMP	0x00CC
(0063) 	{
(0064) 	    temp =val>>i;
    00BD 2D0A      MOV	R16,R10
    00BE 2F16      MOV	R17,R22
    00BF 940E03DE  CALL	lsr8
    00C1 2F40      MOV	R20,R16
(0065) 		if((temp&0x01) == 0x01)
    00C2 2F84      MOV	R24,R20
    00C3 7081      ANDI	R24,1
    00C4 3081      CPI	R24,1
    00C5 F419      BNE	0x00C9
(0066) 		DS18B20_WriteBit(1);
    00C6 E001      LDI	R16,1
    00C7 DFC0      RCALL	_DS18B20_WriteBit
    00C8 C002      RJMP	0x00CB
(0067) 		else 
(0068) 		DS18B20_WriteBit(0);
    00C9 2700      CLR	R16
    00CA DFBD      RCALL	_DS18B20_WriteBit
    00CB 9563      INC	R22
    00CC 3068      CPI	R22,0x8
    00CD F378      BCS	0x00BD
(0069) 		
(0070) 		
(0071) 	}
(0072) 	
(0073) 	 delay_nus(60);      //延时
    00CE E30C      LDI	R16,0x3C
    00CF E010      LDI	R17,0
    00D0 940E036A  CALL	_delay_nus
    00D2 940E03B3  CALL	pop_gset3
    00D4 9508      RET
_DS18B20_ReadChar:
  R_data               --> R20
  i                    --> R22
    00D5 940E03BF  CALL	push_gset2
(0074) }
(0075) 
(0076) byte DS18B20_ReadChar(void)	   //读一个字节数据函数
(0077) {					    
(0078)   unsigned char i = 0;
    00D7 2766      CLR	R22
(0079)   byte R_data = 0;
    00D8 2744      CLR	R20
(0080)    
(0081)    for (i=0;i<8;i++)
    00D9 C009      RJMP	0x00E3
(0082)     {
(0083) 	  if(DS18B20_ReadBit())
    00DA DFC3      RCALL	_DS18B20_ReadBit
    00DB 2300      TST	R16
    00DC F029      BEQ	0x00E2
(0084) 	    R_data |=1<<i;
    00DD E001      LDI	R16,1
    00DE 2F16      MOV	R17,R22
    00DF 940E03D8  CALL	lsl8
    00E1 2B40      OR	R20,R16
    00E2 9563      INC	R22
    00E3 3068      CPI	R22,0x8
    00E4 F3A8      BCS	0x00DA
(0085)     }
(0086)     return (R_data);
    00E5 2F04      MOV	R16,R20
    00E6 940E03B0  CALL	pop_gset2
    00E8 9508      RET
_ReadTemperature:
  tempValue            --> R20
  Rom                  --> Y+0
    00E9 940E03C1  CALL	push_gset1
    00EB 9722      SBIW	R28,2
(0087) }
(0088) 
(0089) unsigned int ReadTemperature(void)	 //读取温度函数
(0090) {
(0091) 	 byte Rom[2];
(0092)      unsigned int tempValue;
(0093) 	 if(DS18B20_Reset())
    00EC DF7E      RCALL	_DS18B20_Reset
    00ED 2300      TST	R16
    00EE F019      BEQ	0x00F2
(0094) 	 {
(0095) 		return 0xffff;
    00EF EF0F      LDI	R16,0xFF
    00F0 EF1F      LDI	R17,0xFF
    00F1 C023      RJMP	0x0115
(0096) 	 }
(0097)      DS18B20_WriteChar(0xcc) ;  //跳过读序号列号的操作
    00F2 EC0C      LDI	R16,0xCC
    00F3 DFC3      RCALL	_DS18B20_WriteChar
(0098)      DS18B20_WriteChar(0x44) ;  //启动温度转换
    00F4 E404      LDI	R16,0x44
    00F5 DFC1      RCALL	_DS18B20_WriteChar
(0099) 	 delay_nus(100); 
    00F6 E604      LDI	R16,0x64
    00F7 E010      LDI	R17,0
    00F8 940E036A  CALL	_delay_nus
(0100)       if(DS18B20_Reset())
    00FA DF70      RCALL	_DS18B20_Reset
    00FB 2300      TST	R16
    00FC F019      BEQ	0x0100
(0101) 	 {
(0102) 		return 0xffff;
    00FD EF0F      LDI	R16,0xFF
    00FE EF1F      LDI	R17,0xFF
    00FF C015      RJMP	0x0115
(0103) 	 }
(0104)      DS18B20_WriteChar(0xCC) ;  //跳过读序号列号的操作
    0100 EC0C      LDI	R16,0xCC
    0101 DFB5      RCALL	_DS18B20_WriteChar
(0105)      DS18B20_WriteChar(0xBE) ;  //读取温度寄存器
    0102 EB0E      LDI	R16,0xBE
    0103 DFB3      RCALL	_DS18B20_WriteChar
(0106)       delay_nus(200); 
    0104 EC08      LDI	R16,0xC8
    0105 E010      LDI	R17,0
    0106 940E036A  CALL	_delay_nus
(0107)      Rom[0] = DS18B20_ReadChar() ;   //读温度低8位
    0108 DFCC      RCALL	_DS18B20_ReadChar
    0109 8308      STD	Y+0,R16
(0108)      Rom[1] = DS18B20_ReadChar() ;   //读温度高8位 
    010A DFCA      RCALL	_DS18B20_ReadChar
    010B 8309      STD	Y+1,R16
(0109) 	/* *tempValue = Rom[1];
(0110) 	 *tempValue <<= 8;
(0111) 	 *tempValue |= Rom[0];*/
(0112) 	 tempValue = Rom[1];
    010C 2F40      MOV	R20,R16
    010D 2755      CLR	R21
(0113) 	 tempValue <<= 8;
    010E 2F54      MOV	R21,R20
    010F 2744      CLR	R20
(0114) 	 tempValue |= Rom[0];
    0110 8028      LDD	R2,Y+0
    0111 2433      CLR	R3
    0112 2942      OR	R20,R2
    0113 2953      OR	R21,R3
(0115) 	 return tempValue;
    0114 018A      MOVW	R16,R20
    0115 9622      ADIW	R28,2
    0116 940E03C4  CALL	pop_gset1
    0118 9508      RET
FILE: F:\avr最小系统板\程序代码\ex15_ds18b20_1602\lm1602.c
(0001) #include "lm1602.h"
(0002) #include "string.h"
(0003) #include <macros.h>
(0004) 
(0005) 
(0006) /*自定义字符*/
(0007) byte  CGRAMtab[] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
(0008) 
(0009) 
(0010) void LcdInit(void);
(0011) void DisplayTime(byte hour,byte minute,byte second);
(0012) 
(0013) unsigned char CheckBusy(void)
(0014) {
(0015)     
(0016)     DDRB = 0x00;
_CheckBusy:
    0119 2422      CLR	R2
    011A BA27      OUT	0x17,R2
(0017) 	NOP();
    011B 0000      NOP
(0018) 	NOP();
    011C 0000      NOP
(0019) 	NOP();
    011D 0000      NOP
(0020) 	NOP();
    011E 0000      NOP
(0021) 	NOP();
    011F 0000      NOP
(0022) 	NOP();
    0120 0000      NOP
(0023) 	NOP();
    0121 0000      NOP
(0024) 	NOP();
    0122 0000      NOP
(0025) 	RS_L;
    0123 98DD      CBI	0x1B,5
(0026) 	RW_H;
    0124 9ADE      SBI	0x1B,6
(0027) 	EN_H;
    0125 9ADF      SBI	0x1B,7
(0028) 	NOP();
    0126 0000      NOP
(0029) 	NOP();
    0127 0000      NOP
(0030) 	NOP();
    0128 0000      NOP
(0031) 	NOP();
    0129 0000      NOP
(0032) 	 EN_L;
    012A 98DF      CBI	0x1B,7
(0033) 	if((PINB&0x80)==0x80)
    012B B386      IN	R24,0x16
    012C 7880      ANDI	R24,0x80
    012D 3880      CPI	R24,0x80
    012E F421      BNE	0x0133
(0034) 	{
(0035) 	   DDRB = 0xFF;
    012F EF8F      LDI	R24,0xFF
    0130 BB87      OUT	0x17,R24
(0036) 	   return 1;
    0131 E001      LDI	R16,1
    0132 C003      RJMP	0x0136
(0037) 	}
(0038) 	else
(0039) 	{
(0040) 	   DDRB = 0xFF;
    0133 EF8F      LDI	R24,0xFF
    0134 BB87      OUT	0x17,R24
(0041) 	   return 0;
    0135 2700      CLR	R16
    0136 9508      RET
(0042) 	 }
(0043) 	
(0044) }
(0045) 
(0046) void delay(void)
(0047) {
(0048)   unsigned int t;
(0049)   for(t=0;t<1000;t++);
_delay:
  t                    --> R16
    0137 2700      CLR	R16
    0138 2711      CLR	R17
    0139 C002      RJMP	0x013C
    013A 5F0F      SUBI	R16,0xFF
    013B 4F1F      SBCI	R17,0xFF
    013C 3E08      CPI	R16,0xE8
    013D E0E3      LDI	R30,3
    013E 071E      CPC	R17,R30
    013F F3D0      BCS	0x013A
    0140 9508      RET
_WriteCmd:
  cmd                  --> R20
    0141 940E03C1  CALL	push_gset1
    0143 2F40      MOV	R20,R16
(0050) }
(0051) 
(0052) void WriteCmd(byte cmd)
(0053) {
(0054)  
(0055) 	RS_L;
    0144 98DD      CBI	0x1B,5
(0056) 	RW_L; 
    0145 98DE      CBI	0x1B,6
(0057) 	DATAPORT = cmd;	 
    0146 BB48      OUT	0x18,R20
(0058) 	EN_H; 
    0147 9ADF      SBI	0x1B,7
(0059) 	 //while(CheckBusy());
(0060) 	delay();
    0148 DFEE      RCALL	_delay
(0061) 	EN_L;
    0149 98DF      CBI	0x1B,7
    014A 940E03C4  CALL	pop_gset1
    014C 9508      RET
_WriteData:
  datas                --> R20
    014D 940E03C1  CALL	push_gset1
    014F 2F40      MOV	R20,R16
(0062) 	}
(0063) 
(0064) void WriteData(byte datas)
(0065) {
(0066) 	RS_H;
    0150 9ADD      SBI	0x1B,5
(0067) 	RW_L;
    0151 98DE      CBI	0x1B,6
(0068) 	DATAPORT = datas;
    0152 BB48      OUT	0x18,R20
(0069) 	EN_H; 
    0153 9ADF      SBI	0x1B,7
(0070)     delay();
    0154 DFE2      RCALL	_delay
(0071) 	EN_L;
    0155 98DF      CBI	0x1B,7
    0156 940E03C4  CALL	pop_gset1
    0158 9508      RET
_LCD_WriteCGRAM:
  i                    --> R20
  len                  --> R22
  cgram                --> R10
    0159 940E03BD  CALL	push_gset3
    015B 2F62      MOV	R22,R18
    015C 0158      MOVW	R10,R16
(0072) }
(0073) 
(0074) void  LCD_WriteCGRAM(byte *cgram,byte len)  //自定义字符写入CGRAM函数
(0075) {  
(0076)    byte i ;
(0077)    WriteCmd(0x40) ;  //写CGRAM
    015D E400      LDI	R16,0x40
    015E DFE2      RCALL	_WriteCmd
(0078)     for (i = 0 ; i< len ; i++)       
    015F 2744      CLR	R20
    0160 C007      RJMP	0x0168
(0079)      WriteData(*(cgram+i)) ;        
    0161 2FE4      MOV	R30,R20
    0162 27FF      CLR	R31
    0163 0DEA      ADD	R30,R10
    0164 1DFB      ADC	R31,R11
    0165 8100      LDD	R16,Z+0
    0166 DFE6      RCALL	_WriteData
    0167 9543      INC	R20
    0168 1746      CP	R20,R22
    0169 F3B8      BCS	0x0161
    016A 940E03B3  CALL	pop_gset3
    016C 9508      RET
(0080) }
(0081) 
(0082) 
(0083) void ClearLcd(void)
(0084) {
(0085)     WriteCmd(CLR_DIS);
_ClearLcd:
    016D E001      LDI	R16,1
    016E DFD2      RCALL	_WriteCmd
    016F 9508      RET
(0086) }

⌨️ 快捷键说明

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