📄 task.s
字号:
.module task.c
.area data(ram, con, rel)
_SONG_state::
.blkb 1
.area idata
.byte 5
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\task.c
.dbsym e SONG_state _SONG_state c
_disp_state::
.blkb 1
.area idata
.byte 5
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\task.c
.dbsym e disp_state _disp_state c
_STA013_INIT::
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\task.c
.dbsym e STA013_INIT _STA013_INIT c
.area bss(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\task.c
L2:
.blkb 4
L3:
.blkb 2
L4:
.blkb 2
L5:
.blkb 2
L6:
.blkb 1
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\task.c
.dbfunc e SONG_task _SONG_task fV
.dbsym s doing1 L6 c
.dbsym s file_Clus_sendnumber L5 i
.dbsym s file_Clus_allnumber L4 i
.dbsym s bytepersec L3 i
.dbsym s new_Sec L2 l
; doing -> R10
; FAT_Clus -> y+5
.even
_SONG_task::
xcall push_gset4
sbiw R28,13
.dbline -1
.dbline 34
; //ICC-AVR application builder : 2005-11-12 17:11:59
; // Target : M16
; // Crystal: 8.0000Mhz
; // copyright:鲁军波(endylu)
; // www.shop34612283.taobao.com
; // www.adembed.com
; #include <iom16v.h>
; #include <macros.h>
; #include "main.h"
; extern uint8 timer1_over;
; extern uint8 key_value;
; extern uint8 set_volume;
; extern uint8 MP3_all_number;
; extern uint8 MP3_current_number;
; extern uint8 play_state;
;
; extern MP3_INFO mp3_info;
; extern FAT_INFO fat_info;
;
; extern uint32 CHINALIB_point;
; extern uint32 UNICODE_point;
;
; extern uint8 buffer[512];
; //extern const uint8 BassTrebleTable[48];
;
; uint8 SONG_state=song_over;
; uint8 secperclus; //对下面显示歌词的时间有关
;
; uint8 disp_state=5;
; uint8 STA013_INIT=1;
;
; //=======================================================================
; void SONG_task(void)
; {
.dbline 46
; static uint32 new_Sec;
;
; static uint16 bytepersec;
;
; static uint16 file_Clus_allnumber;
; static uint16 file_Clus_sendnumber;
;
; uint32 FAT_Clus;
; uint8 doing;
; static uint8 doing1;
;
; switch(SONG_state)
lds R10,_SONG_state
clr R11
tst R10
brne X0
tst R11
brne X4
xjmp L8
X4:
X0:
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
breq L11
cpi R24,2
ldi R30,0
cpc R25,R30
brne X5
xjmp L22
X5:
cpi R24,3
ldi R30,0
cpc R25,R30
brne X6
xjmp L38
X6:
cpi R24,4
ldi R30,0
cpc R25,R30
brne X7
xjmp L41
X7:
cpi R24,5
ldi R30,0
cpc R25,R30
brne X8
xjmp L47
X8:
xjmp L7
X1:
.dbline 47
; {
.dbline 49
; case song_stop:
; {
.dbline 51
;
; break;
L11:
.dbline 54
; }
; case song_start:
; {
.dbline 55
; file_Clus_allnumber=((mp3_info.DIR_Filesize[0]>>1)+((int)(mp3_info.DIR_Filesize[1])<<7))/(fat_info.BPB_SecPerClus)+1; //多少簇
ldi R18,7
ldi R19,0
lds R16,_mp3_info+55+1
clr R17
xcall lsl16
movw R2,R16
lds R16,_mp3_info+55
clr R17
asr R17
ror R16
add R16,R2
adc R17,R3
lds R18,_fat_info+1
clr R19
xcall div16s
movw R24,R16
adiw R24,1
sts L4+1,R25
sts L4,R24
.dbline 56
; new_Sec=(((long)(mp3_info.DIR_FstClusL[1])<<8)+(mp3_info.DIR_FstClusL[0])-2)*fat_info.BPB_SecPerClus+fat_info.FirstDateSecter; //簇的头扇区号
ldi R24,8
ldi R25,0
lds R2,_mp3_info+53+1
clr R3
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
lds R6,_mp3_info+53
clr R7
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
lds R6,_fat_info+1
clr R7
clr R8
clr R9
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R2
movw R18,R4
xcall empy32s
movw R2,R16
movw R4,R18
lds R6,_fat_info+5
lds R7,_fat_info+5+1
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
sts L2+1,R3
sts L2,R2
sts L2+2+1,R5
sts L2+2,R4
.dbline 57
; file_Clus_sendnumber=0;
clr R2
clr R3
sts L5+1,R3
sts L5,R2
.dbline 59
;
; SONG_state=song_read_sector;
ldi R24,3
sts _SONG_state,R24
.dbline 60
; secperclus=fat_info.BPB_SecPerClus;
lds R2,_fat_info+1
sts _secperclus,R2
.dbline 62
;
; break;
xjmp L8
L22:
.dbline 66
; }
;
; case song_find_newsec:
; {
.dbline 67
; FAT_Clus=((long)(fat_info.Relative+fat_info.BPB_RsvdSecCnt+mp3_info.DIR_FstClusL[1])<<9)+((int)mp3_info.DIR_FstClusL[0]<<1);
lds R2,_fat_info+2
clr R3
lds R4,_fat_info
clr R5
add R4,R2
adc R5,R3
lds R2,_mp3_info+53+1
clr R3
add R4,R2
adc R5,R3
movw R2,R4
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
ldi R24,9
ldi R25,0
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
lds R6,_mp3_info+53
clr R7
lsl R6
rol R7
clr R8
sbrc R7,7
com R8
clr R9
sbrc R8,7
com R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+5,R2
std z+6,R3
std z+7,R4
std z+8,R5
.dbline 69
;
; SD_read_sector2(FAT_Clus,mp3_info.DIR_FstClusL,2);
ldi R24,2
ldi R25,0
std y+3,R25
std y+2,R24
ldi R24,<_mp3_info+53
ldi R25,>_mp3_info+53
std y+1,R25
std y+0,R24
movw R30,R28
ldd R16,z+5
ldd R17,z+6
ldd R18,z+7
ldd R19,z+8
xcall _SD_read_sector2
.dbline 71
;
; new_Sec=((long)(mp3_info.DIR_FstClusL[1])<<8)+mp3_info.DIR_FstClusL[0];
ldi R24,8
ldi R25,0
lds R2,_mp3_info+53+1
clr R3
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
lds R6,_mp3_info+53
clr R7
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
sts L2+1,R3
sts L2,R2
sts L2+2+1,R5
sts L2+2,R4
.dbline 73
;
; if(new_Sec>=0xfff8)
ldi R20,248
ldi R21,255
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L31
.dbline 74
; SONG_state=song_over;
ldi R24,5
sts _SONG_state,R24
xjmp L8
L31:
.dbline 76
; else
; {new_Sec=(new_Sec-2)*(fat_info.BPB_SecPerClus)+fat_info.FirstDateSecter; //簇的头扇区号
.dbline 76
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,L2+2
lds R5,L2+2+1
lds R2,L2
lds R3,L2+1
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
lds R6,_fat_info+1
clr R7
clr R8
clr R9
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R2
movw R18,R4
xcall empy32u
movw R2,R16
movw R4,R18
lds R6,_fat_info+5
lds R7,_fat_info+5+1
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
sts L2+1,R3
sts L2,R2
sts L2+2+1,R5
sts L2+2,R4
.dbline 78
;
; doing=((long)file_Clus_sendnumber*80)/file_Clus_allnumber;
lds R2,L5
lds R3,L5+1
clr R4
clr R5
ldi R20,80
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
lds R2,L4
lds R3,L4+1
clr R4
clr R5
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall div32s
mov R10,R16
.dbline 79
; if(doing1!=doing)
lds R2,L6
cp R2,R16
breq L35
.dbline 80
; {
.dbline 81
; LCD_set_XY(doing+1,4);
ldi R18,4
subi R16,255 ; addi 1
xcall _LCD_set_XY
.dbline 82
; LCD_write_byte(0x5d,1);
ldi R18,1
ldi R16,93
xcall _LCD_write_byte
.dbline 83
; doing1=doing;
sts L6,R10
.dbline 84
; }
L35:
.dbline 85
; file_Clus_sendnumber++;
lds R24,L5
lds R25,L5+1
adiw R24,1
sts L5+1,R25
sts L5,R24
.dbline 86
; SONG_state=song_read_sector;
ldi R24,3
sts _SONG_state,R24
.dbline 87
; secperclus=fat_info.BPB_SecPerClus; //每簇多少扇区
lds R2,_fat_info+1
sts _secperclus,R2
.dbline 88
; }
.dbline 89
; break;
xjmp L8
L38:
.dbline 92
; }
; case song_read_sector:
; {
.dbline 93
; if(secperclus--)
lds R2,_secperclus
clr R3
mov R24,R2
subi R24,1
sts _secperclus,R24
tst R2
brne X9
xjmp L39
X9:
.dbline 94
; {
.dbline 95
; SD_start_read(new_Sec++);
lds R4,L2+2
lds R5,L2+2+1
lds R2,L2
lds R3,L2+1
movw R30,R28
std z+9,R2
std z+10,R3
std z+11,R4
std z+12,R5
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+9
ldd R3,z+10
ldd R4,z+11
ldd R5,z+12
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts L2+1,R3
sts L2,R2
sts L2+2+1,R5
sts L2+2,R4
movw R30,R28
ldd R16,z+9
ldd R17,z+10
ldd R18,z+11
ldd R19,z+12
xcall _SD_start_read
.dbline 96
; SD_get_date(buffer,512);
ldi R18,512
ldi R19,2
ldi R16,<_buffer
ldi R17,>_buffer
xcall _SD_get_date
.dbline 97
; SONG_state=song_send_frame;
ldi R24,4
sts _SONG_state,R24
.dbline 98
; bytepersec=0;
clr R2
clr R3
sts L3+1,R3
sts L3,R2
.dbline 99
; }
xjmp L8
L39:
.dbline 101
; else
; SONG_state=song_find_newsec;
ldi R24,2
sts _SONG_state,R24
.dbline 102
; break;
xjmp L8
L41:
.dbline 105
; }
; case song_send_frame:
; {
.dbline 106
; STA013_Enable();
sbi 0x1b,3
.dbline 106
xjmp L43
L42:
.dbline 108
; while(sta_Demand()) //每次连续请求6ms,隔20ms才又来请求
; {
.dbline 109
; Write_Byte_SD(*(buffer+bytepersec++));
lds R2,L3
lds R3,L3+1
movw R24,R2
adiw R24,1
sts L3+1,R25
sts L3,R24
ldi R24,<_buffer
ldi R25,>_buffer
movw R30,R2
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _Write_Byte_SD
.dbline 110
; if(bytepersec==512)
lds R24,L3
lds R25,L3+1
cpi R24,0
ldi R30,2
cpc R25,R30
brne L45
.dbline 111
; {SONG_state=song_read_sector;
.dbline 111
ldi R24,3
sts _SONG_state,R24
.dbline 112
; break;
xjmp L44
L45:
.dbline 114
L43:
.dbline 107
xcall _sta_Demand
tst R16
brne L42
L44:
.dbline 115
; }
; }
; STA013_Disable();
cbi 0x1b,3
.dbline 115
.dbline 117
;
; break;
xjmp L8
L47:
.dbline 120
; }
; case song_over:
; {
.dbline 121
; doing1=0;
clr R2
sts L6,R2
.dbline 122
; MP3_current_number++;
lds R24,_MP3_current_number
subi R24,255 ; addi 1
sts _MP3_current_number,R24
.dbline 123
; if(MP3_current_number>MP3_all_number)
lds R2,_MP3_all_number
cp R2,R24
brsh L48
.dbline 124
; MP3_current_number=1;
ldi R24,1
sts _MP3_current_number,R24
L48:
.dbline 125
; GEPAI();
xcall _GEPAI
.dbline 126
; JINGDU();
xcall _JINGDU
.dbline 127
; ASCII(buffer,MP3_current_number);
lds R18,_MP3_current_number
ldi R16,<_buffer
ldi R17,>_buffer
xcall _ASCII
.dbline 128
; LCD_write_String(8,5,2,buffer,0);
clr R2
std y+4,R2
ldi R24,<_buffer
ldi R25,>_buffer
std y+3,R25
std y+2,R24
ldi R24,2
std y+0,R24
ldi R18,5
ldi R16,8
xcall _LCD_write_String
.dbline 130
;
; MP3_Directory(MP3_current_number);
lds R16,_MP3_current_number
xcall _MP3_Directory
.dbline 131
; if(mp3_info.Name_number==0)
lds R2,_mp3_info+52
tst R2
breq X10
xjmp L50
X10:
.dbline 132
; if((UNICODE_point>0)&(CHINALIB_point>0))
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_UNICODE_point+2
lds R5,_UNICODE_point+2+1
lds R2,_UNICODE_point
lds R3,_UNICODE_point+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L55
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L56
L55:
clr R12
clr R13
L56:
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_CHINALIB_point+2
lds R5,_CHINALIB_point+2+1
lds R2,_CHINALIB_point
lds R3,_CHINALIB_point+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L57
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L58
L57:
clr R10
clr R11
L58:
movw R2,R12
and R2,R10
and R3,R11
tst R2
brne X2
tst R3
breq L53
X2:
.dbline 133
; LCD_write_String(6,2,8,buffer,0);
clr R2
std y+4,R2
ldi R24,<_buffer
ldi R25,>_buffer
std y+3,R25
std y+2,R24
ldi R24,8
std y+0,R24
ldi R18,2
ldi R16,6
xcall _LCD_write_String
L53:
L50:
.dbline 135
;
; if((MP3_current_number==1)|(play_state==0))
lds R24,_MP3_current_number
cpi R24,1
brne L61
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L62
L61:
clr R12
clr R13
L62:
lds R2,_play_state
tst R2
brne L63
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L64
L63:
clr R10
clr R11
L64:
movw R2,R12
or R2,R10
or R3,R11
tst R2
brne X3
tst R3
breq L59
X3:
.dbline 136
; {SONG_state=song_stop;
.dbline 136
clr R2
sts _SONG_state,R2
.dbline 137
; if(play_state!=2)
lds R24,_play_state
cpi R24,2
breq L60
.dbline 138
; {play_state=0;
.dbline 138
sts _play_state,R2
.dbline 139
; LCD_write_tubiao(0,5,0);
std y+0,R2
ldi R18,5
clr R16
xcall _LCD_write_tubiao
.dbline 140
; }
.dbline 141
; }
xjmp L60
L59:
.dbline 143
; else
; {SONG_state=song_start;
.dbline 143
ldi R24,1
sts _SONG_state,R24
.dbline 144
; }
L60:
.dbline 145
; disp_state=5;
ldi R24,5
sts _disp_state,R24
.dbline 146
; break;
L7:
L8:
.dbline -2
L1:
adiw R28,13
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r doing 10 c
.dbsym l FAT_Clus 5 l
.dbend
.dbfunc e KBOD_task _KBOD_task fV
.even
_KBOD_task::
xcall push_gset1
sbiw R28,1
.dbline -1
.dbline 153
; }
; }
; }
;
; //=======================================================================
; void KBOD_task(void)
; {
.dbline 154
; if(key_value!=0)
lds R2,_key_value
tst R2
brne X13
xjmp L68
X13:
.dbline 155
; {
.dbline 156
; switch(key_value)
mov R20,R2
clr R21
cpi R20,216
ldi R30,0
cpc R21,R30
brne X14
xjmp L85
X14:
ldi R24,216
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L103
L102:
cpi R20,120
ldi R30,0
cpc R21,R30
brne X15
xjmp L79
X15:
cpi R20,120
ldi R30,0
cpc R21,R30
brge X16
xjmp L70
X16:
L104:
cpi R20,184
ldi R30,0
cpc R21,R30
breq L73
xjmp L70
L103:
cpi R20,232
ldi R30,0
cpc R21,R30
brne X17
xjmp L88
X17:
cpi R20,232
ldi R30,0
cpc R21,R30
brge X18
xjmp L70
X18:
L105:
cpi R20,240
ldi R30,0
cpc R21,R30
brne X19
xjmp L93
X19:
xjmp L70
X11:
.dbline 157
; {
L73:
.dbline 159
; case volume_add:
; {
.dbline 160
; if(set_volume<8)
lds R24,_set_volume
cpi R24,8
brsh L74
.dbline 161
; {set_volume++;
.dbline 161
subi R24,255 ; addi 1
sts _set_volume,R24
.dbline 162
; }
L74:
.dbline 163
; LCD_set_XY(59,5);
ldi R18,5
ldi R16,59
xcall _LCD_set_XY
.dbline 164
; key_value=set_volume*3;
lds R2,_set_volume
ldi R24,3
mul R24,R2
sts _key_value,R0
xjmp L77
L76:
.dbline 166
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -