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