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

📄 urw.lst

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0265 9624      ADIW	R28,4
    0266 940E06F0  CALL	pop_gset5
    0268 9624      ADIW	R28,4
    0269 9508      RET
_mWriteSector:
  col                  --> R22
  j                    --> R22
  mBlockCount          --> R22
  mIntStatus           --> R20
  mBufferPoint         --> R10
  mLength              --> R12
  iSectorCount         --> Y+12
  iLbaStart            --> Y+8
    026A 940E0655  CALL	push_arg4
    026C 940E06F5  CALL	push_gset4
(0288) }
(0289) 
(0290) /* 将缓冲区中的多个扇区的数据块写入U盘 */
(0291) unsigned char	mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )
(0292) /* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */
(0293) {
(0294) 	unsigned char mIntStatus;
(0295) 	unsigned char *mBufferPoint;
(0296) 	unsigned int  mBlockCount,j=0,col=0;
    026E 2766      CLR	R22
    026F 2777      CLR	R23
(0297) 	unsigned char mLength;
(0298) 	CH375_WR_CMD_PORT( CMD_DISK_WRITE );  /* 向USB存储器写数据块 */
    0270 E506      LDI	R16,0x56
    0271 DE67      RCALL	_CH375_WR_CMD_PORT
(0299) 	CH375_WR_DAT_PORT( (unsigned char)iLbaStart );  /* LBA的最低8位 */
    0272 01FE      MOVW	R30,R28
    0273 8500      LDD	R16,Z+8
    0274 DE79      RCALL	_CH375_WR_DAT_PORT
(0300) 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
    0275 E088      LDI	R24,0x8
    0276 E090      LDI	R25,0
    0277 01FE      MOVW	R30,R28
    0278 8420      LDD	R2,Z+8
    0279 8431      LDD	R3,Z+9
    027A 8442      LDD	R4,Z+10
    027B 8453      LDD	R5,Z+11
    027C 938A      ST	R24,-Y
    027D 0181      MOVW	R16,R2
    027E 0192      MOVW	R18,R4
    027F 940E0712  CALL	lsr32
    0281 DE6C      RCALL	_CH375_WR_DAT_PORT
(0301) 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
    0282 01FE      MOVW	R30,R28
    0283 8420      LDD	R2,Z+8
    0284 8431      LDD	R3,Z+9
    0285 8442      LDD	R4,Z+10
    0286 8453      LDD	R5,Z+11
    0287 0112      MOVW	R2,R4
    0288 2444      CLR	R4
    0289 2455      CLR	R5
    028A 2D02      MOV	R16,R2
    028B DE62      RCALL	_CH375_WR_DAT_PORT
(0302) 	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
    028C E188      LDI	R24,0x18
    028D E090      LDI	R25,0
    028E 01FE      MOVW	R30,R28
    028F 8420      LDD	R2,Z+8
    0290 8431      LDD	R3,Z+9
    0291 8442      LDD	R4,Z+10
    0292 8453      LDD	R5,Z+11
    0293 938A      ST	R24,-Y
    0294 0181      MOVW	R16,R2
    0295 0192      MOVW	R18,R4
    0296 940E0712  CALL	lsr32
    0298 DE55      RCALL	_CH375_WR_DAT_PORT
(0303) 	CH375_WR_DAT_PORT( iSectorCount );  /* 扇区数 */
    0299 850C      LDD	R16,Y+12
    029A DE53      RCALL	_CH375_WR_DAT_PORT
(0304) 	mBufferPoint = DATA_BUFFER;  /* 指向缓冲区起始地址 */
    029B EA83      LDI	R24,0xA3
    029C E091      LDI	R25,1
    029D 015C      MOVW	R10,R24
(0305) 	for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) {  /* 数据块计数 */
    029E 902001A0  LDS	R2,BlockPerSector
    02A0 840C      LDD	R0,Y+12
    02A1 9C02      MUL	R0,R2
    02A2 01B0      MOVW	R22,R0
    02A3 C01D      RJMP	0x02C1
(0306) 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    02A4 DE70      RCALL	_mWaitInterrupt
    02A5 2F40      MOV	R20,R16
(0307) 		if ( mIntStatus == USB_INT_DISK_WRITE ) {  /* USB存储器写数据块,请求数据写入 */
    02A6 310E      CPI	R16,0x1E
    02A7 F4E1      BNE	0x02C4
(0308) 			CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );  /* 向CH375缓冲区写入数据块 */
    02A8 E20B      LDI	R16,0x2B
    02A9 DE2F      RCALL	_CH375_WR_CMD_PORT
(0309) 			mLength = CH375_BLOCK_SIZE;
    02AA E480      LDI	R24,0x40
    02AB 2EC8      MOV	R12,R24
(0310) 			CH375_WR_DAT_PORT( mLength );  /* 后续数据的长度 */
    02AC 2F08      MOV	R16,R24
    02AD DE40      RCALL	_CH375_WR_DAT_PORT
    02AE C00C      RJMP	0x02BB
(0311) 		  while ( mLength ) {  //根据长度写入数据 
(0312) 				CH375_WR_DAT_PORT( DATA_BUFFER[mLength]); // 将数据写入 
    02AF EA83      LDI	R24,0xA3
    02B0 E091      LDI	R25,1
    02B1 2DEC      MOV	R30,R12
    02B2 27FF      CLR	R31
    02B3 0FE8      ADD	R30,R24
    02B4 1FF9      ADC	R31,R25
    02B5 8100      LDD	R16,Z+0
    02B6 DE37      RCALL	_CH375_WR_DAT_PORT
(0313) 			/*	if( 160+col < 240 )
(0314) 					{
(0315) 				     ShowNumber(j,160+col,*mBufferPoint);  //显示  *mBufferPoint
(0316) 				     j+=4;
(0317) 				     if(j>37)
(0318) 					    {
(0319) 						     j=0;
(0320) 					       col+=16;
(0321) 				      }
(0322) 				  }*/
(0323) 				mBufferPoint++;
    02B7 01C5      MOVW	R24,R10
    02B8 9601      ADIW	R24,1
    02B9 015C      MOVW	R10,R24
(0324) 				mLength--;
    02BA 94CA      DEC	R12
    02BB 20CC      TST	R12
    02BC F791      BNE	0x02AF
(0325) 			}
(0326) 		/*	do { //对于C51,这个DO+WHILE结构比上面的WHILE效率高,速度快
(0327) 				CH375_WR_DAT_PORT( DATA_BUFFER[mLength] );
(0328) 				mBufferPoint++;
(0329) 			} while ( --mLength );*/
(0330) 			CH375_WR_CMD_PORT( CMD_DISK_WR_GO );  /* 继续执行USB存储器的写操作 */
    02BD E507      LDI	R16,0x57
    02BE DE1A      RCALL	_CH375_WR_CMD_PORT
    02BF 5061      SUBI	R22,1
    02C0 4070      SBCI	R23,0
    02C1 3060      CPI	R22,0
    02C2 0767      CPC	R22,R23
    02C3 F701      BNE	0x02A4
(0331) 		}
(0332) 		else break;  /* 返回错误状态 */
(0333) 	}
(0334) 	if ( mBlockCount == 0 ) {
    02C4 3060      CPI	R22,0
    02C5 0767      CPC	R22,R23
    02C6 F431      BNE	0x02CD
(0335) 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    02C7 DE4D      RCALL	_mWaitInterrupt
    02C8 2F40      MOV	R20,R16
(0336) 		if ( mIntStatus == USB_INT_SUCCESS ) return( 0 );  /* 操作成功 */
    02C9 3104      CPI	R16,0x14
    02CA F411      BNE	0x02CD
    02CB 2700      CLR	R16
    02CC C002      RJMP	0x02CF
(0337) 	}
(0338) //	if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* U盘断开 */
(0339) 	mClearError( );  /* 清除U盘错误以便重试 */
    02CD DEF9      RCALL	_mClearError
(0340) 	return( mIntStatus );  /* 操作失败 */
    02CE 2F04      MOV	R16,R20
    02CF 940E06ED  CALL	pop_gset4
    02D1 9624      ADIW	R28,4
    02D2 9508      RET
(0341) }
(0342) 
(0343) struct _HD_MBR_DPT {
(0344) 	unsigned char	PartState;
(0345) 	unsigned char	StartHead;
(0346) 	unsigned int	StartSec;
(0347) 	unsigned char	PartType;
(0348) 	unsigned char	EndHead;
(0349) 	unsigned int	EndSec;
(0350) 	unsigned long	StartSector;
(0351) 	unsigned long	TotalSector;
(0352) };
(0353) 
(0354) /* 为printf和getkey输入输出初始化串口 */
(0355) void	mInitSTDIO( )
(0356) {
(0357) /*	SCON = 0x50;
(0358) 	PCON = 0x80;
(0359) 	TMOD = 0x20;
(0360) 	TH1 = 0xf3;  // 24MHz晶振, 9600bps//
(0361) 	TR1 = 1;
(0362) 	TI = 1;*/
(0363) 
(0364)  UCSR1B = 0x00; //disable while setting baud rate
_mInitSTDIO:
    02D3 2422      CLR	R2
    02D4 9220009A  STS	0x9A,R2
(0365)  UCSR1A = 0x00;
    02D6 9220009B  STS	0x9B,R2
(0366)  UCSR1C = 0x06;
    02D8 E086      LDI	R24,6
    02D9 9380009D  STS	0x9D,R24
(0367)  UBRR1L = 0x67; //set baud rate lo
    02DB E687      LDI	R24,0x67
    02DC 93800099  STS	0x99,R24
(0368)  UBRR1H = 0x00; //set baud rate hi
    02DE 92200098  STS	0x98,R2
(0369)  UCSR1B = 0x1C; //1c
    02E0 E18C      LDI	R24,0x1C
    02E1 9380009A  STS	0x9A,R24
    02E3 9508      RET
_main:
  c                    --> R10
  i                    --> R12
  mIntStatus           --> R14
    02E4 9722      SBIW	R28,2
(0370)  
(0371) }
(0372) 
(0373) main() {
(0374) 	unsigned char	c, mIntStatus;
(0375) 	unsigned int i=0;
    02E5 24CC      CLR	R12
    02E6 24DD      CLR	R13
(0376) //-------------------------------------------------------
(0377)     init_devices();
    02E7 940E042F  CALL	_init_devices
(0378)     //-----------------------------------------------------------------------------
(0379)     CH375_PORT_INIT(); //首先将串口初始化为9600 因为CH375默认的波特率是9600
    02E9 D0E2      RCALL	_CH375_PORT_INIT
(0380)     SET_BAUDRATE();  //设置CH375的串口通讯波特率 57600
    02EA D0F2      RCALL	_SET_BAUDRATE
(0381)     CH375_PORT_INIT_57600();//重新调整波特率 单片机串口波特率57600
    02EB D0CF      RCALL	_CH375_PORT_INIT_57600
(0382)     //-----------------------------------------------------------------------------
(0383)  	  initLCDM();     //初始化LCD
    02EC 940E043F  CALL	_initLCDM
(0384) 	  CleanScreen();
    02EE 940E052C  CALL	_CleanScreen
(0385) 	//Welcome_interface();  //显示欢迎界面 
(0386) 
(0387) //-------------------------------------------------------
(0388) 	
(0389) 	LED_OUT_ACT( );  /* 开机后LED亮一下以示工作 */
    02F0 91800065  LDS	R24,0x65
    02F2 7E8F      ANDI	R24,0xEF
    02F3 93800065  STS	0x65,R24
(0390) 	mDelaymS( 100 );  /* 延时100毫秒 */
    02F5 E604      LDI	R16,0x64
    02F6 DDCF      RCALL	_mDelaymS
(0391) 	LED_OUT_INACT( );
    02F7 91800065  LDS	R24,0x65
    02F9 6180      ORI	R24,0x10
    02FA 93800065  STS	0x65,R24
(0392) 	//mInitSTDIO( );
(0393)   //	printf( "Start\n" );
(0394)   ShowText(10,5,"开始");
    02FC E68F      LDI	R24,0x6F
    02FD E091      LDI	R25,1
    02FE 8399      STD	Y+1,R25
    02FF 8388      STD	Y+0,R24
    0300 E025      LDI	R18,5
    0301 E030      LDI	R19,0
    0302 E00A      LDI	R16,0xA
    0303 E010      LDI	R17,0
    0304 940E0548  CALL	_ShowText
(0395) 	c = mCH375Init( );  /* 初始化CH375 */
    0306 DE23      RCALL	_mCH375Init
    0307 2EA0      MOV	R10,R16
(0396) 	//if ( c );// printf( "Error @CH375Init\n" );
(0397) 	/*	{
(0398) 			ShowText(10,21,"初始化错误!");
(0399) 	    while ( 1 ) 
(0400) 	     {
(0401) 		     LED_OUT_ACT( );  //LED闪烁 
(0402) 		     mDelaymS( 80 );
(0403) 		     LED_OUT_INACT( );
(0404) 		     mDelaymS( 80 );
(0405) 	     }
(0406) 		} */
(0407) 	//printf( "Insert USB disk\n" );
(0408) 	
(0409) 	
(0410) 
(0411) 
(0412) 	
(0413) 	ShowText(10,21,"等待插入U盘......");
    0308 E58D      LDI	R24,0x5D
    0309 E091      LDI	R25,1
    030A 8399      STD	Y+1,R25
    030B 8388      STD	Y+0,R24
    030C E125      LDI	R18,0x15
    030D E030      LDI	R19,0
    030E E00A      LDI	R16,0xA
    030F E010      LDI	R17,0
    0310 940E0548  CALL	_ShowText
(0414) 	do {  /* 等待U盘连接 */
(0415) 		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
    0312 DE02      RCALL	_mWaitInterrupt
    0313 2EE0      MOV	R14,R16
(0416) 	} while ( mIntStatus != USB_INT_CONNECT );  /* U盘没有连接或者已经拔出 */
    0314 2D8E      MOV	R24,R14
    0315 3185      CPI	R24,0x15
    0316 F7D9      BNE	0x0312
(0417) 	mDelaymS( 200 );  /* 延时等待U盘进入正常工作状态 */
    0317 EC08      LDI	R16,0xC8
    0318 DDAD      RCALL	_mDelaymS
(0418) 	//printf( "InitDisk\n" ); 
(0419) 	ShowText(10,37,"已插入U盘......");
    0319 E48D      LDI	R24,0x4D
    031A E091      LDI	R25,1
    031B 8399      STD	Y+1,R25
    031C 8388      STD	Y+0,R24
    031D E225      LDI	R18,0x25
    031E E030      LDI	R19,0
    031F E00A      LDI	R16,0xA
    0320 E010      LDI	R17,0
    0321 940E0548  CALL	_ShowText
(0420) 	loop:
(0421) 	c = mInitDisk( );  /* 初始化U盘,实际是识别U盘的类型,不影响U盘中的数据,在所有读写操作之前必须进行此步骤 */
    0323 DE39      RCALL	_mInitDisk
    0324 2EA0      MOV	R10,R16
(0422) 	if ( c )// printf( "Error @InitDisk, %02X\n", c );
    0325 2300      TST	R16
    0326 F0D1      BEQ	0x0341
(0423) 		{
(0424) 		   ShowText(10,53,"初始化U盘错误");
    0327 E38F      LDI	R24,0x3F
    0328 E091      LDI	R25,1
    0329 8399      STD	Y+1,R25
    032A 8388      STD	Y+0,R24
    032B E325      LDI	R18,0x35
    032C E030      LDI	R19,0
    032D E00A      LDI	R16,0xA
    032E E010      LDI	R17,0
    032F 940E0548  CALL	_ShowText
    0331 C00E      RJMP	0x0340
(0425) 			while ( 1 ) 
(0426) 	     {
(0427) 		    LED_OUT_ACT( );  /* LED闪烁 */
    0332 91800065  LDS	R24,0x65
    0334 7E8F      ANDI	R24,0xEF
    0335 93800065  STS	0x65,R24
(0428) 		    mDelaymS( 80 );
    0337 E500      LDI	R16,0x50
    0338 DD8D      RCALL	_mDelaymS
(0429) 		    LED_OUT_INACT( );
    0339 91800065  LDS	R24,0x65
    033B 6180      ORI	R24,0x10
    033C 93800065  STS	0x65,R24
(0430) 		    mDelaymS( 80 );
    033E E500      LDI	R16,0x50
    033F DD86      RCALL	_mDelaymS
    0340 CFF1      RJMP	0x0332
(0431) 	     }
(0432)     }
(0433) 
(0434) 	for(i=0;i<100;i++)
    0341 24CC      CLR	R12
    0342 24DD      CLR	R13
    0343 C00A      RJMP	0x034E
(0435) 	{
(0436) 		  DATA_BUFFER[i]=168;
    0344 EA83      LDI	R24,0xA3
    0345 E091      LDI	R25,1
    0346 01F6      MOVW	R30,R12
    0347 0FE8      ADD	R30,R24
    0348 1FF9      ADC	R31,R25
    0349 EA88      LDI	R24,0xA8
    034A 8380      STD	Z+0,R24
    034B 01C6      MOVW	R24,R12
    034C 9601      ADIW	R24,1
    034D 016C      MOVW	R12,R24

⌨️ 快捷键说明

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