📄 02-8a-8.lst
字号:
__text_start:
__start:
016C EFCF LDI R28,0xFF
016D E0D2 LDI R29,2
016E BFCD OUT 0x3D,R28
016F BFDE OUT 0x3E,R29
0170 51C0 SUBI R28,0x10
0171 40D0 SBCI R29,0
0172 EA0A LDI R16,0xAA
0173 8308 STD Y+0,R16
0174 2400 CLR R0
0175 E0E0 LDI R30,0
0176 E0F1 LDI R31,1
0177 E011 LDI R17,1
0178 30E2 CPI R30,2
0179 07F1 CPC R31,R17
017A F011 BEQ 0x017D
017B 9201 ST R0,Z+
017C CFFB RJMP 0x0178
017D 8300 STD Z+0,R16
017E EDE7 LDI R30,0xD7
017F E0F2 LDI R31,2
0180 E0A0 LDI R26,0
0181 E0B1 LDI R27,1
0182 E012 LDI R17,2
0183 3DE7 CPI R30,0xD7
0184 07F1 CPC R31,R17
0185 F021 BEQ 0x018A
0186 95C8 LPM
0187 9631 ADIW R30,1
0188 920D ST R0,X+
0189 CFF9 RJMP 0x0183
018A D07B RCALL _main
_exit:
018B CFFF RJMP _exit
FILE: D:\xij\demo\demo_diy02-8a\1\C语言\02-8A-8\8.c
(0001) //10. I/O端口的又一应用-发出乐曲声。
(0002) //PD.0端口开关控制音乐程序。
(0003) //你能把你最喜欢的乐曲输入单片机吗?
(0004) // www.sl.com.cn
(0005) // Target : M48 Crystal: 8.0000Mhz
(0006)
(0007) #include <iom48v.h>
(0008) #include <macros.h>
(0009) /* 音乐数据 */
(0010) /* 四分之一拍为0x10, 二分之一拍为0x20, 一拍为0x40*/
(0011) /* 低1-1 2-2 3-3 4-4 5-5 6-6 7-7 */
(0012) /* 中1-8 2-9 3-A 4-B 5-C 6-D 7-E */
(0013) /* 高1-F*/
(0014)
(0015) const unsigned char sound[]={ //乐曲数据表
(0016) 0x23,0x24,0x25,0x44,0x45,0x24,0x23,0x22,0x42,0x40,0x40,0x23,0x22,0x21,0x41,0x28,
(0017) 0x48,0x23,0x25,0x45,0x40,0x40,0x21,0x21,0x42,0x21,0x21,0x41,0x20,0x28,0x47,0x26,
(0018) 0x17,0x16,0x15,0x45,0x40,0x31,0x11,0x21,0x21,0x21,0x22,0x42,0x40,0x20,0x23,0x23,
(0019) 0x24,0x25,0x24,0x23,0x24,0x25,0x26,0x23,0x23,0x42,0x42,0x40,0x23,0x22,0x21,0x41,
(0020) 0x28,0x28,0x28,0x23,0x25,0x45,0x45,0x40,0x20,0x25,0x46,0x28,0x28,0x48,0x20,0x29,
(0021) 0x47,0x26,0x17,0x16,0x15,0x45,0x25,0x25,0x26,0x28,0x18,0x16,0x26,0x28,0x26,0x28,
(0022) 0x19,0x19,0x49,0x49,0x20,0x25,0x2a,0x18,0x19,0x29,0x28,0x16,0x17,0x16,0x15,0x25,
(0023) 0x25,0x28,0x29,0x2a,0x29,0x48,0x28,0x48,0x2c,0x4c,0x4c,0x40,0x2a,0x2c,0x1c,0x1a,
(0024) 0x2a,0x2a,0x29,0x4a,0x2b,0x2a,0x4a,0x4a,0x40,0x2a,0x29,0x29,0x28,0x28,0x26,0x48,
(0025) 0x29,0x26,0x45,0x45,0x40,0x25,0x25,0x26,0x21,0x18,0x16,0x26,0x28,0x26,0x28,0x29,
(0026) 0x49,0x49,0x20,0x25,0x28,0x29,0x2a,0x29,0x49,0x28,0x48,0x2c,0x4c,0x4c,0x40,0x2a,
(0027) 0x2c,0x15,0x1a,0x2a,0x2a,0x29,0x4a,0x2b,0x2a,0x4a,0x4a,0x40,0x2a,0x29,0x29,0x28,
(0028) 0x28,0x26,0x28,0x28,0x29,0x26,0x45,0x45,0x40,0x25,0x25,0x26,0x28,0x28,0x26,0x2a,
(0029) 0x19,0x18,0x28,0x18,0x19,0x48,0x48,0x40,0x40,0x40,0x40,0x28,0x48,0x29,0x28,0x28,
(0030) 0x2a,0x1a,0x1a,0x1a,0x18,0x40,0x20,0x26,0x28,0x28,0x28,0x26,0x28,0x48,0x26,0x25,
(0031) 0x45,0x45,0x40,0x40,0x40,0x28,0x48,0x28,0x28,0x1c,0x1d,0x2d,0x2c,0x28,0x28,0x28,
(0032) 0x20,0x26,0x19,0x1a,0x29,0x19,0x18,0x28,0x28,0x26,0x21,0x29,0x49,0x49,0x40,0x20,
(0033) 0x28,0x29,0x2a,0x4a,0x4a,0x20,0x25,0x28,0x29,0x48,0x48,0x48,0x25,0x25,0x26,0x28,
(0034) 0x28,0x26,0x2a,0x19,0x18,0x28,0x18,0x19,0x49,0x49,0x40,0x40,
(0035)
(0036) 0x25,0x28,0x2A,0x4A,0x29,0x28,0x48,0x28,
(0037) 0x26,0x46,0x28,0x45,0x25,0x28,0x2A,0x4A,
(0038) 0x29,0x28,0x48,0x28,0x29,0x49,0x2A,0x49,
(0039) 0x40,0x2A,0x4A,0x2B,0x4C,0x40,0x3D,0x1D,
(0040) 0x2D,0x2D,0x4C,0x40,0x2A,0x4A,0x2C,0x48,
(0041) 0x28,0x2A,0x29,0x46,0x25,0x48,0x40,
(0042)
(0043) 0x2a,0x2a,0x4a,0x2a,0x2a,0x4a,0x2a,0x2c,0x28,0x29,
(0044) 0x4a,0x4a,0x2b,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,
(0045) 0x2a,0x29,0x29,0x28,0x49,0x4c,0x2a,0x2a,0x4a,0x2a,
(0046) 0x2a,0x4a,0x2a,0x2c,0x28,0x29,0x4a,0x4a,0x2b,0x2b,
(0047) 0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,0x2c,0x2c,0x2b,0x29,
(0048) 0x48,0x48,
(0049)
(0050) 0x4a,0x2a,0x29,0x28,0x29,0x28,0x27,0x46,0x46,0x46,
(0051) 0x46,0x4b,0x2b,0x2a,0x29,0x28,0x29,0x2b,0x4a,0x4a,
(0052) 0x4a,0x4b,0x2b,0x2a,0x49,0x29,0x2b,0x4a,0x2a,0x28,
(0053) 0x46,0x48,0x47,0x4a,0x29,0x28,0x27,0x28,0x46,0x46,
(0054) 0x46,0x46,0x4a,0x2a,0x29,0x28,0x29,0x28,0x27,0x46,
(0055) 0x46,0x46,0x46,0x4b,0x2b,0x2a,0x29,0x28,0x29,0x2b,
(0056) 0x4a,0x4a,0x4a,0x4b,0x2b,0x2a,0x49,0x29,0x2b,0x4a,
(0057) 0x2a,0x28,0x46,0x48,0x47,0x4a,0x29,0x28,0x27,0x28,
(0058) 0x46,0x46,0x46,0x46,
(0059)
(0060) 0x43,0x43,0x45,0x49,0x49,0x49,0x48,0x48,0x45,0x44,
(0061) 0x44,0x44,0x43,0x43,0x43,0x43,0x44,0x45,0x46,0x46,
(0062) 0x46,0x45,0x45,0x45,0x43,0x43,0x45,0x49,0x49,0x49,
(0063) 0x48,0x48,0x45,0x44,0x44,0x44,0x43,0x43,0x45,0x45,
(0064) 0x46,0x47,0x48,0x48,0x48,0x48,0x48,0x48,0x49,0x49,
(0065) 0x45,0x47,0x46,0x45,0x43,0x43,0x45,0x48,0x48,0x48,
(0066) 0x46,0x46,0x48,0x49,0x49,0x48,0x47,0x47,0x47,0x45,
(0067) 0x45,0x45,0x43,0x43,0x45,0x49,0x49,0x49,0x48,0x48,
(0068) 0x45,0x44,0x44,0x44,0x43,0x43,0x45,0x45,0x46,0x47,
(0069) 0x48,0x48,0x48,0x48,0x40,0x40,
(0070)
(0071) 0x45,0x48,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x49,0x4a,
(0072) 0x49,0x48,0x48,0x48,0x48,0x48,0x45,0x48,0x4a,0x4a,
(0073) 0x48,0x4a,0x4c,0x4c,0x4b,0x4a,0x49,0x49,0x49,0x49,
(0074) 0x49,0x4c,0x4b,0x4a,0x4a,0x4a,0x49,0x48,0x48,0x49,
(0075) 0x4a,0x4c,0x4b,0x4b,0x4b,0x4b,0x4b,0x46,0x46,0x45,
(0076) 0x45,0x45,0x47,0x48,0x49,0x49,0x4a,0x49,0x48,0x48,
(0077) 0x48,0x48,0x48,0x48,
(0078)
(0079) 0x00,0x00
(0080) };
(0081)
(0082) /* 音阶表 */
(0083) const unsigned int TONETABLE[15]={
(0084) 64580,64684,64777,64820,64898,64968,65030,65058,
(0085) 65110,65157,65178,65217,65252,65283,65297
(0086) };
(0087) /* 音阶重装常数 */
(0088) /* 微秒级延时程序 */
(0089) void delay_us(int time)
(0090) {
(0091) do
(0092) {
(0093) time--;
_delay_us:
time --> R16
018C 5001 SUBI R16,1
018D 4010 SBCI R17,0
(0094) }
(0095) while (time>1);
018E E081 LDI R24,1
018F E090 LDI R25,0
0190 1780 CP R24,R16
0191 0791 CPC R25,R17
0192 F3CC BLT 0x018C
0193 9508 RET
_delay_ms:
time --> R20
0194 D086 RCALL push_gset1
0195 01A8 MOVW R20,R16
(0096) }
(0097)
(0098) /* 毫秒级延时程序 */
(0099) void delay_ms(unsigned int time)
(0100) {
0196 C005 RJMP 0x019C
(0101) while(time!=0)
(0102) {
(0103) delay_us(1000);
0197 EE08 LDI R16,0xE8
0198 E013 LDI R17,3
0199 DFF2 RCALL _delay_us
(0104) time--;
019A 5041 SUBI R20,1
019B 4050 SBCI R21,0
019C 3040 CPI R20,0
019D 0745 CPC R20,R21
019E F7C1 BNE 0x0197
019F D07E RCALL pop_gset1
01A0 9508 RET
_timer1_ovf_isr:
01A1 922A ST R2,-Y
01A2 923A ST R3,-Y
01A3 938A ST R24,-Y
01A4 B62F IN R2,0x3F
01A5 922A ST R2,-Y
(0105) }
(0106) }
(0107)
(0108) unsigned int toneconst;
(0109) #pragma interrupt_handler timer1_ovf_isr:14
(0110) //iv_TIMER1_OVF
(0111) void timer1_ovf_isr(void)
(0112) {
(0113) TCNT1=toneconst;
01A6 90200100 LDS R2,toneconst
01A8 90300101 LDS R3,toneconst+1
01AA 92300085 STS 0x85,R3
01AC 92200084 STS 0x84,R2
(0114) PORTD^=0x08;
01AE E088 LDI R24,0x8
01AF B02B IN R2,0x0B
01B0 2628 EOR R2,R24
01B1 B82B OUT 0x0B,R2
01B2 9029 LD R2,Y+
01B3 BE2F OUT 0x3F,R2
01B4 9189 LD R24,Y+
01B5 9039 LD R3,Y+
01B6 9029 LD R2,Y+
01B7 9518 RETI
_music:
sound_add --> R20
temp1 --> R22
temp --> R10
01B8 D05E RCALL push_gset3
(0115) }
(0116) void music(void)
(0117) {
(0118) unsigned char temp,temp1;
(0119) unsigned int sound_add=0;
01B9 2744 CLR R20
01BA 2755 CLR R21
(0120) TCCR1A = 0x00;
01BB 2422 CLR R2
01BC 92200080 STS 0x80,R2
(0121) TCCR1B =(1<<CS11);//8分频
01BE E082 LDI R24,2
01BF 93800081 STS 0x81,R24
(0122) temp1 = sound[sound_add];
01C1 E384 LDI R24,0x34
01C2 E090 LDI R25,0
01C3 01FA MOVW R30,R20
01C4 0FE8 ADD R30,R24
01C5 1FF9 ADC R31,R25
01C6 9164 LPM R22,0(Z)
01C7 C036 RJMP 0x01FE
(0123) while(temp1!=0)
(0124) {
(0125) temp=temp1;
01C8 2EA6 MOV R10,R22
(0126) temp&=0x0f;
01C9 2D8A MOV R24,R10
01CA 708F ANDI R24,0xF
01CB 2EA8 MOV R10,R24
(0127) if(temp!=0)
01CC 2388 TST R24
01CD F0C9 BEQ 0x01E7
(0128) {
(0129) TIMSK1|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
01CE 9180006F LDS R24,0x6F
01D0 6081 ORI R24,1
01D1 9380006F STS 0x6F,R24
(0130) temp--;
01D3 94AA DEC R10
(0131) toneconst=TONETABLE[temp];
01D4 E082 LDI R24,2
01D5 9D8A MUL R24,R10
01D6 01F0 MOVW R30,R0
01D7 EB89 LDI R24,0xB9
01D8 E092 LDI R25,2
01D9 0FE8 ADD R30,R24
01DA 1FF9 ADC R31,R25
01DB 9005 LPM R0,Z+
01DC 9014 LPM R1,0(Z)
01DD 01F0 MOVW R30,R0
01DE 93F00101 STS toneconst+1,R31
01E0 93E00100 STS toneconst,R30
(0132) TCNT1=toneconst;
01E2 011F MOVW R2,R30
01E3 92300085 STS 0x85,R3
01E5 92200084 STS 0x84,R2
(0133) }
(0134) temp=temp1;
01E7 2EA6 MOV R10,R22
(0135) temp>>=4;
01E8 2D8A MOV R24,R10
01E9 9582 SWAP R24
01EA 708F ANDI R24,0xF
(0136) temp&=0x0f;
01EB 708F ANDI R24,0xF
01EC 2EA8 MOV R10,R24
(0137) delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
01ED E881 LDI R24,0x81
01EE 9D8A MUL R24,R10
01EF 0180 MOVW R16,R0
01F0 DFA3 RCALL _delay_ms
(0138) TIMSK1&=~(1<<TOIE1);
01F1 9180006F LDS R24,0x6F
01F3 7F8E ANDI R24,0xFE
01F4 9380006F STS 0x6F,R24
(0139) sound_add++;
01F6 5F4F SUBI R20,0xFF
01F7 4F5F SBCI R21,0xFF
(0140) temp1 = sound[sound_add];
01F8 E384 LDI R24,0x34
01F9 E090 LDI R25,0
01FA 01FA MOVW R30,R20
01FB 0FE8 ADD R30,R24
01FC 1FF9 ADC R31,R25
01FD 9164 LPM R22,0(Z)
01FE 2366 TST R22
01FF F009 BEQ 0x0201
0200 CFC7 RJMP 0x01C8
(0141) }
(0142) delay_ms(1000);
0201 EE08 LDI R16,0xE8
0202 E013 LDI R17,3
0203 DF90 RCALL _delay_ms
0204 D00C RCALL pop_gset3
0205 9508 RET
(0143) }
(0144) /* 主程序 */
(0145) void main(void)
(0146) {
(0147) DDRD=0xFB;
_main:
0206 EF8B LDI R24,0xFB
0207 B98A OUT 0x0A,R24
(0148) PORTD=0xff;
0208 EF8F LDI R24,0xFF
0209 B98B OUT 0x0B,R24
(0149) // DDRC=0x01;
(0150) //PORTC=0xff;
(0151) SEI();
020A 9478 BSET 7
(0152)
(0153) while(PIND & 0x04);//等待PD2按键按下
020B 994A SBIC 0x09,2
020C CFFE RJMP 0x020B
020D C001 RJMP 0x020F
(0154)
(0155) while(1)
(0156) {
(0157) music();
FILE: <library>
020E DFA9 RCALL _music
020F CFFE RJMP 0x020E
0210 9508 RET
pop_gset3:
0211 E0E4 LDI R30,4
0212 C00C RJMP pop
push_gset5:
0213 92FA ST R15,-Y
0214 92EA ST R14,-Y
push_gset4:
0215 92DA ST R13,-Y
0216 92CA ST R12,-Y
push_gset3:
0217 92BA ST R11,-Y
0218 92AA ST R10,-Y
push_gset2:
0219 937A ST R23,-Y
021A 936A ST R22,-Y
push_gset1:
021B 935A ST R21,-Y
021C 934A ST R20,-Y
021D 9508 RET
pop_gset1:
021E E0E1 LDI R30,1
pop:
021F 9149 LD R20,Y+
0220 9159 LD R21,Y+
0221 FDE0 SBRC R30,0
0222 9508 RET
0223 9169 LD R22,Y+
0224 9179 LD R23,Y+
0225 FDE1 SBRC R30,1
0226 9508 RET
0227 90A9 LD R10,Y+
0228 90B9 LD R11,Y+
0229 FDE2 SBRC R30,2
022A 9508 RET
022B 90C9 LD R12,Y+
022C 90D9 LD R13,Y+
022D FDE3 SBRC R30,3
022E 9508 RET
022F 90E9 LD R14,Y+
0230 90F9 LD R15,Y+
0231 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -