📄 mp3_7210.lst
字号:
04DF 2300 TST R16
04E0 F3E1 BEQ 0x04DD
(0095) // led1_on;
(0096) }
04E1 C004 RJMP 0x04E6
(0097) else //是其他命令
(0098) {
(0099) while (SPI_tx_rx(0xff)==0);
04E2 EF0F LDI R16,0xFF
04E3 DFCE RCALL _SPI_tx_rx
04E4 2300 TST R16
04E5 F3E1 BEQ 0x04E2
(0100) // led1_on;
(0101) }
(0102) return temp;
04E6 2F04 MOV R16,R20
04E7 940E05F5 CALL pop_gset2
04E9 9508 RET
(0103) }
(0104) /***********MMC_finish();***停止卡片******/
(0105) void MMC_finish(void)
(0106) {
(0107) disable_mmc_cs;
_MMC_finish:
04EA 9AC0 SBI 0x18,0
(0108) SPI_tx_rx(0xff);
04EB EF0F LDI R16,0xFF
(0109) }
04EC CFC5 RJMP _SPI_tx_rx
_MMC_flush:
counter --> R20
flush_num --> R22
04ED 940E0615 CALL push_gset2
04EF 2F60 MOV R22,R16
(0110)
(0111) /***********MMC_flush();*****丢弃几个字节*******/
(0112) void MMC_flush(unsigned char flush_num);
(0113) void MMC_flush(unsigned char flush_num)
(0114) {
(0115) unsigned char counter;
(0116) for (counter=0;counter<flush_num;counter++) SPI_tx_rx(0xff); //丢弃几个字节
04F0 2744 CLR R20
04F1 C003 RJMP 0x04F5
04F2 EF0F LDI R16,0xFF
04F3 DFBE RCALL _SPI_tx_rx
04F4 9543 INC R20
04F5 1746 CP R20,R22
04F6 F3D8 BCS 0x04F2
(0117) MMC_finish();
04F7 DFF2 RCALL _MMC_finish
(0118) }
04F8 940E05F5 CALL pop_gset2
04FA 9508 RET
_MMC_reset:
lcd_add --> Y+6
mmc_response --> R20
counter --> R22
04FB 940E0615 CALL push_gset2
04FD 9725 SBIW R28,5
(0119)
(0120) /***********MMC_reset();***将MMC卡转到SPI模式****/
(0121) void MMC_reset(void)
(0122) {
(0123) unsigned char counter,mmc_response,lcd_add;
(0124) for (counter=0;counter<11;counter++) SPI_tx_rx(0xff);//80个时钟开始总线
04FE 2766 CLR R22
04FF C003 RJMP 0x0503
0500 EF0F LDI R16,0xFF
0501 DFB0 RCALL _SPI_tx_rx
0502 9563 INC R22
0503 306B CPI R22,0xB
0504 F3D8 BCS 0x0500
(0125)
(0126) mmc_response=MMC_sendCmd(MMC_GO_IDLE_STATE,0,0,0,0); //send cmd0
0505 2422 CLR R2
0506 822C STD Y+4,R2
0507 822A STD Y+2,R2
0508 8228 STD Y+0,R2
0509 2722 CLR R18
050A 2700 CLR R16
050B DFAB RCALL _MMC_sendCmd
050C 2F40 MOV R20,R16
(0127) MMC_finish();
050D DFDC RCALL _MMC_finish
(0128)
(0129) for (counter=0;counter<80;counter++) //失败尝试次数
050E 2766 CLR R22
050F C010 RJMP 0x0520
(0130) {
(0131)
(0132) mmc_response=MMC_sendCmd(MMC_SEND_OP_COND,0,0,0,0);
0510 2422 CLR R2
0511 822C STD Y+4,R2
0512 822A STD Y+2,R2
0513 8228 STD Y+0,R2
0514 2722 CLR R18
0515 E001 LDI R16,1
0516 DFA0 RCALL _MMC_sendCmd
0517 2F40 MOV R20,R16
(0133) MMC_finish();
0518 DFD1 RCALL _MMC_finish
(0134)
(0135) if (mmc_response==0) //切换到SPI成功
0519 2344 TST R20
051A F419 BNE 0x051E
(0136) {
(0137) led2_on;
051B 98DD CBI 0x1B,5
(0138) counter=81; //跳出失败尝试次数
051C E561 LDI R22,0x51
(0139) }
051D C001 RJMP 0x051F
(0140) else led1_on; //切换到SPI失败
051E 98DE CBI 0x1B,6
051F 9563 INC R22
0520 3560 CPI R22,0x50
0521 F370 BCS 0x0510
(0141)
(0142) }
(0143)
(0144) }
0522 9625 ADIW R28,5
0523 940E05F5 CALL pop_gset2
0525 9508 RET
_MMC_check:
mmc_response --> R20
0526 940E05FE CALL push_gset1
0528 9725 SBIW R28,5
(0145)
(0146) /***********MMC_check();******测试卡是否正常为0***********/
(0147) unsigned char MMC_check(void);
(0148) unsigned char MMC_check(void)
(0149) {
(0150) unsigned char mmc_response;
(0151) mmc_response=MMC_sendCmd(MMC_SEND_STATUS,0,0,0,0); //send cmd
0529 2422 CLR R2
052A 822C STD Y+4,R2
052B 822A STD Y+2,R2
052C 8228 STD Y+0,R2
052D 2722 CLR R18
052E E00D LDI R16,0xD
052F DF87 RCALL _MMC_sendCmd
0530 2F40 MOV R20,R16
(0152) MMC_finish();
0531 DFB8 RCALL _MMC_finish
(0153) LCD_write(0x55,1); //test point
0532 E021 LDI R18,1
0533 E505 LDI R16,0x55
0534 940E01A3 CALL _LCD_write
(0154) LCD_write(mmc_response&0x93,1); //test point
0536 E021 LDI R18,1
0537 2F04 MOV R16,R20
0538 7903 ANDI R16,0x93
0539 940E01A3 CALL _LCD_write
(0155) LCD_write(0x55,1); //test point
053B E021 LDI R18,1
053C E505 LDI R16,0x55
053D 940E01A3 CALL _LCD_write
(0156) return (mmc_response&0x93);
053F 2F04 MOV R16,R20
0540 7903 ANDI R16,0x93
0541 9625 ADIW R28,5
0542 940E0601 CALL pop_gset1
0544 9508 RET
_MMC_name:
lcd_add --> Y+6
mmc_response --> R20
counter --> R22
0545 940E0615 CALL push_gset2
0547 9725 SBIW R28,5
(0157) }
(0158)
(0159)
(0160) /***********MMC_name();**获得卡的名字*****/
(0161) void MMC_name(void)
(0162) {
(0163) unsigned char counter,lcd_add,mmc_response=1;
0548 E041 LDI R20,1
(0164) mmc_response=MMC_sendCmd(MMC_SEND_CID,0,0,0,0);
0549 2422 CLR R2
054A 822C STD Y+4,R2
054B 822A STD Y+2,R2
054C 8228 STD Y+0,R2
054D 2722 CLR R18
054E E00A LDI R16,0xA
054F DF67 RCALL _MMC_sendCmd
0550 2F40 MOV R20,R16
0551 C00D RJMP 0x055F
(0165) while (mmc_response) //读到数据为0表示正常,就跳出
(0166) {
(0167) MMC_finish();
0552 DF97 RCALL _MMC_finish
(0168) mmc_response=MMC_sendCmd(MMC_SEND_CID,0,0,0,0);
0553 2422 CLR R2
0554 822C STD Y+4,R2
0555 822A STD Y+2,R2
0556 8228 STD Y+0,R2
0557 2722 CLR R18
0558 E00A LDI R16,0xA
0559 DF5D RCALL _MMC_sendCmd
055A 2F40 MOV R20,R16
(0169) LCD_write(mmc_response,1); //test point
055B E021 LDI R18,1
055C 940E01A3 CALL _LCD_write
(0170) led1_on; //test point
055E 98DE CBI 0x1B,6
055F 2344 TST R20
0560 F789 BNE 0x0552
(0171) // prog_flag=1; //错误标记
(0172) }
(0173) led1_off; //test point
0561 9ADE SBI 0x1B,6
(0174) for (counter=0;counter<26;counter++)
0562 2766 CLR R22
0563 C012 RJMP 0x0576
(0175) {
(0176) ram_data[counter]=SPI_tx_rx(0xff);
0564 EF0F LDI R16,0xFF
0565 DF4C RCALL _SPI_tx_rx
0566 E686 LDI R24,0x66
0567 E091 LDI R25,1
0568 2FE6 MOV R30,R22
0569 27FF CLR R31
056A 0FE8 ADD R30,R24
056B 1FF9 ADC R31,R25
056C 8300 STD Z+0,R16
(0177) LCD_write(ram_data[counter],1); //test point
056D E021 LDI R18,1
056E 2FE6 MOV R30,R22
056F 27FF CLR R31
0570 0FE8 ADD R30,R24
0571 1FF9 ADC R31,R25
0572 8100 LDD R16,Z+0
0573 940E01A3 CALL _LCD_write
0575 9563 INC R22
0576 316A CPI R22,0x1A
0577 F360 BCS 0x0564
(0178) }
(0179) MMC_flush(8);
0578 E008 LDI R16,0x8
0579 DF73 RCALL _MMC_flush
(0180) }
057A 9625 ADIW R28,5
057B 940E05F5 CALL pop_gset2
057D 9508 RET
_MMC_capactity:
lcd_add --> Y+6
mmc_response --> R20
counter --> R22
057E 940E0615 CALL push_gset2
0580 9725 SBIW R28,5
(0181)
(0182) /***********MMC_capactity();******************/
(0183) unsigned long MMC_capactity(void);
(0184) unsigned long MMC_capactity(void)
(0185) {
(0186) unsigned char counter,lcd_add,mmc_response=1;
0581 E041 LDI R20,1
(0187) mmc_response=MMC_sendCmd(MMC_SEND_CSD,0,0,0,0);
0582 2422 CLR R2
0583 822C STD Y+4,R2
0584 822A STD Y+2,R2
0585 8228 STD Y+0,R2
0586 2722 CLR R18
0587 E009 LDI R16,0x9
0588 DF2E RCALL _MMC_sendCmd
0589 2F40 MOV R20,R16
058A C00D RJMP 0x0598
(0188) while (mmc_response) //读到数据为0表示正常,就跳出
(0189) {
(0190) MMC_finish();
058B DF5E RCALL _MMC_finish
(0191) mmc_response=MMC_sendCmd(MMC_SEND_CID,0,0,0,0);
058C 2422 CLR R2
058D 822C STD Y+4,R2
058E 822A STD Y+2,R2
058F 8228 STD Y+0,R2
0590 2722 CLR R18
0591 E00A LDI R16,0xA
0592 DF24 RCALL _MMC_sendCmd
0593 2F40 MOV R20,R16
(0192) LCD_write(mmc_response,1); //test point
0594 E021 LDI R18,1
0595 940E01A3 CALL _LCD_write
(0193) led1_on; //test point
0597 98DE CBI 0x1B,6
0598 2344 TST R20
0599 F789 BNE 0x058B
(0194) // prog_flag=1; //错误标记
(0195) }
(0196) led1_off; //test point
059A 9ADE SBI 0x1B,6
(0197) for (counter=0;counter<26;counter++)
059B 2766 CLR R22
059C C012 RJMP 0x05AF
(0198) {
(0199) ram_data[counter]=SPI_tx_rx(0xff);
059D EF0F LDI R16,0xFF
059E DF13 RCALL _SPI_tx_rx
059F E686 LDI R24,0x66
05A0 E091 LDI R25,1
05A1 2FE6 MOV R30,R22
05A2 27FF CLR R31
05A3 0FE8 ADD R30,R24
05A4 1FF9 ADC R31,R25
05A5 8300 STD Z+0,R16
(0200) LCD_write(ram_data[counter],1); //test point
05A6 E021 LDI R18,1
05A7 2FE6 MOV R30,R22
05A8 27FF CLR R31
05A9 0FE8 ADD R30,R24
05AA 1FF9 ADC R31,R25
05AB 8100 LDD R16,Z+0
05AC 940E01A3 CALL _LCD_write
05AE 9563 INC R22
05AF 316A CPI R22,0x1A
05B0 F360 BCS 0x059D
(0201) }
(0202) MMC_flush(8);
05B1 E008 LDI R16,0x8
05B2 DF3A RCALL _MMC_flush
(0203)
(0204)
(0205) }
05B3 9625 ADIW R28,5
05B4 940E05F5 CALL pop_gset2
05B6 9508 RET
FILE: G:\mega8\atmega16\mp3_7210\io_init.c
(0001) #include <iom16v.h>
(0002)
(0003) /***********端口初始化******************/
(0004) /**DDRx PORTx I/O 上拉*****************/
(0005) /* 0 0 I N
(0006) /* 0 1 I Y
(0007) /* 1 0 O output0
(0008) /* 1 1 O output1
(0009)
(0010) /***********端口初始化****适用于rev.a*********/
(0011) void port_init(void)
(0012) {
(0013) /*bit7=V_battery bit6=LED1 bit5=LED2 bit4=NU
(0014) bit3=VS_REST bit2=VS_BSY bit1=VS_CS bit0=VS_DR/DC*/
(0015) DDRA =0b01101110; /**/
_port_init:
05B7 E68E LDI R24,0x6E
05B8 BB8A OUT 0x1A,R24
(0016) PORTA=0b00001111; /*led on*/
05B9 E08F LDI R24,0xF
05BA BB8B OUT 0x1B,R24
(0017)
(0018) /*bit7=SCK bi6t=MISO bit5=MOSI bit4=LCD_reset
(0019) bit3=LCD_CS bit2=LCD_led_CTRL bit1=NU bit0=MMC_CS*/
(0020) DDRB =0b10111101; /* */
05BB EB8D LDI R24,0xBD
05BC BB87 OUT 0x17,R24
(0021) PORTB=0b11110101; /*LCD_led on*/
05BD EF85 LDI R24,0xF5
05BE BB88 OUT 0x18,R24
(0022)
(0023) /*bit7~bit0=usb_data*/
(0024) DDRC =0b00000000; /* */
05BF 2422 CLR R2
05C0 BA24 OUT 0x14,R2
(0025) PORTC=0b00000000; /**/
05C1 BA25 OUT 0x15,R2
(0026)
(0027) /*bit7=FT_RXF bi6t=FT_TXE bit5=FT_WR bit4=FT_RD
(0028) bit3=SW3 bit2=SW2 bit1=SW1 bit0=SW4*/
(0029) DDRD =0b00110000; /**/
05C2 E380 LDI R24,0x30
05C3 BB81 OUT 0x11,R24
(0030) PORTD=0b00101111; /*FT_WR=0 FT_RD=1*/
05C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -