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

📄 echo.lst

📁 用的avr icc 开发的atmega16的超声波测距仪模型。
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0048) {
(0049)    unsigned char i;
(0050)    unsigned char retVal=0;
    0182 2744      CLR	R20
(0051)    RLS_DS18B20;		   //释放总线
    0183 98A1      CBI	0x14,1
(0052)    for(i=8;i>0;i--)
    0184 E068      LDI	R22,0x8
    0185 C00F      RJMP	0x0195
(0053)    {
(0054)       retVal>>=1;
    0186 9546      LSR	R20
(0055)       HLD_DS18B20;	   //Maga16控制总线
    0187 9AA1      SBI	0x14,1
(0056)       CLR_DS18B20;	   //强制拉低
    0188 98A9      CBI	0x15,1
(0057)      ds_delay(2);	   //延时大于1us
    0189 E002      LDI	R16,2
    018A DFA3      RCALL	_ds_delay
(0058)       SET_DS18B20;	   //释放总线,DS18B20会将总线强制拉低
    018B 9AA9      SBI	0x15,1
(0059)       //delay_nus(8);
(0060) 	  RLS_DS18B20;		//释放总线
    018C 98A1      CBI	0x14,1
(0061)       if(STU_DS18B20)
    018D 9B99      SBIS	0x13,1
    018E C001      RJMP	0x0190
(0062)          retVal|=0x80;
    018F 6840      ORI	R20,0x80
(0063)        ds_delay(50); 	//31us
    0190 E302      LDI	R16,0x32
    0191 DF9C      RCALL	_ds_delay
(0064)       HLD_DS18B20;		//释放总线
    0192 9AA1      SBI	0x14,1
(0065) 	  SET_DS18B20;	   //释放总线,DS18B20会将总线强制拉低
    0193 9AA9      SBI	0x15,1
    0194 956A      DEC	R22
    0195 2422      CLR	R2
    0196 1626      CP	R2,R22
    0197 F370      BCS	0x0186
(0066)       //delay_nus(30);	 	//30.38us
(0067)    }
(0068)    ds_delay(5); 	//2.71us(大于1us就行了)
    0198 E005      LDI	R16,5
    0199 DF94      RCALL	_ds_delay
(0069)    return(retVal);
    019A 2F04      MOV	R16,R20
    019B D279      RCALL	pop_gset2
    019C 9508      RET
_writeByteDS18B20:
  temp                 --> R20
  i                    --> R22
  wb                   --> R10
    019D D295      RCALL	push_gset3
    019E 2EA0      MOV	R10,R16
(0070) }
(0071) 
(0072) /**********************************************************************
(0073) functionName: unsigned char readByteDS18B20(void)
(0074) description :写DS18B20一个字节
(0075) **********************************************************************/
(0076) void writeByteDS18B20(unsigned char wb)
(0077) {
(0078)    unsigned char i;
(0079)    unsigned char temp;
(0080)    RLS_DS18B20;	         	//释放总线
    019F 98A1      CBI	0x14,1
(0081)    for(i=0;i<8;i++)
    01A0 2766      CLR	R22
    01A1 C013      RJMP	0x01B5
(0082)    {
(0083)       HLD_DS18B20;		//Maga16控制总线
    01A2 9AA1      SBI	0x14,1
(0084)       CLR_DS18B20;		//强制拉低
    01A3 98A9      CBI	0x15,1
(0085)       ds_delay(6); 	//14.92us
    01A4 E006      LDI	R16,6
    01A5 DF88      RCALL	_ds_delay
(0086) 	  //SET_DS18B20;		//释放总线
(0087) 	  //delay_nus(16);	 	//14.92us
(0088)       temp=wb>>i;
    01A6 2D0A      MOV	R16,R10
    01A7 2F16      MOV	R17,R22
    01A8 D2BB      RCALL	lsr8
    01A9 2F40      MOV	R20,R16
(0089)       temp&=0x01;
    01AA 7041      ANDI	R20,1
(0090)       if(temp)
    01AB F011      BEQ	0x01AE
(0091)          SET_DS18B20;		//释放总线
    01AC 9AA9      SBI	0x15,1
    01AD C001      RJMP	0x01AF
(0092)       else
(0093)          CLR_DS18B20;		//强制拉低
    01AE 98A9      CBI	0x15,1
(0094)    ds_delay(50);	//30.38us
    01AF E302      LDI	R16,0x32
    01B0 DF7D      RCALL	_ds_delay
(0095)       //RLS_DS18B20;		//释放总线
(0096) 	  SET_DS18B20;		//释放总线
    01B1 9AA9      SBI	0x15,1
(0097)     ds_delay(5); 	//2.71us(大于1us就行了)
    01B2 E005      LDI	R16,5
    01B3 DF7A      RCALL	_ds_delay
    01B4 9563      INC	R22
    01B5 3068      CPI	R22,0x8
    01B6 F358      BCS	0x01A2
(0098)    }
(0099) }
    01B7 D25F      RCALL	pop_gset3
    01B8 9508      RET
_readTempDS18B20:
  x                    --> R20
  tempH                --> R20
  tempL                --> R22
    01B9 D276      RCALL	push_gset2
(0100) 
(0101) /**********************************************************************
(0102) functionName: unsigned int readTempDS18B20(void)
(0103) description :读DS18B20温度
(0104) **********************************************************************/
(0105) unsigned int readTempDS18B20(void)
(0106) {
(0107)    unsigned char tempL,tempH;
(0108)    unsigned int x;
(0109)    //resetDS18B20();
(0110)    //writeByteDS18B20(0xcc); 	//跳过ROM
(0111)    //writeByteDS18B20(0x44);	//启动温度转换
(0112)    delay_nms(1);          //等待1ms
    01BA E001      LDI	R16,1
    01BB E010      LDI	R17,0
    01BC DF8F      RCALL	_delay_nms
(0113)    resetDS18B20();
    01BD DF9B      RCALL	_resetDS18B20
(0114)    writeByteDS18B20(0xcc);	//跳过ROM
    01BE EC0C      LDI	R16,0xCC
    01BF DFDD      RCALL	_writeByteDS18B20
(0115)    writeByteDS18B20(0xbe);	//读数据
    01C0 EB0E      LDI	R16,0xBE
    01C1 DFDB      RCALL	_writeByteDS18B20
(0116)    tempL=readByteDS18B20();
    01C2 DFBE      RCALL	_readByteDS18B20
    01C3 2F60      MOV	R22,R16
(0117)    tempH=readByteDS18B20();
    01C4 DFBC      RCALL	_readByteDS18B20
    01C5 2F40      MOV	R20,R16
(0118)    x=(tempH<<8)|tempL;
    01C6 2F54      MOV	R21,R20
    01C7 2F46      MOV	R20,R22
(0119)    resetDS18B20();
    01C8 DF90      RCALL	_resetDS18B20
(0120)    writeByteDS18B20(0xcc); 	//跳过ROM
    01C9 EC0C      LDI	R16,0xCC
    01CA DFD2      RCALL	_writeByteDS18B20
(0121)    writeByteDS18B20(0x44);	//启动温度转换
    01CB E404      LDI	R16,0x44
    01CC DFD0      RCALL	_writeByteDS18B20
(0122)    return(x);
    01CD 018A      MOVW	R16,R20
    01CE D246      RCALL	pop_gset2
    01CF 9508      RET
_BCDtoASCII:
  j                    --> R20
  i                    --> R22
  pstr                 --> R18
  cBCD                 --> R16
    01D0 D25F      RCALL	push_gset2
(0123) }
(0124) //压缩BCD码转换成ASCII码
(0125) void BCDtoASCII(unsigned char cBCD,unsigned char *pstr)
(0126) {
(0127)    unsigned char i,j;
(0128)    i=cBCD>>4;
    01D1 2F60      MOV	R22,R16
    01D2 9562      SWAP	R22
    01D3 706F      ANDI	R22,0xF
(0129)    j=cBCD&0x0F;
    01D4 2F40      MOV	R20,R16
    01D5 704F      ANDI	R20,0xF
(0130)    *pstr++=i+0x30;
    01D6 2F86      MOV	R24,R22
    01D7 5D80      SUBI	R24,0xD0
    01D8 01F9      MOVW	R30,R18
    01D9 9381      ST	R24,Z+
    01DA 019F      MOVW	R18,R30
(0131)    *pstr=j+0x30;
    01DB 2F84      MOV	R24,R20
    01DC 5D80      SUBI	R24,0xD0
    01DD 8380      STD	Z+0,R24
(0132) }
    01DE D236      RCALL	pop_gset2
    01DF 9508      RET
_Read_Temp:
  temp                 --> R20
    01E0 D238      RCALL	push_gset1
(0133) //读取当前温度并解释
(0134) void Read_Temp(void)
(0135) {
(0136)    unsigned int temp=0;
    01E1 2744      CLR	R20
    01E2 2755      CLR	R21
(0137)    temp=readTempDS18B20();
    01E3 DFD5      RCALL	_readTempDS18B20
    01E4 01A8      MOVW	R20,R16
(0138)    BCDtoASCII((temp>>8)&0x0F,&temp_buf[0]);					
    01E5 EB25      LDI	R18,0xB5
    01E6 E030      LDI	R19,0
    01E7 940E04C1  CALL	0x4C1
    01E9 DFE6      RCALL	_BCDtoASCII
(0139)    BCDtoASCII((temp>>8)&0x0F,&temp_buf[1]);
    01EA EB26      LDI	R18,0xB6
    01EB E030      LDI	R19,0
    01EC 018A      MOVW	R16,R20
    01ED 940E04C1  CALL	0x4C1
    01EF DFE0      RCALL	_BCDtoASCII
(0140)    BCDtoASCII((temp>>4)&0x0F,&temp_buf[2]);					
    01F0 EB27      LDI	R18,0xB7
    01F1 E030      LDI	R19,0
    01F2 018A      MOVW	R16,R20
    01F3 9516      LSR	R17
    01F4 9507      ROR	R16
    01F5 9516      LSR	R17
    01F6 9507      ROR	R16
    01F7 9516      LSR	R17
    01F8 9507      ROR	R16
    01F9 9516      LSR	R17
    01FA 9507      ROR	R16
    01FB 700F      ANDI	R16,0xF
    01FC 7010      ANDI	R17,0
    01FD DFD2      RCALL	_BCDtoASCII
(0141)    BCDtoASCII(temp&0x0F,&temp_buf[3]);					
    01FE EB28      LDI	R18,0xB8
    01FF E030      LDI	R19,0
    0200 2F04      MOV	R16,R20
    0201 700F      ANDI	R16,0xF
    0202 7010      ANDI	R17,0
    0203 DFCC      RCALL	_BCDtoASCII
(0142) }
    0204 D217      RCALL	pop_gset1
    0205 9508      RET
FILE: D:\NEW\ECHO\LCD.c
(0001) // ************************************************
(0002) // *** 采用4位数据线的1602液晶驱动程序 ***
(0003) // *** LCD.C ***
(0004) // ************************************************
(0005) #define ENABLE_BIT_DEFINITIONS
(0006) #define LCD_C
(0007) #include "includes.h"
(0008) // ***** Define I/O pins ***** //
(0009) #define BIT7 0x80
(0010) #define BIT6 0x40
(0011) #define BIT5 0x20
(0012) #define BIT4 0x10
(0013) #define BIT3 0x08
(0014) #define BIT2 0x04
(0015) #define BIT1 0x02
(0016) #define BIT0 0x01
(0017) 
(0018) 
(0019)  #define LCD_EN  (1 << 2)     //引脚定义
(0020)  #define LCD_RS (1 << 0)
(0021)  #define LCD_RW (1 << 1)
(0022)  
(0023)  #define lcd_set_e()  (LCD_OP_PORT |= LCD_EN)   //置位与清零
(0024)  #define lcd_set_rs() (LCD_OP_PORT |= LCD_RS)
(0025)  #define lcd_set_rw() (LCD_OP_PORT |= LCD_RW)
(0026)  #define lcd_clear_e()  (LCD_OP_PORT &= ~LCD_EN)
(0027)  #define lcd_clear_rs() (LCD_OP_PORT &= ~LCD_RS)
(0028)  #define lcd_clear_rw() (LCD_OP_PORT &= ~LCD_RW)
(0029) /****************************************************************/
(0030) 
(0031) #define LCD_ON 0x0C
(0032) #define LCD_CURS_ON 0x0D
(0033) #define LCD_OFF 0x08
(0034) #define LCD_HOME 0x02
(0035) #define LCD_CLEAR 0x01
(0036) #define LCD_NEW_LINE 0xC0
(0037) #define LCD_FUNCTION_SET 0x28
(0038) #define LCD_MODE_SET 0x06
(0039) 
(0040) 
(0041) void LCD_INIT(void)
(0042) {
(0043) LCD_DIR_PORT = 0xff; // LCD port output
_LCD_INIT:
    0206 EF8F      LDI	R24,0xFF
    0207 BB8A      OUT	0x1A,R24
(0044) LCD_OP_PORT = 0x30; // Load high-data to port
    0208 E380      LDI	R24,0x30
    0209 BB8B      OUT	0x1B,R24
(0045) lcd_clear_rw(); // Set LCD to write
    020A 98D9      CBI	0x1B,1
(0046) lcd_clear_rs(); // Set LCD to command
    020B 98D8      CBI	0x1B,0
    020C 940E0471  CALL	0x471
(0047) lcd_set_e(); // Write data to LCD
(0048) asm("nop");
(0049) asm("nop");
(0050) lcd_clear_e(); // Disable LCD
(0051) delay_nus(40);
    020E E208      LDI	R16,0x28
    020F E010      LDI	R17,0
    0210 DF24      RCALL	_delay_nus
(0052) lcd_clear_rw() ; // Set LCD to write
    0211 98D9      CBI	0x1B,1
(0053) lcd_clear_rs(); // Set LCD to command
    0212 98D8      CBI	0x1B,0
    0213 940E0471  CALL	0x471
(0054) lcd_set_e(); // Write data to LCD
(0055) asm("nop");
(0056) asm("nop");
(0057) lcd_clear_e(); // Disable LCD
(0058) delay_nus(40);
    0215 E208      LDI	R16,0x28
    0216 E010      LDI	R17,0
    0217 DF1D      RCALL	_delay_nus
    0218 940E0471  CALL	0x471
(0059) lcd_set_e(); // Write data to LCD
(0060) asm("nop");
(0061) asm("nop");
(0062) lcd_clear_e(); // Disable LCD
(0063) delay_nus(40);
    021A E208      LDI	R16,0x28
    021B E010      LDI	R17,0
    021C DF18      RCALL	_delay_nus
(0064) LCD_OP_PORT = 0x20;
    021D E280      LDI	R24,0x20
    021E BB8B      OUT	0x1B,R24
    021F 940E0471  CALL	0x471
(0065) lcd_set_e(); // Write data to LCD
(0066) asm("nop");
(0067) asm("nop");
(0068) lcd_clear_e(); // Disable LCD
(0069) delay_nus(40);
    0221 E208      LDI	R16,0x28
    0222 E010      LDI	R17,0
(0070) }
    0223 CF11      RJMP	_delay_nus
_LCD_Busy:
  low                  --> R20
  high                 --> R22
  temp                 --> R10
    0224 D20E      RCALL	push_gset3
(0071) //*****************************************************//
(0072) // This routine will return the busy flag from the LCD //
(0073) //*****************************************************//
(0074) void LCD_Busy ( void )
(0075) {
(0076) unsigned char temp,high;
(0077) unsigned char low;
(0078) LCD_DIR_PORT = 0x0f; // Make I/O Port input
    0225 E08F      LDI	R24,0xF
    0226 BB8A      OUT	0x1A,R24
(0079) do
(0080) {
(0081) temp=LCD_OP_PORT;
    0227 B2AB      IN	R10,0x1B
(0082) temp=temp&BIT3;
    0228 2D8A      MOV	R24,R10
    0229 7088      ANDI	R24,0x8
    022A 2EA8      MOV	R10,R24
(0083) LCD_OP_PORT=temp;
    022B BB8B      OUT	0x1B,R24
(0084) lcd_set_rw(); // Set LCD to READ
    022C 9AD9      SBI	0x1B,1
(0085) lcd_clear_rs();
    022D 98D8      CBI	0x1B,0
(0086) lcd_set_e();
    022E 9ADA      SBI	0x1B,2
(0087) delay_nus(3);
    022F E003      LDI	R16,3
    0230 E010      LDI	R17,0
    0231 DF03      RCALL	_delay_nus
(0088) high = LCD_IP_PORT; // read the high nibble.
    0232 B369      IN	R22,0x19
(0089) lcd_clear_e(); // Disable LCD
    0233 98DA      CBI	0x1B,2
(0090) lcd_set_e();
    0234 9ADA      SBI	0x1B,2
(0091) asm("nop");
    0235 0000      NOP
(0092) asm("nop");
    0236 0000      NOP
(0093) low = LCD_IP_PORT; // read the low nibble.
    0237 B349      IN	R20,0x19
(0094) lcd_clear_e(); // Disable LCD
    0238 98DA      CBI	0x1B,2
(0095) } while(high & 0x80);
    0239 FD67      SBRC	R22,7
    023A CFEC      RJMP	0x0227
(0096) delay_nus(20);
    023B E104      LDI	R16,0x14
    023C E010      LDI	R17,0
    023D DEF7      RCALL	_delay_nus
(0097) }
    023E D1D8      RCALL	pop_gset3
    023F 9508      RET
_LCD_WriteControl:
  temp                 --> R20
  CMD                  --> R22
    0240 D1EF      RCALL	push_gset2
    0241 2F60      MOV	R22,R16
(0098) // ********************************************** //
(0099) // *** Write a control instruction to the LCD *** //
(0100) // ********************************************** //
(0101) void LCD_WriteControl (unsigned char CMD)
(0102) {
(0103) char temp;
(0104) LCD_Busy(); // Test if LCD busy
    0242 DFE1      RCALL	_LCD_Busy
    0243 940E0489  CALL	0x489
(0105) LCD_DIR_PORT = 0xff; // LCD port output
(0106) temp=LCD_OP_PORT;
(0107) temp=temp&BIT3;
(0108) LCD_OP_PORT =(CMD & 0xf0)|temp; // Load high-data to port
(0109) lcd_clear_rw(); // Set LCD to write
(0110) lcd_clear_rs(); // Set LCD to command
    0245 98D8      CBI	0x1B,0
    0246 940E0471  CALL	0x471
    0248 940E04BA  CALL	0x4BA
(0111) lcd_set_e(); // Write data to LCD
(0112) asm("nop");
(0113) asm("nop");
(0114) lcd_clear_e(); // Disable LCD
(0115) LCD_OP_PORT =(CMD<<4)|temp; // Load low-data to port
(0116) lcd_clear_rw(); // Set LCD to write
(0117) lcd_clear_rs(); // Set LCD to command
    024A 98D8      CBI	0x1B,0
    024B 940E0471  CALL	0x471
(0118) lcd_set_e(); // Write data to LCD
(0119) asm("nop");
(0120) asm("nop");
(0121) lcd_clear_e(); // Disable LCD
(0122) }
    024D D1C7      RCALL	pop_gset2
    024E 9508      RET
_LCD_WriteData:
  temp                 --> R20
  Data                 --> R22
    024F D1E0      RCALL	push_gset2
    0250 2F60      MOV	R22,R16
(0123) // ***************************************** //
(0124) // *** Write one byte of data to the LCD *** //
(0125) // ***************************************** //
(0126) void LCD_WriteData (unsigned char Data)
(0127) {
(0128) char temp;
(0129) LCD_Busy(); // Test if LCD Busy
    0251 DFD2      RCALL	_LCD_Busy
    0252 940E0489  CALL	0x489
(0130) LCD_DIR_PORT = 0xFF; // LCD port output
(0131) temp=LCD_OP_PORT;
(0132) temp=temp&BIT3;
(0133) LCD_OP_PORT =(Data & 0xf0)|temp; // Load high-data to port
(0134) lcd_clear_rw() ; // Set LCD to write

⌨️ 快捷键说明

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