📄 music.lst
字号:
__start:
__text_start:
0022 E5CF LDI R28,0x5F
0023 E0D4 LDI R29,4
0024 BFCD OUT 0x3D,R28
0025 BFDE OUT 0x3E,R29
0026 51C0 SUBI R28,0x10
0027 40D0 SBCI R29,0
0028 EA0A LDI R16,0xAA
0029 8308 STD Y+0,R16
002A 2400 CLR R0
002B E6E0 LDI R30,0x60
002C E0F0 LDI R31,0
002D E010 LDI R17,0
002E 36E4 CPI R30,0x64
002F 07F1 CPC R31,R17
0030 F011 BEQ 0x0033
0031 9201 ST R0,Z+
0032 CFFB RJMP 0x002E
0033 8300 STD Z+0,R16
0034 E4E4 LDI R30,0x44
0035 E0F0 LDI R31,0
0036 E6A0 LDI R26,0x60
0037 E0B0 LDI R27,0
0038 E010 LDI R17,0
0039 34E4 CPI R30,0x44
003A 07F1 CPC R31,R17
003B F021 BEQ 0x0040
003C 95C8 LPM
003D 9631 ADIW R30,1
003E 920D ST R0,X+
003F CFF9 RJMP 0x0039
0040 D071 RCALL _main
_exit:
0041 CFFF RJMP _exit
FILE: E:\icc\iccavr\mega8\mega8\music\music.c
(0001) /*******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* 电子音乐演示程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月10日 */
(0007) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0008) /*******************************************/
(0009) //使用说明:音乐输出端口:PORTC.0,音乐数据存放
(0010) //于ATMEGA8的EEPROM存贮器中,可以使用music.exe
(0011) //程序通过RS232通信口进行修改。
(0012) #include <iom8v.h>
(0013) #include <macros.h>
(0014) #include <eeprom.h>
(0015) #include "music.h"
(0016) extern void uart_init(void);
(0017) //extern void isp(void);
(0018) /* 音乐数据(卡秒莎) */
(0019) /* 四分之一拍为0x10, 二分之一拍为0x20, 一拍为0x40*/
(0020) /* 低1-1 2-2 3-3 4-4 5-5 6-6 7-7 */
(0021) /* 中1-8 2-9 3-A 4-B 5-C 6-D 7-E */
(0022) /* 高1-F*/
(0023) #pragma data:eeprom
(0024) unsigned char sound[]={0x66,0x27,0x68,0x26,0x28,0x28,0x27,0x26,0x47,0x43,
(0025) 0x67,0x28,0x69,0x27,0x29,0x29,0x28,0x27,0x46,0x46,
(0026) 0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,0x29,0x4a,
(0027) 0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23,0x28,0x27,
(0028) 0x46,0x46,0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,
(0029) 0x29,0x4a,0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23,
(0030) 0x28,0x27,0x46,0x46,0x00};
(0031) #pragma data:data
(0032) /* 音阶表 */
(0033) const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,TI,DO_H,
(0034) RE_H,MI_H,FA_H,SO_H,LA_H,TI_H,DO_HH};
(0035) /* 音阶重装常数 */
(0036) unsigned int toneconst;
(0037) /* 微秒级延时程序 */
(0038) void delay_us(int time)
(0039) {
(0040) do
(0041) {
(0042) time--;
_delay_us:
time --> R16
0042 5001 SUBI R16,1
0043 4010 SBCI R17,0
(0043) }
(0044) while (time>1);
0044 E081 LDI R24,1
0045 E090 LDI R25,0
0046 1780 CP R24,R16
0047 0791 CPC R25,R17
0048 F3CC BLT 0x0042
(0045) }
0049 9508 RET
_delay_ms:
time --> R20
004A D189 RCALL push_gset1
004B 01A8 MOVW R20,R16
(0046) /* 毫秒级延时程序 */
(0047) void delay_ms(unsigned int time)
(0048) {
004C C005 RJMP 0x0052
(0049) while(time!=0)
(0050) {
(0051) delay_us(1000);
004D EE08 LDI R16,0xE8
004E E013 LDI R17,3
004F DFF2 RCALL _delay_us
(0052) time--;
0050 5041 SUBI R20,1
0051 4050 SBCI R21,0
0052 3040 CPI R20,0
0053 0745 CPC R20,R21
0054 F7C1 BNE 0x004D
(0053) }
(0054) }
0055 D181 RCALL pop_gset1
0056 9508 RET
_timer1_ovf_isr:
0057 922A ST R2,-Y
0058 923A ST R3,-Y
0059 938A ST R24,-Y
005A B62F IN R2,0x3F
005B 922A ST R2,-Y
(0055) #pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
(0056) void timer1_ovf_isr(void)
(0057) {
(0058) TCNT1=toneconst;
005C 90200060 LDS R2,_toneconst
005E 90300061 LDS R3,_toneconst+1
0060 BC3D OUT 0x2D,R3
0061 BC2C OUT 0x2C,R2
(0059) PORTC^=1;
0062 E081 LDI R24,1
0063 B225 IN R2,0x15
0064 2628 EOR R2,R24
0065 BA25 OUT 0x15,R2
(0060) }
0066 9029 LD R2,Y+
0067 BE2F OUT 0x3F,R2
0068 9189 LD R24,Y+
0069 9039 LD R3,Y+
006A 9029 LD R2,Y+
006B 9518 RETI
_music:
sound_add --> R20
temp1 --> R22
temp --> R10
006C D181 RCALL push_gset3
(0061) void music(void)
(0062) {
(0063) unsigned char temp,temp1;
(0064) unsigned int sound_add=0;
006D 2744 CLR R20
006E 2755 CLR R21
(0065) TCCR1A = 0x00;
006F 2422 CLR R2
0070 BC2F OUT 0x2F,R2
(0066) TCCR1B =(1<<CS11);//8分频
0071 E082 LDI R24,2
0072 BD8E OUT 0x2E,R24
(0067) temp1=EEPROMread((int)&sound[sound_add]);
0073 E081 LDI R24,1
0074 E090 LDI R25,0
0075 018A MOVW R16,R20
0076 0F08 ADD R16,R24
0077 1F19 ADC R17,R25
0078 D1A6 RCALL _EEPROMread
0079 2F60 MOV R22,R16
007A C030 RJMP 0x00AB
(0068) while(temp1!=0)
(0069) {
(0070) temp=temp1;
007B 2EA6 MOV R10,R22
(0071) temp&=0x0f;
007C 2D8A MOV R24,R10
007D 708F ANDI R24,0xF
007E 2EA8 MOV R10,R24
(0072) if(temp!=0)
007F 2388 TST R24
0080 F0A1 BEQ 0x0095
(0073) {
(0074) TIMSK|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
0081 B789 IN R24,0x39
0082 6084 ORI R24,4
0083 BF89 OUT 0x39,R24
(0075) temp--;
0084 94AA DEC R10
(0076) toneconst=TONETABLE[temp];
0085 E082 LDI R24,2
0086 9D8A MUL R24,R10
0087 01F0 MOVW R30,R0
0088 E286 LDI R24,0x26
0089 E090 LDI R25,0
008A 0FE8 ADD R30,R24
008B 1FF9 ADC R31,R25
008C 9005 LPM R0,Z+
008D 9014 LPM R1,0(Z)
008E 01F0 MOVW R30,R0
008F 93F00061 STS _toneconst+1,R31
0091 93E00060 STS _toneconst,R30
(0077) TCNT1=toneconst;
0093 BDFD OUT 0x2D,R31
0094 BDEC OUT 0x2C,R30
(0078) }
(0079) temp=temp1;
0095 2EA6 MOV R10,R22
(0080) temp>>=4;
0096 2D8A MOV R24,R10
0097 9582 SWAP R24
0098 708F ANDI R24,0xF
(0081) temp&=0x0f;
0099 708F ANDI R24,0xF
009A 2EA8 MOV R10,R24
(0082) delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
009B E881 LDI R24,0x81
009C 9D8A MUL R24,R10
009D 0180 MOVW R16,R0
009E DFAB RCALL _delay_ms
(0083) TIMSK&=~(1<<TOIE1);
009F B789 IN R24,0x39
00A0 7F8B ANDI R24,0xFB
00A1 BF89 OUT 0x39,R24
(0084) sound_add++;
00A2 5F4F SUBI R20,0xFF
00A3 4F5F SBCI R21,0xFF
(0085) temp1=EEPROMread((int)&sound[sound_add]);
00A4 E081 LDI R24,1
00A5 E090 LDI R25,0
00A6 018A MOVW R16,R20
00A7 0F08 ADD R16,R24
00A8 1F19 ADC R17,R25
00A9 D175 RCALL _EEPROMread
00AA 2F60 MOV R22,R16
00AB 2366 TST R22
00AC F671 BNE 0x007B
(0086) }
(0087) delay_ms(1000);
00AD EE08 LDI R16,0xE8
00AE E013 LDI R17,3
00AF DF9A RCALL _delay_ms
(0088) }
00B0 D121 RCALL pop_gset3
00B1 9508 RET
(0089) /* 主程序 */
(0090) void main(void)
(0091) {
(0092) DDRC=0x01;
_main:
00B2 E081 LDI R24,1
00B3 BB84 OUT 0x14,R24
(0093) PORTC=0xff;
00B4 EF8F LDI R24,0xFF
00B5 BB85 OUT 0x15,R24
(0094) uart_init();
00B6 D005 RCALL _uart_init
(0095) SEI();
00B7 9478 BSET 7
00B8 C001 RJMP 0x00BA
(0096) while(1)
(0097) {
(0098) music();
00B9 DFB2 RCALL _music
00BA CFFE RJMP 0x00B9
(0099) }
(0100) }
00BB 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\music\isp.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include <eeprom.h>
(0004) /* 位操作宏 */
(0005) #define set_bit(x,y) (x|=(1<<y))
(0006) #define clr_bit(x,y) (x&=~(1<<y))
(0007) #define get_bit(x,y) (x&(1<<y))
(0008) #define fosc 8000000
(0009) #define baud 19200
(0010) #define device 0x76
(0011) #define osc_address 0x1ff0
(0012) extern unsigned char read_flash(unsigned int add);
(0013) /* UART初始化 */
(0014) void uart_init(void)
(0015) {
(0016) OSCCAL=read_flash(osc_address);
_uart_init:
00BC EF00 LDI R16,0xF0
00BD E11F LDI R17,0x1F
00BE D10E RCALL _read_flash
00BF BF01 OUT 0x31,R16
(0017) UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许发送和接收
00C0 E988 LDI R24,0x98
00C1 B98A OUT 0x0A,R24
(0018) UBRRL=(fosc/16/(baud+1))%256;
00C2 E18A LDI R24,0x1A
00C3 B989 OUT 0x09,R24
(0019) UBRRH=(fosc/16/(baud+1))/256;
00C4 2422 CLR R2
00C5 BC20 OUT 0x20,R2
(0020) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
00C6 E886 LDI R24,0x86
00C7 BD80 OUT 0x20,R24
(0021) }
00C8 9508 RET
(0022) /* 字符输出函数 */
(0023) void putchar(unsigned char c)
(0024) {
(0025) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
00C9 9B5D SBIS 0x0B,5
00CA CFFE RJMP _putchar
(0026) UDR=c;
00CB B90C OUT 0x0C,R16
(0027) }
00CC 9508 RET
(0028) /* 字符输入函数 */
(0029) unsigned char getchar(void)
(0030) {
(0031) while(!(UCSRA& (1<<RXC)));
_getchar:
00CD 9B5F SBIS 0x0B,7
00CE CFFE RJMP _getchar
(0032) return UDR;
00CF B10C IN R16,0x0C
00D0 9508 RET
_isp:
val --> R20
00D1 D11F RCALL push_lset
00D2 D101 RCALL push_gset1
(0033) }
(0034) #pragma interrupt_handler isp:iv_USART_RXC
(0035) void isp(void)
(0036) {
(0037) static unsigned int adder;
(0038) unsigned char val;
(0039) val=UDR;
00D3 B14C IN R20,0x0C
(0040) switch (val)
00D4 2755 CLR R21
00D5 344C CPI R20,0x4C
00D6 E0E0 LDI R30,0
00D7 075E CPC R21,R30
00D8 F409 BNE 0x00DA
00D9 C0AF RJMP 0x0189
00DA E48C LDI R24,0x4C
00DB E090 LDI R25,0
00DC 1784 CP R24,R20
00DD 0795 CPC R25,R21
00DE F0D4 BLT 0x00F9
00DF 314B CPI R20,0x1B
00E0 E0E0 LDI R30,0
00E1 075E CPC R21,R30
00E2 F409 BNE 0x00E4
00E3 C0E6 RJMP 0x01CA
00E4 314B CPI R20,0x1B
00E5 E0E0 LDI R30,0
00E6 075E CPC R21,R30
00E7 F40C BGE 0x00E9
00E8 C0DF RJMP 0x01C8
00E9 3441 CPI R20,0x41
00EA E0E0 LDI R30,0
00EB 075E CPC R21,R30
00EC F409 BNE 0x00EE
00ED C05F RJMP 0x014D
00EE 3444 CPI R20,0x44
00EF E0E0 LDI R30,0
00F0 075E CPC R21,R30
00F1 F409 BNE 0x00F3
00F2 C073 RJMP 0x0166
00F3 3446 CPI R20,0x46
00F4 E0E0 LDI R30,0
00F5 075E CPC R21,R30
00F6 F409 BNE 0x00F8
00F7 C09F RJMP 0x0197
00F8 C0CF RJMP 0x01C8
00F9 3641 CPI R20,0x61
00FA E0E0 LDI R30,0
00FB 075E CPC R21,R30
00FC F409 BNE 0x00FE
00FD C04C RJMP 0x014A
00FE 3644 CPI R20,0x64
00FF E0E0 LDI R30,0
0100 075E CPC R21,R30
0101 F409 BNE 0x0103
0102 C076 RJMP 0x0179
0103 E684 LDI R24,0x64
0104 E090 LDI R25,0
0105 1784 CP R24,R20
0106 0795 CPC R25,R21
0107 F0AC BLT 0x011D
0108 3540 CPI R20,0x50
0109 E0E0 LDI R30,0
010A 075E CPC R21,R30
010B F409 BNE 0x010D
010C C038 RJMP 0x0145
010D 3543 CPI R20,0x53
010E E0E0 LDI R30,0
010F 075E CPC R21,R30
0110 F409 BNE 0x0112
0111 C08F RJMP 0x01A1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -