⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.lis

📁 这是用atmega16芯片的一个音乐程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -