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

📄 echo.lst

📁 用的avr icc 开发的atmega16的超声波测距仪模型。
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0135) lcd_set_rs(); // Set LCD to data
    0254 9AD8      SBI	0x1B,0
    0255 940E0471  CALL	0x471
    0257 940E04BA  CALL	0x4BA
(0136) lcd_set_e(); // Write data to LCD
(0137) asm("nop");
(0138) asm("nop");
(0139) lcd_clear_e(); // Disable LCD
(0140) LCD_OP_PORT = (Data << 4)|temp; // Load low-data to port
(0141) lcd_clear_rw() ; // Set LCD to write
(0142) lcd_set_rs(); // Set LCD to data
    0259 9AD8      SBI	0x1B,0
    025A 940E0471  CALL	0x471
(0143) lcd_set_e(); // Write data to LCD
(0144) asm("nop");
(0145) asm("nop");
(0146) lcd_clear_e(); // Disable LCD
(0147) }
    025C D1B8      RCALL	pop_gset2
    025D 9508      RET
(0148) // ********************************* //
(0149) // *** Initialize the LCD driver *** //
(0150) // ********************************* //
(0151) void Init_LCD(void)
(0152) {
(0153) LCD_INIT();
_Init_LCD:
    025E DFA7      RCALL	_LCD_INIT
(0154) LCD_WriteControl (LCD_FUNCTION_SET);
    025F E208      LDI	R16,0x28
    0260 DFDF      RCALL	_LCD_WriteControl
(0155) LCD_WriteControl (LCD_OFF);
    0261 E008      LDI	R16,0x8
    0262 DFDD      RCALL	_LCD_WriteControl
(0156) LCD_WriteControl (LCD_CLEAR);
    0263 E001      LDI	R16,1
    0264 DFDB      RCALL	_LCD_WriteControl
(0157) LCD_WriteControl (LCD_MODE_SET);
    0265 E006      LDI	R16,6
    0266 DFD9      RCALL	_LCD_WriteControl
(0158) LCD_WriteControl (LCD_ON);
    0267 E00C      LDI	R16,0xC
    0268 DFD7      RCALL	_LCD_WriteControl
(0159) LCD_WriteControl (LCD_HOME);
    0269 E002      LDI	R16,2
(0160) }
    026A CFD5      RJMP	_LCD_WriteControl
(0161) // ************************************************ //
(0162) // *** Clear the LCD screen (also homes cursor) *** //
(0163) // ************************************************ //
(0164) void LCD_Clear(void)
(0165) {
(0166) LCD_WriteControl(0x01);
_LCD_Clear:
    026B E001      LDI	R16,1
(0167) }
    026C CFD3      RJMP	_LCD_WriteControl
(0168) // *********************************************** //
(0169) // *** Position the LCD cursor at row 1, col 1 *** //
(0170) // *********************************************** //
(0171) void LCD_Home(void)
(0172) {
(0173) LCD_WriteControl(0x02);
_LCD_Home:
    026D E002      LDI	R16,2
(0174) }
    026E CFD1      RJMP	_LCD_WriteControl
_LCD_DisplayCharacter:
  Char                 --> R20
    026F D1A9      RCALL	push_gset1
    0270 2F40      MOV	R20,R16
(0175) // ****************************************************************** //
(0176) // *** Display a single character, at the current cursor location *** //
(0177) // ****************************************************************** //
(0178) void LCD_DisplayCharacter (char Char)
(0179) {
(0180) LCD_WriteData (Char);
    0271 2F04      MOV	R16,R20
    0272 DFDC      RCALL	_LCD_WriteData
(0181) }
    0273 D1A8      RCALL	pop_gset1
    0274 9508      RET
_LCD_DisplayString_F:
  string               --> R20
  column               --> R10
  row                  --> R22
    0275 D1BD      RCALL	push_gset3
    0276 940E04AC  CALL	0x4AC
(0182) // ********************************************************************* //
(0183) // *** Display a string at the specified row and column, using FLASH *** //
(0184) // ********************************************************************* //
(0185) void LCD_DisplayString_F (char row, char column ,const unsigned char  *string)
(0186) {
(0187) LCD_Cursor (row, column);
    0278 D01C      RCALL	_LCD_Cursor
    0279 C006      RJMP	0x0280
(0188) while (*string)
(0189) {
(0190) LCD_DisplayCharacter (*string++);
    027A 011A      MOVW	R2,R20
    027B 5F4F      SUBI	R20,0xFF
    027C 4F5F      SBCI	R21,0xFF
    027D 01F1      MOVW	R30,R2
    027E 9104      LPM	R16,0(Z)
    027F DFEF      RCALL	_LCD_DisplayCharacter
    0280 01FA      MOVW	R30,R20
    0281 91E4      LPM	R30,0(Z)
    0282 23EE      TST	R30
    0283 F7B1      BNE	0x027A
(0191) }
(0192) }
    0284 D192      RCALL	pop_gset3
    0285 9508      RET
_LCD_DisplayString:
  string               --> R20
  column               --> R10
  row                  --> R22
    0286 D1AC      RCALL	push_gset3
    0287 940E04AC  CALL	0x4AC
(0193) // ******************************************************************* //
(0194) // *** Display a string at the specified row and column, using RAM *** //
(0195) // ******************************************************************* //
(0196) void LCD_DisplayString (char row, char column ,unsigned char *string)
(0197) {
(0198) LCD_Cursor (row, column);
    0289 D00B      RCALL	_LCD_Cursor
    028A C004      RJMP	0x028F
(0199) while (*string)
(0200) LCD_DisplayCharacter (*string++);
    028B 01FA      MOVW	R30,R20
    028C 9101      LD	R16,Z+
    028D 01AF      MOVW	R20,R30
    028E DFE0      RCALL	_LCD_DisplayCharacter
    028F 01FA      MOVW	R30,R20
    0290 8020      LDD	R2,Z+0
    0291 2022      TST	R2
    0292 F7C1      BNE	0x028B
(0201) }
    0293 D183      RCALL	pop_gset3
    0294 9508      RET
_LCD_Cursor:
  column               --> R20
  row                  --> R22
    0295 D19A      RCALL	push_gset2
    0296 2F42      MOV	R20,R18
    0297 2F60      MOV	R22,R16
(0202) // *************************************************** //
(0203) // *** Position the LCD cursor at "row", "column". *** //
(0204) // *************************************************** //
(0205) void LCD_Cursor (char row, char column)
(0206) {
(0207) switch (row) {
    0298 2777      CLR	R23
    0299 3061      CPI	R22,1
    029A E0E0      LDI	R30,0
    029B 077E      CPC	R23,R30
    029C F069      BEQ	0x02AA
    029D 3062      CPI	R22,2
    029E E0E0      LDI	R30,0
    029F 077E      CPC	R23,R30
    02A0 F071      BEQ	0x02AF
    02A1 3063      CPI	R22,3
    02A2 E0E0      LDI	R30,0
    02A3 077E      CPC	R23,R30
    02A4 F079      BEQ	0x02B4
    02A5 3064      CPI	R22,4
    02A6 E0E0      LDI	R30,0
    02A7 077E      CPC	R23,R30
    02A8 F081      BEQ	0x02B9
    02A9 C013      RJMP	0x02BD
(0208) case 1: LCD_WriteControl (0x80 + column - 1); break;
    02AA 2F04      MOV	R16,R20
    02AB 5800      SUBI	R16,0x80
    02AC 5001      SUBI	R16,1
    02AD DF92      RCALL	_LCD_WriteControl
    02AE C00E      RJMP	0x02BD
(0209) case 2: LCD_WriteControl (0xc0 + column - 1); break;
    02AF 2F04      MOV	R16,R20
    02B0 5400      SUBI	R16,0x40
    02B1 5001      SUBI	R16,1
    02B2 DF8D      RCALL	_LCD_WriteControl
    02B3 C009      RJMP	0x02BD
(0210) case 3: LCD_WriteControl (0x94 + column - 1); break;
    02B4 2F04      MOV	R16,R20
    02B5 560C      SUBI	R16,0x6C
    02B6 5001      SUBI	R16,1
    02B7 DF88      RCALL	_LCD_WriteControl
    02B8 C004      RJMP	0x02BD
(0211) case 4: LCD_WriteControl (0xd4 + column - 1); break;
    02B9 2F04      MOV	R16,R20
    02BA 520C      SUBI	R16,0x2C
    02BB 5001      SUBI	R16,1
    02BC DF83      RCALL	_LCD_WriteControl
(0212) default: break;
(0213) }
(0214) }
    02BD D157      RCALL	pop_gset2
    02BE 9508      RET
(0215) // ************************** //
(0216) // *** Turn the cursor on *** //
(0217) // ************************** //
(0218) void LCD_Cursor_On (void)
(0219) {
(0220) LCD_WriteControl (LCD_CURS_ON);
_LCD_Cursor_On:
    02BF E00D      LDI	R16,0xD
(0221) }
    02C0 CF7F      RJMP	_LCD_WriteControl
(0222) // *************************** //
(0223) // *** Turn the cursor off *** //
(0224) // *************************** //
(0225) void LCD_Cursor_Off (void)
(0226) {
(0227) LCD_WriteControl (LCD_ON);
_LCD_Cursor_Off:
    02C1 E00C      LDI	R16,0xC
(0228) }
    02C2 CF7D      RJMP	_LCD_WriteControl
(0229) // ******************** //
(0230) // *** Turn Off LCD *** //
(0231) // ******************** //
(0232) void LCD_Display_Off (void)
(0233) {
(0234) LCD_WriteControl(LCD_OFF);
_LCD_Display_Off:
    02C3 E008      LDI	R16,0x8
(0235) }
    02C4 CF7B      RJMP	_LCD_WriteControl
(0236) // ******************* //
(0237) // *** Turn On LCD *** //
(0238) // ******************* //
(0239) void LCD_Display_On (void)
(0240) {
(0241) LCD_WriteControl(LCD_ON);
_LCD_Display_On:
    02C5 E00C      LDI	R16,0xC
(0242) }
    02C6 CF79      RJMP	_LCD_WriteControl
_ClearLine:
  space                --> R22
  line                 --> R20
    02C7 D168      RCALL	push_gset2
    02C8 2F40      MOV	R20,R16
    02C9 9722      SBIW	R28,2
(0243) // ******************* //
(0244) // *** Clear line *** //
(0245) // ******************* //
(0246) void ClearLine(unsigned char line)
(0247) {
(0248)     unsigned char *space="                ";
    02CA E862      LDI	R22,0x82
    02CB E070      LDI	R23,0
(0249)     LCD_DisplayString(line,1,space);
    02CC 8379      STD	Y+1,R23
    02CD 8368      STD	Y+0,R22
    02CE E021      LDI	R18,1
    02CF 2F04      MOV	R16,R20
    02D0 DFB5      RCALL	_LCD_DisplayString
(0250) }
    02D1 9622      ADIW	R28,2
    02D2 D142      RCALL	pop_gset2
    02D3 9508      RET
FILE: D:\NEW\ECHO\main.c
(0001) #define MAIN_C
(0002) #include "includes.h"
(0003) //ICC-AVR application builder : 2007-1-22 9:46:41
(0004) // Target : M16
(0005) // Crystal: 4.0000Mhz
(0006) void port_init(void)
(0007) {
(0008)  PORTA = 0xFF;
_port_init:
    02D4 EF8F      LDI	R24,0xFF
    02D5 BB8B      OUT	0x1B,R24
(0009)  DDRA  = 0x00;
    02D6 2422      CLR	R2
    02D7 BA2A      OUT	0x1A,R2
(0010)  PORTB = 0xfe;// SEND ECHO
    02D8 EF8E      LDI	R24,0xFE
    02D9 BB88      OUT	0x18,R24
(0011)  DDRB  = 0x01;
    02DA E081      LDI	R24,1
    02DB BB87      OUT	0x17,R24
(0012)  PORTC = 0xff; //m103 output only
    02DC EF8F      LDI	R24,0xFF
    02DD BB85      OUT	0x15,R24
(0013)  DDRC  = 0x00;
    02DE BA24      OUT	0x14,R2
(0014)  PORTD = 0xFF;
    02DF BB82      OUT	0x12,R24
(0015)  DDRD  = 0x00;
    02E0 BA21      OUT	0x11,R2
(0016) }
    02E1 9508      RET
(0017) 
(0018) //call this routine to initialise all peripherals
(0019) void init_devices(void)
(0020) {
(0021)  //stop errant interrupts until set up
(0022)  CLI(); //disable all interrupts
_init_devices:
    02E2 94F8      BCLR	7
(0023)  port_init();
    02E3 DFF0      RCALL	_port_init
(0024)  Init_LCD();
    02E4 DF79      RCALL	_Init_LCD
(0025)  timer1_init();
    02E5 DD8E      RCALL	_timer1_init
(0026)  MCUCR = 0x00;
    02E6 2422      CLR	R2
    02E7 BE25      OUT	0x35,R2
(0027)  GICR  = 0x00;
    02E8 BE2B      OUT	0x3B,R2
(0028)  TIMSK = 0x24; //OVR(0x20)+ICP(0x04) interrupt sources
    02E9 E284      LDI	R24,0x24
    02EA BF89      OUT	0x39,R24
(0029)  SEI(); //re-enable interrupts
    02EB 9478      BSET	7
(0030)  //all peripherals are now initialised
(0031) }
    02EC 9508      RET
(0032) 
(0033) void display_temprature(void)
(0034)   {
(0035)    temprature= readTempDS18B20();
_display_temprature:
    02ED DECB      RCALL	_readTempDS18B20
    02EE 940E0484  CALL	0x484
(0036) 
(0037)    temprature_flag=(temprature>>8)&0xf8;//h8bit(5bit)
    02F0 01C8      MOVW	R24,R16
    02F1 2F89      MOV	R24,R25
    02F2 2799      CLR	R25
    02F3 7F88      ANDI	R24,0xF8
    02F4 7090      ANDI	R25,0
    02F5 938000BB  STS	_temprature_flag,R24
(0038)    
(0039)     if(temprature_flag==0)              //signed temprature 
    02F7 2388      TST	R24
    02F8 F499      BNE	0x030C
(0040) 	 {
(0041) 	    temprature/=8;
    02F9 0118      MOVW	R2,R16
    02FA 940E0476  CALL	0x476
(0042) 		temprature*=5;
    02FC D108      RCALL	empy16s
    02FD 940E0484  CALL	0x484
(0043) 	    LCD_Cursor(1,8);
    02FF E028      LDI	R18,0x8
    0300 E001      LDI	R16,1
    0301 DF93      RCALL	_LCD_Cursor
(0044) 	    LCD_DisplayCharacter('+');
    0302 E20B      LDI	R16,0x2B
    0303 DF6B      RCALL	_LCD_DisplayCharacter
    0304 940E04B3  CALL	0x4B3
(0045) 		speed=3314+temprature*6;  //set speed for echo
    0306 D0FE      RCALL	empy16s
    0307 01C8      MOVW	R24,R16
    0308 508E      SUBI	R24,0xE
    0309 4F93      SBCI	R25,0xF3
    030A 940E04D0  CALL	0x4D0
(0046) 	 }
(0047) 	 
(0048) 	 if(temprature_flag!=0)
    030C 902000BB  LDS	R2,_temprature_flag
    030E 2022      TST	R2
    030F F101      BEQ	0x0330
(0049) 	 { 
(0050) 	   temprature=~temprature+1;
    0310 918000BC  LDS	R24,_temprature
    0312 919000BD  LDS	R25,_temprature+1
    0314 9580      COM	R24
    0315 9590      COM	R25
    0316 9601      ADIW	R24,1
    0317 940E04CB  CALL	0x4CB
(0051) 	   temprature&=~0xf800;
    0319 7097      ANDI	R25,7
    031A 940E04CB  CALL	0x4CB
(0052)        temprature/=8;
    031C 011C      MOVW	R2,R24
    031D 940E0476  CALL	0x476
(0053) 	   temprature*=5;
    031F D0E5      RCALL	empy16s
    0320 940E0484  CALL	0x484
(0054)        LCD_Cursor(1,8);
    0322 E028      LDI	R18,0x8
    0323 E001      LDI	R16,1
    0324 DF70      RCALL	_LCD_Cursor
(0055) 	   LCD_DisplayCharacter('-');
    0325 E20D      LDI	R16,0x2D
    0326 DF48      RCALL	_LCD_DisplayCharacter
    0327 940E04B3  CALL	0x4B3
(0056) 	   speed=3314-temprature*6;  //set speed for echo	 
    0329 D0DB      RCALL	empy16s
    032A EF82      LDI	R24,0xF2
    032B E09C      LDI	R25,0xC
    032C 1B80      SUB	R24,R16
    032D 0B91      SBC	R25,R17
    032E 940E04D0  CALL	0x4D0
(0057)      }
(0058) 	 
(0059) 	//temprature=speed;//testing!!!!!!!!!!!!!!!!!!!!!!!!
(0060) 	 
(0061) 	 ASCII_T[0]='0'+temprature/1000;
    0330 EE28      LDI	R18,0xE8
    0331 E033      LDI	R19,3
    0332 940E0493  CALL	0x493
    0334 D0B6      RCALL	div16u
    0335 01C8      MOVW	R24,R16
    0336 96C0      ADIW	R24,0x30
    0337 93800097  STS	0x97,R24
(0062) 	 temprature%=1000;
    0339 EE28      LDI	R18,0xE8
    033A E033      LDI	R19,3
    033B 940E0493  CALL	0x493
    033D D0AB      RCALL	mod16u
    033E 940E0484  CALL	0x484
(0063) 	  ASCII_T[1]='0'+temprature/100;
    0340 E624      LDI	R18,0x64
    0341 E030      LDI	R19,0
    0342 D0A8      RCALL	div16u
    0343 01C8      MOVW	R24,R16
    0344 96C0      ADIW	R24,0x30
    0345 93800098  STS	0x98,R24
(0064) 	 temprature%=100;
    0347 E624      LDI	R18,0x64
    0348 E030      LDI	R19,0
    0349 940E0493  CALL	0x493
    034B D09D      RCALL	mod16u
    034C 940E0484  CALL	0x484
(0065) 	  ASCII_T[2]='0'+temprature/10;
    034E E02A      LDI	R18,0xA
    034F E030      LDI	R19,0
    0350 D09A      RCALL	div16u
    0351 01C8      MOVW	R24,R16
    0352 96C0      ADIW	R24,0x30
    0353 93800099  STS	0x99,R24
(0066) 	 temprature%=10;
    0355 E02A      LDI	R18,0xA
    0356 E030      LDI	R19,0
    0357 940E0493  CALL	0x493
    0359 D08F      RCALL	mod16u
    035A 940E0484  CALL	0x484
(0067) 	  ASCII_T[3]='0'+temprature;
    035C 01C8      MOVW	R24,R16
    035D 96C0      ADIW	R24,0x30
    035E 9380009A  STS	0x9A,R24
(0068) 	 LCD_Cursor(1,9);
    0360 E029      LDI	R18,0x9
    0361 E001      LDI	R16,1
    0362 DF32      RCALL	_LCD_Cursor
(0069) 	 LCD_DisplayCharacter(ASCII_T[0]);	//100BIT
    0363 91000097  LDS	R16,0x97
    0365 DF09      RCALL	_LCD_DisplayCharacter
(0070) 	 LCD_Cursor(1,10);

⌨️ 快捷键说明

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