📄 music.lis
字号:
.module music.c
.area text(rom, con, rel)
0000 .dbfile D:/icc/include/diy0206.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 81
0000 ; /*******************************************
0000 ; 广州双龙电子
0000 ; www.sl.com.cn
0000 ;
0000 ; Chip type : ATMEGA16
0000 ; Clock frequency : 8MHz
0000 ;
0000 ; /**************************************************************
0000 ; 声控启动,分别按下A,B,C,D键,小车
0000 ; 作前进,后退,左右转弯动作并演奏不同乐曲
0000 ; 演奏过程中若有键按下,则即时切换到相应状态
0000 ; ********************************************/
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include <diy0206.c>
0000 ; #pragma interrupt_handler timer0:10
0000 ; #pragma interrupt_handler timer1:7
0000 ; unsigned char remote_in;
0000 ; const unsigned int music_data[][2]=
0000 ; /*******************************************
0000 ; 卡秋莎音乐数据{x,y}
0000 ; x:对应音符音阶(频率),0表示休止符
0000 ; y:对应音符节拍
0000 ; ********************************************/
0000 ; {
0000 ; {440,600},{494,200},{523,600} ,{440,200},
0000 ; {523,400},{494,200},{440,200} ,{494,400},
0000 ; {330,400},{494,600},{523,200} ,{578,600},
0000 ; {494,200},{578,400},{523,200} ,{0,0},
0000 ; {494,200},{440,800},{659,400} ,{880,400},
0000 ; {784,400},{880,200},{784,200} ,{698,400},
0000 ; {659,200},{578,200},{659,400} ,{440,400},
0000 ; {698,400},{578,200},{659,600} ,{0,0},
0000 ; {523,200},{494,200},{330,200} ,{523,200},
0000 ; {494,200},{440,800},{659,400} ,{880,400},
0000 ; {784,400},{880,200},{784,200} ,{0,0},
0000 ; {698,400},{659,200},{578,200} ,{659,400} ,
0000 ; {440,400},{698,400},{578,200} , {659,600},
0000 ; {523,200},{494,200},{330,200} , {523,200},
0000 ; {494,200},{440,800},{0,0}};
0000 ; #pragma data:data
0000 ; unsigned int delay=0;
0000 ; /*******************************
0000 ; MCU初始化
0000 ; *******************************/
0000 ; void music_init(void)
0000 ; {
0000 ; MCUCR=0x00;//低电平时产生中断
0000 ; DDRC=0x01;
0000 ; TCCR1A=0x00;
0000 ; TCCR1B=0x09;//TIMER1无预分频
0000 ; TCCR0=0x03;//CK/64
0000 ; TCNT0=0x19;
0000 ; TIMSK=(1<<OCIE1A)|(1<<TOIE0);
0000 ; }
0000 ; /**************************************************
0000 ; T0中断程序,产生音乐节拍
0000 ; **************************************************/
0000 ; void timer0(void)
0000 ; {
0000 ; delay++;
0000 ; TCNT0=0x19;
0000 ; }
0000 ; /**************************************************
0000 ; T1中断程序,根据SOUND函数输出一定频率的方波
0000 ; **************************************************/
0000 ; void timer1(void)
0000 ; {
0000 ; PORTC^=0x01;
0000 ; }
0000 ; /*****************************************************
0000 ; SOUND程序,输出频率为 x HZ的方波,延时 y MS
0000 ; x:100~20000 HZ, 0表示不发声
0000 ; y:0~65536 MS
0000 ; *****************************************************/
0000 ; void sound(unsigned int x,unsigned int y)
0000 ; {
0000 ; SEI(); //开总中断
0000 ; delay=0;
0000 ; if (x!=0)//不是休止符
0000 ; {
0000 .dbline 82
0000 ; x=4000000/x; //计算发声频率
0000 8FEF ldi R24,255
0002 8ABB out 0x1a,R24
0004 .dbline 82
0004 8BBB out 0x1b,R24
0006 .dbline 84
0006 ; OCR1A=x; //放入输出比较寄存器
0006 ; TCNT1=0x00;
0006 2224 clr R2
0008 27BA out 0x17,R2
000A .dbline 84
000A 88BB out 0x18,R24
000C .dbline 86
000C ; TIMSK|=(1<<OCIE1A); //T/C1输出比较匹配中断使能
000C ; while(delay<y)
000C 81E0 ldi R24,1
000E 84BB out 0x14,R24
0010 .dbline 86
0010 8FEF ldi R24,255
0012 85BB out 0x15,R24
0014 .dbline 88
0014 ; ;
0014 ; TIMSK&=~(1<<OCIE1A);
0014 80EF ldi R24,240
0016 81BB out 0x11,R24
0018 .dbline 88
0018 8FEF ldi R24,255
001A 82BB out 0x12,R24
001C .dbline -2
001C L1:
001C .dbline 0 ; func end
001C 0895 ret
001E .dbend
001E .dbfunc e delay_us _delay_us fV
001E ; time -> R16,R17
.even
001E _delay_us::
001E .dbline -1
001E .dbline 93
001E ; }
001E ; else
001E ; {
001E ; TIMSK&=~(1<<OCIE1A);
001E ; while(delay<y)
001E L3:
001E .dbline 95
001E ; ;
001E ; }
001E .dbline 96
001E ; CLI();
001E 0150 subi R16,1
0020 1040 sbci R17,0
0022 .dbline 97
0022 ;
0022 L4:
0022 .dbline 98
0022 ; }
0022 81E0 ldi R24,1
0024 90E0 ldi R25,0
0026 8017 cp R24,R16
0028 9107 cpc R25,R17
002A CCF3 brlt L3
002C .dbline -2
002C L2:
002C .dbline 0 ; func end
002C 0895 ret
002E .dbsym r time 16 I
002E .dbend
002E .dbfunc e delay_ms _delay_ms fV
002E ; time -> R20,R21
.even
002E _delay_ms::
002E 0E940000 xcall push_gset1
0032 A801 movw R20,R16
0034 .dbline -1
0034 .dbline 102
0034 ;
0034 ; void play_1(void)
0034 ; {
0034 ; unsigned char i=0;
0034 05C0 xjmp L8
0036 L7:
0036 .dbline 104
0036 .dbline 105
0036 08EE ldi R16,1000
0038 13E0 ldi R17,3
003A F1DF xcall _delay_us
003C .dbline 106
003C 4150 subi R20,1
003E 5040 sbci R21,0
0040 .dbline 107
0040 L8:
0040 .dbline 103
0040 ; music_init(); //MCU初始化
0040 4030 cpi R20,0
0042 4507 cpc R20,R21
0044 C1F7 brne L7
0046 X0:
0046 .dbline -2
0046 L6:
0046 0E940000 xcall pop_gset1
004A .dbline 0 ; func end
004A 0895 ret
004C .dbsym r time 20 i
004C .dbend
004C .dbfunc e turn_right _turn_right fV
.even
004C _turn_right::
004C .dbline -1
004C .dbline 111
004C ;
004C ; while(music_data[i][1]!=0)//是否终止
004C ; {
004C ; sound(music_data[i][0],music_data[i][1]);
004C ; i++;
004C ; remote_in = PINB & 0xF0; //再检测,若有键按下,中断播放并返回
004C ; if(remote_in!=0)
004C ; return;
004C .dbline 112
004C ; }
004C 80E9 ldi R24,144
004E 82BB out 0x12,R24
0050 .dbline 113
0050 ; i=0;
0050 8CEC ldi R24,204
0052 8BBB out 0x1b,R24
0054 .dbline -2
0054 L10:
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbend
0056 .dbfunc e turn_left _turn_left fV
.even
0056 _turn_left::
0056 .dbline -1
0056 .dbline 117
0056 ;
0056 ; }
0056 ;
0056 ; void play_2(void)
0056 .dbline 118
0056 ; {
0056 80E6 ldi R24,96
0058 82BB out 0x12,R24
005A .dbline 119
005A ; unsigned char i=17;
005A 83E3 ldi R24,51
005C 8BBB out 0x1b,R24
005E .dbline -2
005E L11:
005E .dbline 0 ; func end
005E 0895 ret
0060 .dbend
0060 .dbfunc e turn_right_s _turn_right_s fV
.even
0060 _turn_right_s::
0060 .dbline -1
0060 .dbline 122
0060 ; music_init(); //MCU初始化
0060 ;
0060 ; while(music_data[i][1]!=0)//是否终止
0060 .dbline 123
0060 ; {
0060 80E8 ldi R24,128
0062 82BB out 0x12,R24
0064 .dbline 124
0064 ; sound(music_data[i][0],music_data[i][1]);
0064 8FEC ldi R24,207
0066 8BBB out 0x1b,R24
0068 .dbline -2
0068 L12:
0068 .dbline 0 ; func end
0068 0895 ret
006A .dbend
006A .dbfunc e turn_left_s _turn_left_s fV
.even
006A _turn_left_s::
006A .dbline -1
006A .dbline 128
006A ; i++;
006A ; remote_in = PINB & 0xF0; //再检测,若有键按下,中断播放并返回
006A ; if(remote_in!=0)
006A ; return;
006A .dbline 129
006A ; }
006A 80E2 ldi R24,32
006C 82BB out 0x12,R24
006E .dbline 130
006E ; i=17;
006E 83EF ldi R24,243
0070 8BBB out 0x1b,R24
0072 .dbline -2
0072 L13:
0072 .dbline 0 ; func end
0072 0895 ret
0074 .dbend
0074 .dbfunc e backward _backward fV
.even
0074 _backward::
0074 .dbline -1
0074 .dbline 134
0074 ;
0074 ; }
0074 ; void play_3(void)
0074 ; {
0074 .dbline 135
0074 ; unsigned char i=33;
0074 80E5 ldi R24,80
0076 82BB out 0x12,R24
0078 .dbline 136
0078 ; music_init(); //MCU初始化
0078 8CE3 ldi R24,60
007A 8BBB out 0x1b,R24
007C .dbline -2
007C L14:
007C .dbline 0 ; func end
007C 0895 ret
007E .dbend
007E .dbfunc e forward _forward fV
.even
007E _forward::
007E .dbline -1
007E .dbline 140
007E ;
007E ; while(music_data[i][1]!=0)//是否终止
007E ; {
007E ; sound(music_data[i][0],music_data[i][1]);
007E .dbline 141
007E ; i++;
007E 80EA ldi R24,160
0080 82BB out 0x12,R24
0082 .dbline 142
0082 ; remote_in = PINB & 0xF0; //再检测,若有键按下,中断播放并返回
0082 83EC ldi R24,195
0084 8BBB out 0x1b,R24
0086 .dbline -2
0086 L15:
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbend
0088 .dbfunc e stop _stop fV
.even
0088 _stop::
0088 .dbline -1
0088 .dbline 146
0088 ; if(remote_in!=0)
0088 ; return;
0088 ; }
0088 ; i=33;
0088 .dbline 147
0088 ;
0088 8FEF ldi R24,255
008A 82BB out 0x12,R24
008C .dbline 148
008C ; }
008C 8BBB out 0x1b,R24
008E .dbline -2
008E L16:
008E .dbline 0 ; func end
008E 0895 ret
0090 .dbend
0090 .dbfunc e sw_touch _sw_touch fV
0090 ; sw_in -> R20
0090 ; remote_in -> R22
.even
0090 _sw_touch::
0090 0E940000 xcall push_gset2
0094 .dbline -1
0094 .dbline 165
0094 ; void play_4(void)
0094 ; {
0094 ; unsigned char i=45;
0094 ; music_init(); //MCU初始化
0094 ;
0094 ; while(music_data[i][1]!=0)//是否终止
0094 ; {
0094 ; sound(music_data[i][0],music_data[i][1]);
0094 ; i++;
0094 ; remote_in = PINB & 0xF0;
0094 ; while(remote_in!=0) //再检测,若有键按下,中断播放并返回
0094 ; return;
0094 ; }
0094 ; i=45;
0094 ;
0094 ; }
0094 ; /*******************************
0094 .dbline 167
0094 ; 主程序
0094 ; *******************************/
0094 43B3 in R20,0x13
0096 4071 andi R20,16
0098 .dbline 168
0098 ;
0098 C9F4 brne L18
009A .dbline 169
009A ; void main(void)
009A .dbline 170
009A ; {//遥控车程序
009A ECDF xcall _backward
009C .dbline 171
009C ;
009C 0AEF ldi R16,250
009E 10E0 ldi R17,0
00A0 C6DF xcall _delay_ms
00A2 .dbline 173
00A2 ; port_init();//调用端口初始化函数
00A2 ; PORTA = 0xFF;
00A2 80910500 lds R24,_work_status
00A6 8037 cpi R24,112
00A8 69F4 brne L20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -