📄 music.s
字号:
.module music.c
.area text(rom, con, rel)
.dbfile D:/icc/include/diy0206.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 81
; /*******************************************
; 广州双龙电子
; www.sl.com.cn
;
; Chip type : ATMEGA16
; Clock frequency : 8MHz
;
; /**************************************************************
; 声控启动,分别按下A,B,C,D键,小车
; 作前进,后退,左右转弯动作并演奏不同乐曲
; 演奏过程中若有键按下,则即时切换到相应状态
; ********************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include <diy0206.c>
; #pragma interrupt_handler timer0:10
; #pragma interrupt_handler timer1:7
; unsigned char remote_in;
; const unsigned int music_data[][2]=
; /*******************************************
; 卡秋莎音乐数据{x,y}
; x:对应音符音阶(频率),0表示休止符
; y:对应音符节拍
; ********************************************/
; {
; {440,600},{494,200},{523,600} ,{440,200},
; {523,400},{494,200},{440,200} ,{494,400},
; {330,400},{494,600},{523,200} ,{578,600},
; {494,200},{578,400},{523,200} ,{0,0},
; {494,200},{440,800},{659,400} ,{880,400},
; {784,400},{880,200},{784,200} ,{698,400},
; {659,200},{578,200},{659,400} ,{440,400},
; {698,400},{578,200},{659,600} ,{0,0},
; {523,200},{494,200},{330,200} ,{523,200},
; {494,200},{440,800},{659,400} ,{880,400},
; {784,400},{880,200},{784,200} ,{0,0},
; {698,400},{659,200},{578,200} ,{659,400} ,
; {440,400},{698,400},{578,200} , {659,600},
; {523,200},{494,200},{330,200} , {523,200},
; {494,200},{440,800},{0,0}};
; #pragma data:data
; unsigned int delay=0;
; /*******************************
; MCU初始化
; *******************************/
; void music_init(void)
; {
; MCUCR=0x00;//低电平时产生中断
; DDRC=0x01;
; TCCR1A=0x00;
; TCCR1B=0x09;//TIMER1无预分频
; TCCR0=0x03;//CK/64
; TCNT0=0x19;
; TIMSK=(1<<OCIE1A)|(1<<TOIE0);
; }
; /**************************************************
; T0中断程序,产生音乐节拍
; **************************************************/
; void timer0(void)
; {
; delay++;
; TCNT0=0x19;
; }
; /**************************************************
; T1中断程序,根据SOUND函数输出一定频率的方波
; **************************************************/
; void timer1(void)
; {
; PORTC^=0x01;
; }
; /*****************************************************
; SOUND程序,输出频率为 x HZ的方波,延时 y MS
; x:100~20000 HZ, 0表示不发声
; y:0~65536 MS
; *****************************************************/
; void sound(unsigned int x,unsigned int y)
; {
; SEI(); //开总中断
; delay=0;
; if (x!=0)//不是休止符
; {
.dbline 82
; x=4000000/x; //计算发声频率
ldi R24,255
out 0x1a,R24
.dbline 82
out 0x1b,R24
.dbline 84
; OCR1A=x; //放入输出比较寄存器
; TCNT1=0x00;
clr R2
out 0x17,R2
.dbline 84
out 0x18,R24
.dbline 86
; TIMSK|=(1<<OCIE1A); //T/C1输出比较匹配中断使能
; while(delay<y)
ldi R24,1
out 0x14,R24
.dbline 86
ldi R24,255
out 0x15,R24
.dbline 88
; ;
; TIMSK&=~(1<<OCIE1A);
ldi R24,240
out 0x11,R24
.dbline 88
ldi R24,255
out 0x12,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_us _delay_us fV
; time -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 93
; }
; else
; {
; TIMSK&=~(1<<OCIE1A);
; while(delay<y)
L3:
.dbline 95
; ;
; }
.dbline 96
; CLI();
subi R16,1
sbci R17,0
.dbline 97
;
L4:
.dbline 98
; }
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L3
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r time 16 I
.dbend
.dbfunc e delay_ms _delay_ms fV
; time -> R20,R21
.even
_delay_ms::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 102
;
; void play_1(void)
; {
; unsigned char i=0;
xjmp L8
L7:
.dbline 104
.dbline 105
ldi R16,1000
ldi R17,3
xcall _delay_us
.dbline 106
subi R20,1
sbci R21,0
.dbline 107
L8:
.dbline 103
; music_init(); //MCU初始化
cpi R20,0
cpc R20,R21
brne L7
X0:
.dbline -2
L6:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e turn_right _turn_right fV
.even
_turn_right::
.dbline -1
.dbline 111
;
; while(music_data[i][1]!=0)//是否终止
; {
; sound(music_data[i][0],music_data[i][1]);
; i++;
; remote_in = PINB & 0xF0; //再检测,若有键按下,中断播放并返回
; if(remote_in!=0)
; return;
.dbline 112
; }
ldi R24,144
out 0x12,R24
.dbline 113
; i=0;
ldi R24,204
out 0x1b,R24
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_left _turn_left fV
.even
_turn_left::
.dbline -1
.dbline 117
;
; }
;
; void play_2(void)
.dbline 118
; {
ldi R24,96
out 0x12,R24
.dbline 119
; unsigned char i=17;
ldi R24,51
out 0x1b,R24
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_right_s _turn_right_s fV
.even
_turn_right_s::
.dbline -1
.dbline 122
; music_init(); //MCU初始化
;
; while(music_data[i][1]!=0)//是否终止
.dbline 123
; {
ldi R24,128
out 0x12,R24
.dbline 124
; sound(music_data[i][0],music_data[i][1]);
ldi R24,207
out 0x1b,R24
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_left_s _turn_left_s fV
.even
_turn_left_s::
.dbline -1
.dbline 128
; i++;
; remote_in = PINB & 0xF0; //再检测,若有键按下,中断播放并返回
; if(remote_in!=0)
; return;
.dbline 129
; }
ldi R24,32
out 0x12,R24
.dbline 130
; i=17;
ldi R24,243
out 0x1b,R24
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e backward _backward fV
.even
_backward::
.dbline -1
.dbline 134
;
; }
; void play_3(void)
; {
.dbline 135
; unsigned char i=33;
ldi R24,80
out 0x12,R24
.dbline 136
; music_init(); //MCU初始化
ldi R24,60
out 0x1b,R24
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e forward _forward fV
.even
_forward::
.dbline -1
.dbline 140
;
; while(music_data[i][1]!=0)//是否终止
; {
; sound(music_data[i][0],music_data[i][1]);
.dbline 141
; i++;
ldi R24,160
out 0x12,R24
.dbline 142
; remote_in = PINB & 0xF0; //再检测,若有键按下,中断播放并返回
ldi R24,195
out 0x1b,R24
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e stop _stop fV
.even
_stop::
.dbline -1
.dbline 146
; if(remote_in!=0)
; return;
; }
; i=33;
.dbline 147
;
ldi R24,255
out 0x12,R24
.dbline 148
; }
out 0x1b,R24
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e sw_touch _sw_touch fV
; sw_in -> R20
; remote_in -> R22
.even
_sw_touch::
xcall push_gset2
.dbline -1
.dbline 165
; void play_4(void)
; {
; unsigned char i=45;
; music_init(); //MCU初始化
;
; while(music_data[i][1]!=0)//是否终止
; {
; sound(music_data[i][0],music_data[i][1]);
; i++;
; remote_in = PINB & 0xF0;
; while(remote_in!=0) //再检测,若有键按下,中断播放并返回
; return;
; }
; i=45;
;
; }
; /*******************************
.dbline 167
; 主程序
; *******************************/
in R20,0x13
andi R20,16
.dbline 168
;
brne L18
.dbline 169
; void main(void)
.dbline 170
; {//遥控车程序
xcall _backward
.dbline 171
;
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 173
; port_init();//调用端口初始化函数
; PORTA = 0xFF;
lds R24,_work_status
cpi R24,112
brne L20
.dbline 174
; mic_startup();//等待声控启动函数
.dbline 175
; PORTA = 0x00;
xcall _stop
xjmp L23
L22:
.dbline 177
.dbline 178
ldi R24,85
out 0x1b,R24
.dbline 179
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 180
ldi R24,170
out 0x1b,R24
.dbline 181
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 182
L23:
.dbline 176
; delay_ms(20);
xjmp L22
X1:
.dbline 183
; while(1)
; {
; remote_in = PINB & 0xF0;
; switch (remote_in)
; {//检测遥控器是否有键按下
; case 0x00:
; {
L20:
.dbline 185
; stop(); //停止运动
; delay_ms(10);
xcall _turn_left
.dbline 186
; break;
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 187
; }
L18:
.dbline 189
; case 0x20:
; { // < A >
in R20,0x16
andi R20,11
.dbline 190
; turn_right(); //右转
cpi R20,9
brne L25
.dbline 191
; play_1(); //播放乐曲1
.dbline 192
; break;
xcall _forward
.dbline 193
; }
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 195
; case 0x40:
; { // < B >
xcall _turn_left
.dbline 196
; backward(); //后退
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 197
; play_2(); //播放乐曲2
L25:
.dbline 198
; break;
cpi R20,10
brne L27
.dbline 199
; }
.dbline 200
; case 0x10:
xcall _backward
.dbline 201
; {// < C >
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 203
; forward(); //前进
; play_3(); //播放乐曲3
xcall _turn_left
.dbline 204
; break;
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 205
; }
L27:
.dbline 206
; case 0x80:
cpi R20,3
brne L29
.dbline 207
; { // < D >
.dbline 208
; turn_left(); //左转
xcall _backward
.dbline 209
; play_4(); //播放乐曲4
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 211
; break;
; }
xcall _turn_left
.dbline 212
; }
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 213
; }
L29:
.dbline 214
; }
cpi R20,2
brne L31
.dbline 215
; }
.dbline 216
; }
xcall _stop
.dbline 217
; }
ldi R16,1000
ldi R17,3
xcall _delay_ms
xjmp L34
L33:
.dbline 219
; }
; }
.dbline 220
; }
in R20,0x13
andi R20,16
.dbline 221
; }
brne L36
.dbline 222
; }
.dbline 222
xjmp L35
L36:
.dbline 223
; }
ldi R24,85
out 0x1b,R24
.dbline 224
; }
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 225
; }
ldi R24,170
out 0x1b,R24
.dbline 226
; }
ldi R16,250
ldi R17,0
xcall _delay_ms
.dbline 227
; }
in R22,0x16
andi R22,240
.dbline 228
; }
cpi R22,16
breq L42
cpi R22,32
breq L42
cpi R22,64
breq L42
cpi R22,128
brne L38
L42:
.dbline 229
; }
.dbline 229
xjmp L35
L38:
.dbline 230
L34:
.dbline 218
xjmp L33
L35:
.dbline 231
L31:
.dbline -2
L17:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r sw_in 20 c
.dbsym r remote_in 22 c
.dbend
.dbfunc e mic_startup _mic_startup fV
; mic_in -> R16
.even
_mic_startup::
.dbline -1
.dbline 235
; }
; }
; }
; }
; }
; }
xjmp L45
L44:
.dbline 238
; }
; }
; }
.dbline 239
; }
in R16,0x16
andi R16,4
.dbline 240
; }
brne L47
.dbline 240
.dbline 240
xjmp L46
L47:
.dbline 241
L45:
.dbline 237
xjmp L44
L46:
.dbline -2
L43:
.dbline 0 ; func end
ret
.dbsym r mic_in 16 c
.dbend
.dbfunc e remote_auto_time _remote_auto_time fV
; remote_in -> R16
.even
_remote_auto_time::
.dbline -1
.dbline 259
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
.dbline 261
; }
; }
in R16,0x16
andi R16,240
.dbline 262
; }
clr R17
cpi R16,32
ldi R30,0
cpc R17,R30
breq L53
ldi R24,32
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L67
L66:
cpi R16,0
cpc R16,R17
brne X4
xjmp L51
X4:
X2:
cpi R16,0
ldi R30,0
cpc R17,R30
brge X5
xjmp L50
X5:
L68:
cpi R16,16
ldi R30,0
cpc R17,R30
brne X6
xjmp L59
X6:
xjmp L50
L67:
cpi R16,64
ldi R30,0
cpc R17,R30
breq L56
cpi R16,64
ldi R30,0
cpc R17,R30
brge X7
xjmp L50
X7:
L69:
cpi R16,128
ldi R30,0
cpc R17,R30
brne X8
xjmp L62
X8:
xjmp L50
X3:
.dbline 263
; }
L53:
.dbline 265
; }
; }
lds R24,_delay_time2
lds R25,_delay_time2+1
sbiw R24,50
sts _delay_time2+1,R25
sts _delay_time2,R24
.dbline 266
; }
cpi R24,50
ldi R30,0
cpc R25,R30
breq X9
xjmp L51
X9:
.dbline 267
; }
.dbline 267
ldi R24,100
ldi R25,0
sts _delay_time2+1,R25
sts _delay_time2,R24
.dbline 267
.dbline 268
; }
xjmp L51
L56:
.dbline 270
; }
; }
lds R24,_delay_time1
lds R25,_delay_time1+1
adiw R24,50
sts _delay_time1+1,R25
sts _delay_time1,R24
.dbline 271
; }
cpi R24,2
ldi R30,8
cpc R25,R30
brne L51
.dbline 272
; }
.dbline 272
ldi R24,2000
ldi R25,7
sts _delay_time1+1,R25
sts _delay_time1,R24
.dbline 272
.dbline 273
; }
xjmp L51
L59:
.dbline 275
; }
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -