📄 urw.lst
字号:
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 + -