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

📄 ds18b20_lcd.lst

📁 基于AVR单片机的DS18B20测温程序.
💻 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 ECE0      LDI	R30,0xC0
    0054 E0F0      LDI	R31,0
    0055 E010      LDI	R17,0
    0056 3CE5      CPI	R30,0xC5
    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 E3E4      LDI	R30,0x34
    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 D194      RCALL	_main
_exit:
    0069 CFFF      RJMP	_exit
_process:
  p                    --> R10
  i                    --> Y+6
    006A D1B1      RCALL	push_arg4
    006B D22D      RCALL	push_gset3
    006C 84AA      LDD	R10,Y+10
    006D 84BB      LDD	R11,Y+11
FILE: E:\CRAZY\调试AVR_C\电升06~1\DS18B20.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define LCM_Data  PORTB
(0005) #define Busy    0x80
(0006) 
(0007) #define  Set_DQ1        DDRC |= 0x08;  PORTC |= 0x08;         //总线拉高
(0008) #define  Set_DQ0        DDRC |= 0x08;  PORTC &= 0xf7;         //总线置低
(0009) #define  Read_DQ        PINC&0x08                             //读总线
(0010) #define  MatchROM       0xcc                                  //匹配ROM
(0011) #define  WriteMode      0x4e                                  //写模式
(0012) #define  TH             0x64                                  //设置温度上限100
(0013) #define  TL             0x8a                                  //设置温度下限-10
(0014) #define  MatchTemp      0x7f                                  //写温度匹配寄存器,12bit
(0015) #define  ConverTem      0x44                                  //DS18B20温度转换命令
(0016) #define  Get_Value      0xbe                                  //读取温度寄存器值
(0017) uchar data[5];
(0018) 
(0019) void process(long int i,uchar*p)
(0020) {
(0021) p[0]=i/1000;
    006E EE48      LDI	R20,0xE8
    006F E053      LDI	R21,3
    0070 D384      RCALL	0x03F5
    0071 D1B2      RCALL	div32s
    0072 01F5      MOVW	R30,R10
    0073 8300      STD	Z+0,R16
(0022) i=i%1000;
    0074 EE48      LDI	R20,0xE8
    0075 E053      LDI	R21,3
    0076 D37E      RCALL	0x03F5
    0077 D1AE      RCALL	mod32s
    0078 D399      RCALL	0x0412
(0023) p[1]=i/100;
    0079 E644      LDI	R20,0x64
    007A E050      LDI	R21,0
    007B D379      RCALL	0x03F5
    007C D1A7      RCALL	div32s
    007D 01F5      MOVW	R30,R10
    007E 8301      STD	Z+1,R16
(0024) i=i%100;
    007F E644      LDI	R20,0x64
    0080 E050      LDI	R21,0
    0081 D373      RCALL	0x03F5
    0082 D1A3      RCALL	mod32s
    0083 D38E      RCALL	0x0412
(0025) p[2]=i/10;
    0084 E04A      LDI	R20,0xA
    0085 E050      LDI	R21,0
    0086 D36E      RCALL	0x03F5
    0087 D19C      RCALL	div32s
    0088 01F5      MOVW	R30,R10
    0089 8302      STD	Z+2,R16
(0026) i=i%10;
    008A E04A      LDI	R20,0xA
    008B E050      LDI	R21,0
    008C D368      RCALL	0x03F5
    008D D198      RCALL	mod32s
    008E D383      RCALL	0x0412
(0027) p[3]=i;
    008F 01FE      MOVW	R30,R28
    0090 8026      LDD	R2,Z+6
    0091 8037      LDD	R3,Z+7
    0092 01F5      MOVW	R30,R10
    0093 8223      STD	Z+3,R2
(0028) for(i=0;i<4;i++)
    0094 E040      LDI	R20,0
    0095 E050      LDI	R21,0
    0096 E060      LDI	R22,0
    0097 E070      LDI	R23,0
    0098 01FE      MOVW	R30,R28
    0099 8346      STD	Z+6,R20
    009A 8357      STD	Z+7,R21
    009B 8760      STD	Z+8,R22
    009C 8771      STD	Z+9,R23
(0029) p[i]+=0x30;
    009D 01FE      MOVW	R30,R28
    009E 8026      LDD	R2,Z+6
    009F 8037      LDD	R3,Z+7
    00A0 0C2A      ADD	R2,R10
    00A1 1C3B      ADC	R3,R11
    00A2 01F1      MOVW	R30,R2
    00A3 8180      LDD	R24,Z+0
    00A4 5D80      SUBI	R24,0xD0
    00A5 8380      STD	Z+0,R24
    00A6 E041      LDI	R20,1
    00A7 E050      LDI	R21,0
    00A8 D35A      RCALL	0x0403
    00A9 0E24      ADD	R2,R20
    00AA 1E35      ADC	R3,R21
    00AB 1E46      ADC	R4,R22
    00AC 1E57      ADC	R5,R23
    00AD 01FE      MOVW	R30,R28
    00AE 8226      STD	Z+6,R2
    00AF 8237      STD	Z+7,R3
    00B0 8640      STD	Z+8,R4
    00B1 8651      STD	Z+9,R5
    00B2 E044      LDI	R20,4
    00B3 E050      LDI	R21,0
    00B4 D34E      RCALL	0x0403
    00B5 1624      CP	R2,R20
    00B6 0635      CPC	R3,R21
    00B7 0646      CPC	R4,R22
    00B8 0657      CPC	R5,R23
    00B9 F40C      BGE	0x00BB
    00BA CFE2      RJMP	0x009D
(0030) p[4]='$'; 
    00BB E284      LDI	R24,0x24
    00BC 01F5      MOVW	R30,R10
    00BD 8384      STD	Z+4,R24
    00BE D1D2      RCALL	pop_gset3
    00BF 9624      ADIW	R28,4
    00C0 9508      RET
_delayms:
  j                    --> R20
  i                    --> R16
    00C1 D1DB      RCALL	push_gset1
(0031) }
(0032) 
(0033) 
(0034) void delayms(uint i)
(0035) {
(0036)  uint j;
(0037)  for(;i!=0;i--)
    00C2 C00B      RJMP	0x00CE
(0038)  for(j=0;j<8000;j++)
    00C3 2744      CLR	R20
    00C4 2755      CLR	R21
    00C5 C002      RJMP	0x00C8
    00C6 5F4F      SUBI	R20,0xFF
    00C7 4F5F      SBCI	R21,0xFF
    00C8 3440      CPI	R20,0x40
    00C9 E1EF      LDI	R30,0x1F
    00CA 075E      CPC	R21,R30
    00CB F3D0      BCS	0x00C6
    00CC 5001      SUBI	R16,1
    00CD 4010      SBCI	R17,0
    00CE 3000      CPI	R16,0
    00CF 0701      CPC	R16,R17
    00D0 F791      BNE	0x00C3
    00D1 D1CE      RCALL	pop_gset1
    00D2 9508      RET
(0039)  ;
(0040) }
(0041) 
(0042) void delayus(uint i)
(0043) {
(0044)  for(;i!=0;i--)
_delayus:
  i                    --> R16
    00D3 C002      RJMP	0x00D6
    00D4 5001      SUBI	R16,1
    00D5 4010      SBCI	R17,0
    00D6 3000      CPI	R16,0
    00D7 0701      CPC	R16,R17
    00D8 F7D9      BNE	0x00D4
    00D9 9508      RET
(0045)  ;
(0046) }
(0047)  
(0048)  
(0049)  
(0050) 
(0051) void port_init(void)
(0052) {
(0053)    DDRD  = 0xfe;
_port_init:
    00DA EF8E      LDI	R24,0xFE
    00DB BB81      OUT	0x11,R24
(0054)    PORTD = 0xff;
    00DC EF8F      LDI	R24,0xFF
    00DD BB82      OUT	0x12,R24
(0055)    DDRB  = 0xff;
    00DE BB87      OUT	0x17,R24
(0056)    PORTB = 0xff;
    00DF BB88      OUT	0x18,R24
(0057)    DDRC  = 0xff;
    00E0 BB84      OUT	0x14,R24
(0058)    PORTC = 0xff;
    00E1 BB85      OUT	0x15,R24
    00E2 9508      RET
_WriteDataLCM:
  WDLCM                --> R20
    00E3 D1B9      RCALL	push_gset1
    00E4 2F40      MOV	R20,R16
(0059) }
(0060) 
(0061) 
(0062) /**********************************************************/ 
(0063) //写数据
(0064) void WriteDataLCM(unsigned char WDLCM)
(0065) {
(0066)  //ReadStatusLCM(); //检测忙
(0067)  LCM_Data = WDLCM;
    00E5 BB48      OUT	0x18,R20
(0068)  //PORTC=0B00000100;
(0069)  //PORTC=0B00000100;
(0070)  delayms(1);
    00E6 E001      LDI	R16,1
    00E7 E010      LDI	R17,0
    00E8 DFD8      RCALL	_delayms
(0071)  PORTC=0B00000101;
    00E9 E085      LDI	R24,5
    00EA BB85      OUT	0x15,R24
(0072)  PORTC=0B00000100;
    00EB E084      LDI	R24,4
    00EC BB85      OUT	0x15,R24
    00ED D1B2      RCALL	pop_gset1
    00EE 9508      RET
_WriteCommandLCM:
  BuysC                --> R22
  WCLCM                --> R20
    00EF D1AB      RCALL	push_gset2
    00F0 2F62      MOV	R22,R18
    00F1 2F40      MOV	R20,R16
(0073) }
(0074) 
(0075) //写指令
(0076) void  WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC为0时忽略忙检测
(0077) 
(0078) {
(0079)  if (BuysC) 
    00F2 2366      TST	R22
    00F3 F001      BEQ	0x00F4
(0080)  ;//ReadStatusLCM(); //根据需要检测忙
(0081)  LCM_Data = WCLCM;
    00F4 BB48      OUT	0x18,R20
(0082)  delayms(1);
    00F5 E001      LDI	R16,1
    00F6 E010      LDI	R17,0
    00F7 DFC9      RCALL	_delayms
(0083)  PORTC=0B00000001;
    00F8 E081      LDI	R24,1
    00F9 BB85      OUT	0x15,R24
(0084)  delayms(1);
    00FA E001      LDI	R16,1
    00FB E010      LDI	R17,0
    00FC DFC4      RCALL	_delayms
(0085)  PORTC=0B00000000;
    00FD 2422      CLR	R2
    00FE BA25      OUT	0x15,R2
    00FF D18F      RCALL	pop_gset2
    0100 9508      RET
(0086) }
(0087) 
(0088) //读数据
(0089) unsigned char ReadDataLCM(void)
(0090) {
(0091)  PORTC=0X00000111;
_ReadDataLCM:
    0101 E181      LDI	R24,0x11
    0102 E091      LDI	R25,1
    0103 BB85      OUT	0x15,R24
(0092)  return(LCM_Data);
    0104 B308      IN	R16,0x18
    0105 9508      RET
(0093) }
(0094) 
(0095) //读状态
(0096) 
(0097) 
(0098) void LCMInit(void) //LCM初始化
(0099) {
(0100) /* LCM_Data = 0;
(0101)  WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
(0102)  delayms(5);
(0103)  WriteCommandLCM(0x38,0);
(0104)  delayms(5);
(0105)  WriteCommandLCM(0x38,0);
(0106)  delayms(5);
(0107) */
(0108)  WriteCommandLCM(0x38,0); //显示模式设置,开始要求每次检测忙信号
_LCMInit:
    0106 2722      CLR	R18
    0107 E308      LDI	R16,0x38
    0108 DFE6      RCALL	_WriteCommandLCM
(0109)  //WriteCommandLCM(0x08,0); //关闭显示
(0110)  WriteCommandLCM(0x01,0); //显示清屏
    0109 2722      CLR	R18
    010A E001      LDI	R16,1
    010B DFE3      RCALL	_WriteCommandLCM
(0111)  WriteCommandLCM(0x06,0); // 显示光标移动设置
    010C 2722      CLR	R18
    010D E006      LDI	R16,6
    010E DFE0      RCALL	_WriteCommandLCM
(0112)  WriteCommandLCM(0x0c,0); // 显示开及光标设置
    010F 2722      CLR	R18
    0110 E00C      LDI	R16,0xC
    0111 DFDD      RCALL	_WriteCommandLCM
    0112 9508      RET
_DisplayOneChar:
  DData                --> Y+4
  Y                    --> R22
  X                    --> R20
    0113 D187      RCALL	push_gset2
    0114 2F62      MOV	R22,R18
    0115 2F40      MOV	R20,R16
(0113) }
(0114) 
(0115) /*****************************************************************************/
(0116) 
(0117) 
(0118) //按指定位置显示一个字符
(0119) void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
(0120) {
(0121)  Y &= 0x1;
    0116 7061      ANDI	R22,1
(0122)  X &= 0xF; //限制X不能大于15,Y不能大于1
    0117 704F      ANDI	R20,0xF
(0123)  if (Y) X += 0x40; //当要显示第二行时地址码+0x40;
    0118 2366      TST	R22
    0119 F009      BEQ	0x011B
    011A 5C40      SUBI	R20,0xC0
(0124)  X += 0x80; // 算出指令码
    011B 5840      SUBI	R20,0x80
(0125)  WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
    011C 2722      CLR	R18
    011D 2F04      MOV	R16,R20
    011E DFD0      RCALL	_WriteCommandLCM
(0126)  WriteDataLCM(DData);
    011F 810C      LDD	R16,Y+4
    0120 DFC2      RCALL	_WriteDataLCM
    0121 D16D      RCALL	pop_gset2
    0122 9508      RET
_DisplayListChar:
  ListLength           --> R20
  DData                --> R22
  Y                    --> R10
  X                    --> R12
    0123 D173      RCALL	push_gset4
    0124 2EA2      MOV	R10,R18
    0125 2EC0      MOV	R12,R16
    0126 9721      SBIW	R28,1
    0127 8569      LDD	R22,Y+9
    0128 857A      LDD	R23,Y+10
(0127) }
(0128) 
(0129) //按指定位置显示一串字符
(0130) void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
(0131) {
(0132)  unsigned char ListLength;
(0133) 
(0134)   ListLength = 0;
    0129 2744      CLR	R20
(0135)  Y &= 0x1;
    012A 2D8A      MOV	R24,R10
    012B 7081      ANDI	R24,1
    012C 2EA8      MOV	R10,R24
(0136)  X &= 0xF; //限制X不能大于15,Y不能大于1
    012D 2D8C      MOV	R24,R12
    012E 708F      ANDI	R24,0xF
    012F 2EC8      MOV	R12,R24
    0130 C00B      RJMP	0x013C
(0137)  while (DData[ListLength]!= '$') //若到达字串尾则退出
(0138)   {
(0139)    if (X <= 0xF) //X坐标应小于0xF
    0131 E08F      LDI	R24,0xF
    0132 158C      CP	R24,R12
    0133 F040      BCS	0x013C
    0134 D300      RCALL	0x0435
(0140)     {
(0141)      DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
    0135 8020      LDD	R2,Z+0
    0136 8228      STD	Y+0,R2
    0137 2D2A      MOV	R18,R10
    0138 2D0C      MOV	R16,R12
    0139 DFD9      RCALL	_DisplayOneChar
(0142)      ListLength++;
    013A 9543      INC	R20
(0143)      X++;
    013B 94C3      INC	R12
    013C D2F8      RCALL	0x0435
    013D 8180      LDD	R24,Z+0
    013E 3284      CPI	R24,0x24
    013F F789      BNE	0x0131
    0140 9621      ADIW	R28,1
    0141 D151      RCALL	pop_gset4
    0142 9508      RET
(0144)     }
(0145)   }
(0146) }
(0147) 
(0148) /**********************************************************/ 
(0149) 
(0150) 
(0151) /***************************************************************
(0152) *  功能:主机向总线写0                                         *
(0153) ***************************************************************/
(0154) void Writr0(void)
(0155) {
(0156)    Set_DQ1;
_Writr0:
    0143 D2C7      RCALL	0x040B
(0157)    Set_DQ0;
(0158)    delayus(700);
    0144 EB0C      LDI	R16,0xBC
    0145 E012      LDI	R17,2
    0146 DF8C      RCALL	_delayus
(0159)  
(0160)    Set_DQ1; 
    0147 9AA3      SBI	0x14,3
    0148 9AAB      SBI	0x15,3
(0161)    asm("nop");
    0149 0000      NOP
(0162)    delayus(15);
    014A E00F      LDI	R16,0xF
    014B E010      LDI	R17,0
    014C DF86      RCALL	_delayus
    014D 9508      RET
(0163) }
(0164) 
(0165) /***************************************************************
(0166) *  功能:主机向总线写1                                         *
(0167) ***************************************************************/
(0168) void Writr1(void)
(0169) {
(0170)    Set_DQ1;
_Writr1:
    014E D2BC      RCALL	0x040B
    014F D29C      RCALL	<created procedures>
(0171)    Set_DQ0;
(0172)    asm("nop");
(0173)    asm("nop");
(0174)    asm("nop");
(0175)    asm("nop");
(0176)  asm("nop");
(0177)  asm("nop");
(0178)  asm("nop");
(0179)     asm("nop");
(0180)    asm("nop");
    0150 0000      NOP
    0151 D29A      RCALL	<created procedures>
(0181)    asm("nop");
(0182)    asm("nop");
(0183)    asm("nop");
(0184)    asm("nop");
(0185)    asm("nop");
(0186)    asm("nop");
(0187)    asm("nop");
(0188)    asm("nop");
(0189) 
(0190)    Set_DQ1;
    0152 9AA3      SBI	0x14,3
    0153 9AAB      SBI	0x15,3
(0191)  delayus(30);
    0154 E10E      LDI	R16,0x1E
    0155 E010      LDI	R17,0
    0156 DF7C      RCALL	_delayus
    0157 9508      RET
_WriteBits:
  i                    --> R20
  Byte                 --> R22
    0158 D142      RCALL	push_gset2
    0159 2F60      MOV	R22,R16
(0192) 
(0193) }
(0194)  
(0195) /***************************************************************

⌨️ 快捷键说明

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