📄 music.lst
字号:
__start:
__text_start:
0084 E5CF LDI R28,0x5F
0085 E0D2 LDI R29,2
0086 BFCD OUT P3D,R28
0087 BFDE OUT P3E,R29
0088 51C0 SUBI R28,0x10
0089 40D0 SBCI R29,0
008A EA0A LDI R16,0xAA
008B 8308 STD R16,0+Y
008C 2400 CLR R0
008D E6E2 LDI R30,0x62
008E E0F0 LDI R31,0
008F E010 LDI R17,0
0090 36E2 CPI R30,0x62
0091 07F1 CPC R31,R17
0092 F011 BEQ 0x0095
0093 9201 ST R0,Z+
0094 CFFB RJMP 0x0090
0095 8300 STD R16,0+Z
0096 E0E6 LDI R30,6
0097 E0F1 LDI R31,1
0098 E6A0 LDI R26,0x60
0099 E0B0 LDI R27,0
009A E011 LDI R17,1
009B 30E8 CPI R30,0x8
009C 07F1 CPC R31,R17
009D F021 BEQ 0x00A2
009E 95C8 LPM
009F 9631 ADIW R30,1
00A0 920D ST R0,X+
00A1 CFF9 RJMP 0x009B
00A2 D073 RCALL _main
_exit:
00A3 CFFF RJMP _exit
FILE: sound.c
(0000) /**********************************************
(0001) http://www.sl.com.cn
(0002) 双龙电子公司----电脑音乐演示程序(ICCAVR)
(0003) 作者:詹卫前
(0004) 1、学习定时器T0溢出中断的使用
(0005) 2、学习定时器T1比较中断的使用
(0006) 3、学习电脑音乐的产生
(0007) **********************************************/
(0008) #include <io8515.h>
(0009) #include <macros.h>
(0010) #pragma interrupt_handler timer0:8
(0011) #pragma interrupt_handler timer1:5
(0012) //#pragma data:code
(0013) flash unsigned int music_data[][2]=
(0014) /*******************************************
(0015) 卡秋莎音乐数据{x,y}
(0016) x:对应音符音阶(频率),0表示休止符
(0017) y:对应音符节拍
(0018) ********************************************/
(0019) {
(0020) {440,600} ,{494,200} ,{523,600} ,{440,200},
(0021) {523,400} ,{494,200} ,{440,200} ,{494,400},
(0022) {330,400} ,{494,600} ,{523,200} ,{578,600},
(0023) {494,200} ,{578,400} ,{523,200} ,{494,200},
(0024) {440,800} ,{659,400} ,{880,400} ,{784,400},
(0025) {880,200} ,{784,200} ,{698,400} ,{659,200},
(0026) {578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
(0027) {698,400} ,{578,200} ,{659,600} ,{523,200},
(0028) {494,200} ,{330,200} ,{523,200} ,{494,200},
(0029) {440,800} ,{659,400} ,{880,400} ,{784,400},
(0030) {880,200} ,{784,200} ,{698,400} ,{659,200},
(0031) {578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
(0032) {698,400} ,{578,200}, {659,600} ,{523,200},
(0033) {494,200} ,{330,200}, {523,200} ,{494,200},
(0034) {440,800} ,
(0035) {0,0}};
(0036) #pragma data:data
(0037) unsigned int delay=0;
(0038) /*******************************
(0039) MCU初始化
(0040) *******************************/
(0041) void music_init(void)
(0042) {
(0043) MCUCR=0x00;
_music_init:
00A4 2422 CLR R2
00A5 BE25 OUT P35,R2
(0044) DDRC=0x01;
00A6 E081 LDI R24,1
00A7 BB84 OUT P14,R24
(0045) TCCR1A=0x00;
00A8 BC2F OUT P2F,R2
(0046) TCCR1B=0x09;
00A9 E089 LDI R24,0x9
00AA BD8E OUT P2E,R24
(0047) TCCR0=0x03;
00AB E083 LDI R24,3
00AC BF83 OUT P33,R24
(0048) TCNT0=0x19;
00AD E189 LDI R24,0x19
00AE BF82 OUT P32,R24
(0049) TIMSK=0x42;
00AF E482 LDI R24,0x42
00B0 BF89 OUT P39,R24
(0050) }
00B1 9508 RET
_timer0:
00B2 938A ST R24,-Y
00B3 939A ST R25,-Y
00B4 B78F IN R24,P3F
00B5 938A ST R24,-Y
(0051) /**************************************************
(0052) T0中断程序,产生音乐节拍
(0053) **************************************************/
(0054) void timer0(void)
(0055) {
(0056) delay++;
00B6 91900061 LDS R25,0x61
00B8 91800060 LDS R24,0x60
00BA 9601 ADIW R24,1
00BB 93900061 STS R25,0x61
00BD 93800060 STS R24,0x60
(0057) TCNT0=0x19;
00BF E189 LDI R24,0x19
00C0 BF82 OUT P32,R24
(0058) }
00C1 9189 LD R24,Y+
00C2 BF8F OUT P3F,R24
00C3 9199 LD R25,Y+
00C4 9189 LD R24,Y+
00C5 9518 RETI
_timer1:
00C6 922A ST R2,-Y
00C7 938A ST R24,-Y
00C8 B62F IN R2,P3F
00C9 922A ST R2,-Y
(0059) /**************************************************
(0060) T1中断程序,根据SOUND函数输出一定频率的方波
(0061) **************************************************/
(0062) void timer1(void)
(0063) {
(0064) PORTC^=0x01;
00CA E081 LDI R24,1
00CB B225 IN R2,P15
00CC 2628 EOR R2,R24
00CD BA25 OUT P15,R2
(0065) }
00CE 9029 LD R2,Y+
00CF BE2F OUT P3F,R2
00D0 9189 LD R24,Y+
00D1 9029 LD R2,Y+
00D2 9518 RETI
_sound:
y --> R10
x --> R12
00D3 D08D RCALL push_gset4
00D4 2EA2 MOV R10,R18
00D5 2EB3 MOV R11,R19
00D6 2EC0 MOV R12,R16
00D7 2ED1 MOV R13,R17
(0066) /*****************************************************
(0067) SOUND程序,输出频率为 x HZ的方波,延时 y MS
(0068) x:100~20000 HZ, 0表示不发声
(0069) y:0~65536 MS
(0070) *****************************************************/
(0071) void sound(unsigned int x,unsigned int y)
(0072) {
(0073) SEI();
00D8 9478 BSET 7
(0074) delay=0;
00D9 2422 CLR R2
00DA 2433 CLR R3
00DB 92300061 STS R3,0x61
00DD 92200060 STS R2,0x60
(0075) if (x!=0)
00DF 20CC TST R12
00E0 F411 BNE 0x00E3
00E1 20DD TST R13
00E2 F131 BEQ 0x0109
(0076) {
(0077) x=4000000/x;
00E3 2C2C MOV R2,R12
00E4 2C3D MOV R3,R13
00E5 2444 CLR R4
00E6 2455 CLR R5
00E7 E002 LDI R16,2
00E8 E011 LDI R17,1
00E9 D07C RCALL lpm32
00EA 925A ST R5,-Y
00EB 924A ST R4,-Y
00EC 923A ST R3,-Y
00ED 922A ST R2,-Y
00EE D0DE RCALL div32s
00EF 2EC0 MOV R12,R16
00F0 2ED1 MOV R13,R17
(0078) OCR1A=x;
00F1 92D0004B STS R13,0x4B
00F3 92C0004A STS R12,0x4A
(0079) TCNT1=0x00;
00F5 2422 CLR R2
00F6 2433 CLR R3
00F7 9230004D STS R3,0x4D
00F9 9220004C STS R2,0x4C
(0080) TIMSK|=0x40;
00FB B789 IN R24,P39
00FC 6480 ORI R24,0x40
00FD BF89 OUT P39,R24
(0081) while(delay<y)
(0082) ;
00FE 90300061 LDS R3,0x61
0100 90200060 LDS R2,0x60
0102 142A CP R2,R10
0103 043B CPC R3,R11
0104 F3C8 BCS 0x00FE
(0083) TIMSK&=0xbf;
0105 B789 IN R24,P39
0106 7B8F ANDI R24,0xBF
0107 BF89 OUT P39,R24
(0084) }
0108 C00A RJMP 0x0113
(0085) else
(0086) {
(0087) TIMSK&=0xbf;
0109 B789 IN R24,P39
010A 7B8F ANDI R24,0xBF
010B BF89 OUT P39,R24
(0088) while(delay<y)
(0089) ;
010C 90300061 LDS R3,0x61
010E 90200060 LDS R2,0x60
0110 142A CP R2,R10
0111 043B CPC R3,R11
0112 F3C8 BCS 0x010C
(0090) }
(0091) CLI();
0113 94F8 BCLR 7
(0092)
(0093) }
0114 D04F RCALL pop_gset4
0115 9508 RET
(0094) /*******************************
(0095) 主程序
(0096) *******************************/
(0097) void main(void)
(0098) {
(0099) unsigned char i=0;
_main:
i --> R20
0116 2744 CLR R20
(0100) music_init();
0117 DF8C RCALL _music_init
0118 C029 RJMP 0x0142
(0101) while(1)
(0102) {
(0103) while(music_data[i][1]!=0)
(0104) {
(0105) sound(music_data[i][0],music_data[i][1]);
0119 E022 LDI R18,2
011A E030 LDI R19,0
011B 2F04 MOV R16,R20
011C 2711 CLR R17
011D D06A RCALL lsl16
011E 2E20 MOV R2,R16
011F 2E31 MOV R3,R17
0120 E18C LDI R24,0x1C
0121 E090 LDI R25,0
0122 0F08 ADD R16,R24
0123 1F19 ADC R17,R25
0124 D055 RCALL lpm16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -