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

📄 urw.lst

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 LST
📖 第 1 页 / 共 5 页
字号:
    034E 01C6      MOVW	R24,R12
    034F 3684      CPI	R24,0x64
    0350 E0E0      LDI	R30,0
    0351 079E      CPC	R25,R30
    0352 F388      BCS	0x0344
(0437) 	}
(0438) 	
(0439) 	
(0440) /* 检查U盘是否准备好,大多数U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
(0441) //	do {
(0442) //		mDelaymS( 100 );
(0443) //		printf( "Disk Ready ?\n" );
(0444) //		i = CH375DiskReady( );  /* 查询磁盘是否准备好,如果省掉这个子程序可以节约将近1KB的程序代码 */
(0445) //	} while ( i != ERR_SUCCESS );
(0446) /* CH375DiskReady 在CH375的U盘文件子程序库中,因为代码较多,所以此处省去 */
(0447) 
(0448) 	//printf( "ReadSector 0# to buffer\n" );
(0449) 	ShowText(10,53,"读扇区......");
    0353 E382      LDI	R24,0x32
    0354 E091      LDI	R25,1
    0355 8399      STD	Y+1,R25
    0356 8388      STD	Y+0,R24
    0357 E325      LDI	R18,0x35
    0358 E030      LDI	R19,0
    0359 E00A      LDI	R16,0xA
    035A E010      LDI	R17,0
    035B 940E0548  CALL	_ShowText
(0450)  	c = mWriteSector( 2, 1 );
    035D E081      LDI	R24,1
    035E 8388      STD	Y+0,R24
    035F E002      LDI	R16,2
    0360 E010      LDI	R17,0
    0361 E020      LDI	R18,0
    0362 E030      LDI	R19,0
    0363 DF06      RCALL	_mWriteSector
(0451) 	c = mReadSector( 2, 1 );
    0364 E081      LDI	R24,1
    0365 8388      STD	Y+0,R24
    0366 E002      LDI	R16,2
    0367 E010      LDI	R17,0
    0368 E020      LDI	R18,0
    0369 E030      LDI	R19,0
    036A DE64      RCALL	_mReadSector
    036B 2EA0      MOV	R10,R16
(0452) 	//---------------------------------------------------
(0453) 	if ( c )//printf( "Error @ReadSector, %02X\n", c );
    036C 2300      TST	R16
    036D F0D9      BEQ	0x0389
(0454) 		{
(0455) 			 ShowText(10,69,"读取U盘失败!");
    036E E285      LDI	R24,0x25
    036F E091      LDI	R25,1
    0370 8399      STD	Y+1,R25
    0371 8388      STD	Y+0,R24
    0372 E425      LDI	R18,0x45
    0373 E030      LDI	R19,0
    0374 E00A      LDI	R16,0xA
    0375 E010      LDI	R17,0
    0376 940E0548  CALL	_ShowText
    0378 C00E      RJMP	0x0387
(0456) 			 while ( 1 ) 
(0457) 	     {
(0458) 		      LED_OUT_ACT();  /* LED闪烁 */
    0379 91800065  LDS	R24,0x65
    037B 7E8F      ANDI	R24,0xEF
    037C 93800065  STS	0x65,R24
(0459) 		      mDelaymS( 80 );
    037E E500      LDI	R16,0x50
    037F DD46      RCALL	_mDelaymS
(0460) 		      LED_OUT_INACT();
    0380 91800065  LDS	R24,0x65
    0382 6180      ORI	R24,0x10
    0383 93800065  STS	0x65,R24
(0461) 		      mDelaymS( 80 );
    0385 E500      LDI	R16,0x50
    0386 DD3F      RCALL	_mDelaymS
    0387 CFF1      RJMP	0x0379
(0462) 	     }
(0463) 	  }
    0388 C02F      RJMP	0x03B8
(0464) 	else
(0465) 		{
(0466) 			 ShowText(10,69,"读取U盘扇区成功!");
    0389 E184      LDI	R24,0x14
    038A E091      LDI	R25,1
    038B 8399      STD	Y+1,R25
    038C 8388      STD	Y+0,R24
    038D E425      LDI	R18,0x45
    038E E030      LDI	R19,0
    038F E00A      LDI	R16,0xA
    0390 E010      LDI	R17,0
    0391 940E0548  CALL	_ShowText
(0467) 		}
    0393 C024      RJMP	0x03B8
(0468) 	//---------------------------------------------------
(0469) /*	if ( DATA_BUFFER[0x01FF] == 0xAA ) 
(0470) 	  { // 磁盘分区有效 
(0471) 		//printf( "WriteSector 1# from buffer\n" );
(0472) 	  ShowText(10,69,"磁盘分区有效");
(0473) 		c = mWriteSector( 1, 1 );
(0474) 		if ( c )// printf( "Error @WriteSector, %02X\n", c );
(0475) 		memset( DATA_BUFFER, 0, sizeof(DATA_BUFFER) );  // 清空数据缓冲区,代替原来的分区信息 
(0476) 		//printf( "WriteSector 0# for clear\n" );
(0477) 		c = mWriteSector( 0, 1 );
(0478) 		if ( c ); //printf( "Error @WriteSector, %02X\n", c );
(0479) 	  }
(0480) 	else {
(0481) 		//printf( "ReadSector 1# to buffer\n" );
(0482) 	//	c = mReadSector( 1, 1 );
(0483) 		if ( c )// printf( "Error @ReadSector, %02X\n", c );
(0484) 		//printf( "WriteSector 0# from buffer\n" );
(0485) 		c = mWriteSector( 0, 1 );
(0486) 		if ( c ); //printf( "Error @WriteSector, %02X\n", c );
(0487) 	}*/
(0488) 	//printf( "Stop\n" );
(0489) 	while ( 1 ) {
(0490) 		mIntStatus = mWaitInterrupt( );  // 等待中断并获取状态 
    0394 DD80      RCALL	_mWaitInterrupt
    0395 2EE0      MOV	R14,R16
(0491) 		if ( mIntStatus == USB_INT_DISCONNECT )
    0396 3106      CPI	R16,0x16
    0397 F459      BNE	0x03A3
(0492) 		 {  // U盘没有连接或者已经拔出 //
(0493) 			//printf( "Out\n" );
(0494) 			 ShowText(10,85,"U盘已拨出!");
    0398 E089      LDI	R24,0x9
    0399 E091      LDI	R25,1
    039A 8399      STD	Y+1,R25
    039B 8388      STD	Y+0,R24
    039C E525      LDI	R18,0x55
    039D E030      LDI	R19,0
    039E E00A      LDI	R16,0xA
    039F E010      LDI	R17,0
    03A0 940E0548  CALL	_ShowText
(0495) 		 }
    03A2 C015      RJMP	0x03B8
(0496) 		else if ( mIntStatus == USB_INT_CONNECT ) 
    03A3 2D8E      MOV	R24,R14
    03A4 3185      CPI	R24,0x15
    03A5 F491      BNE	0x03B8
(0497) 		 {  // U盘已经连接//
(0498) 			//printf( "In\n" );
(0499) 			ShowText(10,101,"U盘插入!");
    03A6 E080      LDI	R24,0
    03A7 E091      LDI	R25,1
    03A8 8399      STD	Y+1,R25
    03A9 8388      STD	Y+0,R24
    03AA E625      LDI	R18,0x65
    03AB E030      LDI	R19,0
    03AC E00A      LDI	R16,0xA
    03AD E010      LDI	R17,0
    03AE 940E0548  CALL	_ShowText
(0500) 			LED_OUT_ACT( );
    03B0 91800065  LDS	R24,0x65
    03B2 7E8F      ANDI	R24,0xEF
    03B3 93800065  STS	0x65,R24
(0501) 			CleanScreen();
    03B5 940E052C  CALL	_CleanScreen
(0502) 			goto loop;
    03B7 CF6B      RJMP	0x0323
    03B8 CFDB      RJMP	0x0394
    03B9 9622      ADIW	R28,2
    03BA 9508      RET
(0503) 		 }
(0504) 	}
(0505) }
(0506) void CH375_PORT_INIT_57600()  /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
(0507) {
(0508)  UCSR1B = 0x00; //disable while setting baud rate
_CH375_PORT_INIT_57600:
    03BB 2422      CLR	R2
    03BC 9220009A  STS	0x9A,R2
(0509)  UCSR1A = 0x00;
    03BE 9220009B  STS	0x9B,R2
(0510)  UCSR1C = 0x06;
    03C0 E086      LDI	R24,6
    03C1 9380009D  STS	0x9D,R24
(0511)  UBRR1L = 0x10; //set baud rate lo
    03C3 E180      LDI	R24,0x10
    03C4 93800099  STS	0x99,R24
(0512)  UBRR1H = 0x00; //set baud rate hi
    03C6 92200098  STS	0x98,R2
(0513)  UCSR1B = 0x1C; //1c
    03C8 E18C      LDI	R24,0x1C
    03C9 9380009A  STS	0x9A,R24
    03CB 9508      RET
(0514) }
(0515) void CH375_PORT_INIT()  /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
(0516) {
(0517)  UCSR1B = 0x00; //disable while setting baud rate
_CH375_PORT_INIT:
    03CC 2422      CLR	R2
    03CD 9220009A  STS	0x9A,R2
(0518)  UCSR1A = 0x00;
    03CF 9220009B  STS	0x9B,R2
(0519)  UCSR1C = 0x06;
    03D1 E086      LDI	R24,6
    03D2 9380009D  STS	0x9D,R24
(0520)  UBRR1L = 0x67; //set baud rate lo
    03D4 E687      LDI	R24,0x67
    03D5 93800099  STS	0x99,R24
(0521)  UBRR1H = 0x00; //set baud rate hi
    03D7 92200098  STS	0x98,R2
(0522)  UCSR1B = 0x1C; //1c
    03D9 E18C      LDI	R24,0x1C
    03DA 9380009A  STS	0x9A,R24
    03DC 9508      RET
(0523) }
(0524) void SET_BAUDRATE()  //设置CH375的串口通讯波特率
(0525) {
(0526) 	   CH375_WR_CMD_PORT( CMD_SET_BAUDRATE );  //发送设置波特率的命令
_SET_BAUDRATE:
    03DD E002      LDI	R16,2
    03DE DCFA      RCALL	_CH375_WR_CMD_PORT
(0527) 	   CH375_WR_DAT_PORT(0x03);CH375_WR_DAT_PORT(0x98);  //57600Bps
    03DF E003      LDI	R16,3
    03E0 DD0D      RCALL	_CH375_WR_DAT_PORT
    03E1 E908      LDI	R16,0x98
    03E2 DD0B      RCALL	_CH375_WR_DAT_PORT
    03E3 9508      RET
FILE: E:\ICC128\2008控制台\2008console0TEST\U盘扇区读写\ledtest.c
(0001) 
(0002) //ICC-AVR application builder : 2008-1-23 9:13:29
(0003) // Target : M128
(0004) // Crystal: 8.0000Mhz
(0005) //#include <iom128v.h>
(0006) //#include <macros.h>
(0007) #include "2008.h"
(0008) 
(0009) int I_Timer=0;
(0010) 
(0011) //#define portout (*(volatile unsigned char*)0x1100)
(0012) 
(0013) void port_init(void)
(0014) {
(0015)  PORTA = 0XFF;
_port_init:
    03E4 EF8F      LDI	R24,0xFF
    03E5 BB8B      OUT	0x1B,R24
(0016)  DDRA  = 0XFF;
    03E6 BB8A      OUT	0x1A,R24
(0017)  PORTF = 0XFF;
    03E7 93800062  STS	0x62,R24
(0018)  DDRF  = 0XFF;
    03E9 93800061  STS	0x61,R24
(0019)  PORTB = 0xFF;
    03EB BB88      OUT	0x18,R24
(0020)  DDRB  = 0xF7;
    03EC EF87      LDI	R24,0xF7
    03ED BB87      OUT	0x17,R24
(0021)  PORTD = 0xFF;
    03EE EF8F      LDI	R24,0xFF
    03EF BB82      OUT	0x12,R24
(0022)  DDRD  = 0xE3;
    03F0 EE83      LDI	R24,0xE3
    03F1 BB81      OUT	0x11,R24
(0023)  PORTE = 0xFF;
    03F2 EF8F      LDI	R24,0xFF
    03F3 B983      OUT	0x03,R24
(0024)  DDRE  = 0xFF;
    03F4 B982      OUT	0x02,R24
(0025)  PORTG = 0XFF;
    03F5 93800065  STS	0x65,R24
(0026)  DDRG  = 0Xf7;
    03F7 EF87      LDI	R24,0xF7
    03F8 93800064  STS	0x64,R24
    03FA 9508      RET
(0027) }
(0028) 
(0029) //TIMER0 initialize - prescale:1024
(0030) // WGM: Normal
(0031) // desired value: 20mSec
(0032) // actual value: 19.968mSec (0.2%)
(0033) void timer0_init(void)
(0034) {
(0035)  TCCR0 = 0x00; //stop
_timer0_init:
    03FB 2422      CLR	R2
    03FC BE23      OUT	0x33,R2
(0036)  ASSR  = 0x00; //set async mode
    03FD BE20      OUT	0x30,R2
(0037)  TCNT0 = 0x64; //set count
    03FE E684      LDI	R24,0x64
    03FF BF82      OUT	0x32,R24
(0038)  OCR0  = 0x9C;
    0400 E98C      LDI	R24,0x9C
    0401 BF81      OUT	0x31,R24
(0039)  TCCR0 = 0x07; //start timer
    0402 E087      LDI	R24,7
    0403 BF83      OUT	0x33,R24
    0404 9508      RET
_timer0_ovf_isr:
    0405 922A      ST	R2,-Y
    0406 923A      ST	R3,-Y
    0407 938A      ST	R24,-Y
    0408 939A      ST	R25,-Y
    0409 93EA      ST	R30,-Y
    040A B62F      IN	R2,0x3F
    040B 922A      ST	R2,-Y
(0040) }
(0041) 
(0042) #pragma interrupt_handler timer0_ovf_isr:17
(0043) void timer0_ovf_isr(void)
(0044) {  
(0045)   I_Timer++;
    040C 9180017F  LDS	R24,I_Timer
    040E 91900180  LDS	R25,I_Timer+1
    0410 9601      ADIW	R24,1
    0411 93900180  STS	I_Timer+1,R25
    0413 9380017F  STS	I_Timer,R24
(0046)   if(I_Timer == 50)
    0415 3382      CPI	R24,0x32
    0416 E0E0      LDI	R30,0
    0417 079E      CPC	R25,R30
    0418 F461      BNE	0x0425
(0047)   {
(0048)    PORTG ^= 0x10;
    0419 E180      LDI	R24,0x10
    041A 90200065  LDS	R2,0x65
    041C 2628      EOR	R2,R24
    041D 92200065  STS	0x65,R2
(0049)    I_Timer =0;
    041F 2422      CLR	R2
    0420 2433      CLR	R3
    0421 92300180  STS	I_Timer+1,R3
    0423 9220017F  STS	I_Timer,R2
(0050)   }
(0051)   TCNT0 = 0x64; //reload counter value
    0425 E684      LDI	R24,0x64
    0426 BF82      OUT	0x32,R24
    0427 9029      LD	R2,Y+
    0428 BE2F      OUT	0x3F,R2
    0429 91E9      LD	R30,Y+
    042A 9199      LD	R25,Y+
    042B 9189      LD	R24,Y+
    042C 9039      LD	R3,Y+
    042D 9029      LD	R2,Y+
    042E 9518      RETI
(0052) }
(0053) 
(0054) //call this routine to initialize all peripherals
(0055) void init_devices(void)
(0056) {
(0057)  //stop errant interrupts until set up
(0058)  CLI(); //disable all interrupts
_init_devices:
    042F 94F8      BCLR	7
(0059)  XDIV  = 0x00; //xtal divider
    0430 2422      CLR	R2
    0431 BE2C      OUT	0x3C,R2
(0060)  XMCRA = 0x00; //external memory
    0432 9220006D  STS	0x6D,R2
(0061)  port_init();
    0434 DFAF      RCALL	_port_init
(0062)  //timer0_init();
(0063)  MCUCR = 0x00;
    0435 2422      CLR	R2
    0436 BE25      OUT	0x35,R2
(0064)  EICRA = 0x00; //extended ext ints
    0437 9220006A  STS	0x6A,R2
(0065)  EICRB = 0x00; //extended ext ints
    0439 BE2A      OUT	0x3A,R2
(0066)  EIMSK = 0x00;
    043A BE29      OUT	0x39,R2
(0067)  //TIMSK = 0x01; //timer interrupt sources
(0068)  ETIMSK = 0x00; //extended timer interrupt sources
    043B 9220007D  STS	0x7D,R2
(0069)  SEI(); //re-enable interrupts

⌨️ 快捷键说明

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