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