📄 music.lis
字号:
0020 .dbfunc e port_init _port_init fV
.even
0020 _port_init::
0020 .dbline -1
0020 .dbline 61
0020 ;
0020 ; /************************************
0020 ; * 端口初始化函数 *
0020 ; ************************************/
0020 ; void port_init(void)
0020 ; {
0020 .dbline 62
0020 ; DDRG=0xff; //D口配置为输出,驱动蜂鸣器
0020 8FEF ldi R24,255
0022 80936400 sts 100,R24
0026 .dbline 63
0026 ; DDRA=0xff; //B口配置为输出,驱动LED
0026 8ABB out 0x1a,R24
0028 .dbline 64
0028 ; PORTA=0xff; //LED初值为灭
0028 8BBB out 0x1b,R24
002A .dbline -2
002A .dbline 65
002A ; }
002A L10:
002A .dbline 0 ; func end
002A 0895 ret
002C .dbend
002C .dbfunc e sound _sound fV
002C ; x -> R10,R11
002C ; i -> R10
.even
002C _sound::
002C 0E940000 xcall push_gset3
0030 A02E mov R10,R16
0032 .dbline -1
0032 .dbline 74
0032 ;
0032 ; /***********************************
0032 ; * 音乐产生函数 *
0032 ; * 功能:输出频率为x的方波,延时y MS*
0032 ; * 范围:x:100-20000Hz,0:不发声 *
0032 ; * y:0-65536 MS *
0032 ; ***********************************/
0032 ; void sound(uchar i)
0032 ; {
0032 .dbline 76
0032 ; uint x;
0032 ; x=music_data[i][0]; //取音乐的频率数据
0032 84E0 ldi R24,4
0034 8A9D mul R24,R10
0036 F001 movw R30,R0
0038 80E0 ldi R24,<_music_data
003A 90E0 ldi R25,>_music_data
003C E80F add R30,R24
003E F91F adc R31,R25
0040 A590 lpm R10,Z+
0042 B490 lpm R11,Z
0044 .dbline 77
0044 ; if(x!=0)
0044 AA20 tst R10
0046 11F4 brne X1
0048 BB20 tst R11
004A A9F0 breq L12
004C X1:
004C .dbline 78
004C ; {
004C .dbline 79
004C ; x=500000/x; //1M时钟数据计算
004C 1501 movw R2,R10
004E 4424 clr R4
0050 5524 clr R5
0052 40E2 ldi R20,32
0054 51EA ldi R21,161
0056 67E0 ldi R22,7
0058 70E0 ldi R23,0
005A 5A92 st -y,R5
005C 4A92 st -y,R4
005E 3A92 st -y,R3
0060 2A92 st -y,R2
0062 8A01 movw R16,R20
0064 9B01 movw R18,R22
0066 0E940000 xcall div32s
006A 5801 movw R10,R16
006C .dbline 80
006C ; OCR1A=x; //比较值赋值
006C 1BBD out 0x2b,R17
006E 0ABD out 0x2a,R16
0070 .dbline 81
0070 ; TCCR1A = 0x40; //允许比较反转输出
0070 80E4 ldi R24,64
0072 8FBD out 0x2f,R24
0074 .dbline 82
0074 ; }
0074 02C0 xjmp L13
0076 L12:
0076 .dbline 84
0076 .dbline 85
0076 2224 clr R2
0078 2FBC out 0x2f,R2
007A .dbline 86
007A L13:
007A .dbline -2
007A .dbline 87
007A ; else
007A ; {
007A ; TCCR1A = 0x00; //频率为0,休止符,不发声
007A ; }
007A ; }
007A L11:
007A 0E940000 xcall pop_gset3
007E .dbline 0 ; func end
007E 0895 ret
0080 .dbsym r x 10 i
0080 .dbsym r i 10 c
0080 .dbend
0080 .dbfunc e main _main fV
0080 ; i -> R20
.even
0080 _main::
0080 .dbline -1
0080 .dbline 92
0080 ; /*******************************
0080 ; * 主函数 *
0080 ; *******************************/
0080 ; void main(void)
0080 ; {
0080 .dbline 93
0080 ; uchar i=0;
0080 4427 clr R20
0082 .dbline 94
0082 ; port_init(); //端口初始化
0082 CEDF xcall _port_init
0084 .dbline 95
0084 ; TCCR1A = 0x40; //将T/C1配置为比较匹配,OC1A取反
0084 80E4 ldi R24,64
0086 8FBD out 0x2f,R24
0088 .dbline 96
0088 ; TCCR1B = 0x09;
0088 89E0 ldi R24,9
008A 8EBD out 0x2e,R24
008C 29C0 xjmp L16
008E X2:
008E .dbline 98
008E ; while(1)
008E ; {
008E L18:
008E .dbline 100
008E .dbline 101
008E 042F mov R16,R20
0090 CDDF xcall _sound
0092 .dbline 102
0092 84E0 ldi R24,4
0094 849F mul R24,R20
0096 F001 movw R30,R0
0098 80E0 ldi R24,<_music_data+2
009A 90E0 ldi R25,>_music_data+2
009C E80F add R30,R24
009E F91F adc R31,R25
00A0 0591 lpm R16,Z+
00A2 1491 lpm R17,Z
00A4 ADDF xcall _delay_ms
00A6 .dbline 103
00A6 2224 clr R2
00A8 2FBC out 0x2f,R2
00AA .dbline 104
00AA 80E2 ldi R24,32
00AC 2BB2 in R2,0x1b
00AE 2826 eor R2,R24
00B0 2BBA out 0x1b,R2
00B2 .dbline 105
00B2 80916500 lds R24,101
00B6 8062 ori R24,32
00B8 80936500 sts 101,R24
00BC .dbline 106
00BC 4395 inc R20
00BE .dbline 107
00BE L19:
00BE .dbline 99
00BE 84E0 ldi R24,4
00C0 849F mul R24,R20
00C2 F001 movw R30,R0
00C4 80E0 ldi R24,<_music_data+2
00C6 90E0 ldi R25,>_music_data+2
00C8 E80F add R30,R24
00CA F91F adc R31,R25
00CC 0590 lpm R0,Z+
00CE 1490 lpm R1,Z
00D0 F001 movw R30,R0
00D2 E030 cpi R30,0
00D4 EF07 cpc R30,R31
00D6 D9F6 brne L18
00D8 X3:
00D8 .dbline 108
00D8 00E8 ldi R16,16000
00DA 1EE3 ldi R17,62
00DC 91DF xcall _delay_ms
00DE .dbline 109
00DE 4427 clr R20
00E0 .dbline 110
00E0 L16:
00E0 .dbline 97
00E0 EECF xjmp L19
00E2 X4:
00E2 .dbline -2
00E2 .dbline 111
00E2 ; while(music_data[i][1]!=0) //等待最后一个音符到来
00E2 ; {
00E2 ; sound(i); //输出音符
00E2 ; delay_ms(music_data[i][1]);//节拍延时
00E2 ; TCCR1A = 0x00; //奏完一个音符停止
00E2 ; PORTA^=1<<5; //音符节拍由LD5闪亮显示
00E2 ; PORTG|=1<<5;
00E2 ; i++; //准备一下个音符
00E2 ; }
00E2 ; delay_ms(16000);
00E2 ; i=0; //一遍结束,停1秒,从头开始
00E2 ; }
00E2 ; }
00E2 L14:
00E2 .dbline 0 ; func end
00E2 0895 ret
00E4 .dbsym r i 20 c
00E4 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -