📄 diy0816-11.lst
字号:
__text_start:
__start:
017C E5CF LDI R28,0x5F
017D E0D4 LDI R29,4
017E BFCD OUT 0x3D,R28
017F BFDE OUT 0x3E,R29
0180 51C0 SUBI R28,0x10
0181 40D0 SBCI R29,0
0182 EA0A LDI R16,0xAA
0183 8308 STD Y+0,R16
0184 2400 CLR R0
0185 E6E0 LDI R30,0x60
0186 E0F0 LDI R31,0
0187 E010 LDI R17,0
0188 36E2 CPI R30,0x62
0189 07F1 CPC R31,R17
018A F011 BEQ 0x018D
018B 9201 ST R0,Z+
018C CFFB RJMP 0x0188
018D 8300 STD Z+0,R16
018E EFE7 LDI R30,0xF7
018F E0F2 LDI R31,2
0190 E6A0 LDI R26,0x60
0191 E0B0 LDI R27,0
0192 E012 LDI R17,2
0193 3FE7 CPI R30,0xF7
0194 07F1 CPC R31,R17
0195 F021 BEQ 0x019A
0196 95C8 LPM
0197 9631 ADIW R30,1
0198 920D ST R0,X+
0199 CFF9 RJMP 0x0193
019A 940E020F CALL _main
_exit:
019C CFFF RJMP _exit
FILE: D:\SL-DIY~1\diy0208_16_11\diy0816_11.c
(0001) //11. I/O端口的又一应用-声音输入处理。
(0002) //请修改以上程序,如何用声控来启动。
(0003) // www.sl.com.cn
(0004) // teny@sl.com.cn 05-11-12
(0005) // Target : mega16 Crystal: 8.0000Mhz
(0006)
(0007) #include <iom16v.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
019D 5001 SUBI R16,1
019E 4010 SBCI R17,0
(0094) }
(0095) while (time>1);
019F E081 LDI R24,1
01A0 E090 LDI R25,0
01A1 1780 CP R24,R16
01A2 0791 CPC R25,R17
01A3 F3CC BLT 0x019D
01A4 9508 RET
_delay_ms:
time --> R20
01A5 940E0229 CALL push_gset1
01A7 01A8 MOVW R20,R16
(0096) }
(0097)
(0098) /* 毫秒级延时程序 */
(0099) void delay_ms(unsigned int time)
(0100) {
01A8 C005 RJMP 0x01AE
(0101) while(time!=0)
(0102) {
(0103) delay_us(1000);
01A9 EE08 LDI R16,0xE8
01AA E013 LDI R17,3
01AB DFF1 RCALL _delay_us
(0104) time--;
01AC 5041 SUBI R20,1
01AD 4050 SBCI R21,0
01AE 3040 CPI R20,0
01AF 0745 CPC R20,R21
01B0 F7C1 BNE 0x01A9
01B1 940E022C CALL pop_gset1
01B3 9508 RET
_timer1_ovf_isr:
01B4 922A ST R2,-Y
01B5 923A ST R3,-Y
01B6 938A ST R24,-Y
01B7 B62F IN R2,0x3F
01B8 922A ST R2,-Y
(0105) }
(0106) }
(0107)
(0108) unsigned int toneconst;
(0109) #pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
(0110) void timer1_ovf_isr(void)
(0111) {
(0112) TCNT1=toneconst;
01B9 90200060 LDS R2,toneconst
01BB 90300061 LDS R3,toneconst+1
01BD BC3D OUT 0x2D,R3
01BE BC2C OUT 0x2C,R2
(0113) PORTC^=1;
01BF E081 LDI R24,1
01C0 B225 IN R2,0x15
01C1 2628 EOR R2,R24
01C2 BA25 OUT 0x15,R2
01C3 9029 LD R2,Y+
01C4 BE2F OUT 0x3F,R2
01C5 9189 LD R24,Y+
01C6 9039 LD R3,Y+
01C7 9029 LD R2,Y+
01C8 9518 RETI
_music:
sound_add --> R20
temp1 --> R22
temp --> R10
01C9 940E0225 CALL push_gset3
(0114) }
(0115) void music(void)
(0116) {
(0117) unsigned char temp,temp1;
(0118) unsigned int sound_add=0;
01CB 2744 CLR R20
01CC 2755 CLR R21
(0119) TCCR1A = 0x00;
01CD 2422 CLR R2
01CE BC2F OUT 0x2F,R2
(0120) TCCR1B =(1<<CS11);//8分频
01CF E082 LDI R24,2
01D0 BD8E OUT 0x2E,R24
(0121) temp1 = sound[sound_add];
01D1 E584 LDI R24,0x54
01D2 E090 LDI R25,0
01D3 01FA MOVW R30,R20
01D4 0FE8 ADD R30,R24
01D5 1FF9 ADC R31,R25
01D6 9164 LPM R22,0(Z)
01D7 C02F RJMP 0x0207
(0122) while(temp1!=0)
(0123) {
(0124) temp=temp1;
01D8 2EA6 MOV R10,R22
(0125) temp&=0x0f;
01D9 2D8A MOV R24,R10
01DA 708F ANDI R24,0xF
01DB 2EA8 MOV R10,R24
(0126) if(temp!=0)
01DC 2388 TST R24
01DD F0A1 BEQ 0x01F2
(0127) {
(0128) TIMSK|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
01DE B789 IN R24,0x39
01DF 6084 ORI R24,4
01E0 BF89 OUT 0x39,R24
(0129) temp--;
01E1 94AA DEC R10
(0130) toneconst=TONETABLE[temp];
01E2 E082 LDI R24,2
01E3 9D8A MUL R24,R10
01E4 01F0 MOVW R30,R0
01E5 ED89 LDI R24,0xD9
01E6 E092 LDI R25,2
01E7 0FE8 ADD R30,R24
01E8 1FF9 ADC R31,R25
01E9 9005 LPM R0,Z+
01EA 9014 LPM R1,0(Z)
01EB 01F0 MOVW R30,R0
01EC 93F00061 STS toneconst+1,R31
01EE 93E00060 STS toneconst,R30
(0131) TCNT1=toneconst;
01F0 BDFD OUT 0x2D,R31
01F1 BDEC OUT 0x2C,R30
(0132) }
(0133) temp=temp1;
01F2 2EA6 MOV R10,R22
(0134) temp>>=4;
01F3 2D8A MOV R24,R10
01F4 9582 SWAP R24
01F5 708F ANDI R24,0xF
(0135) temp&=0x0f;
01F6 708F ANDI R24,0xF
01F7 2EA8 MOV R10,R24
(0136) delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
01F8 E881 LDI R24,0x81
01F9 9D8A MUL R24,R10
01FA 0180 MOVW R16,R0
01FB DFA9 RCALL _delay_ms
(0137) TIMSK&=~(1<<TOIE1);
01FC B789 IN R24,0x39
01FD 7F8B ANDI R24,0xFB
01FE BF89 OUT 0x39,R24
(0138) sound_add++;
01FF 5F4F SUBI R20,0xFF
0200 4F5F SBCI R21,0xFF
(0139) temp1 = sound[sound_add];
0201 E584 LDI R24,0x54
0202 E090 LDI R25,0
0203 01FA MOVW R30,R20
0204 0FE8 ADD R30,R24
0205 1FF9 ADC R31,R25
0206 9164 LPM R22,0(Z)
0207 2366 TST R22
0208 F679 BNE 0x01D8
(0140) }
(0141) delay_ms(1000);
0209 EE08 LDI R16,0xE8
020A E013 LDI R17,3
020B DF99 RCALL _delay_ms
020C 940E021E CALL pop_gset3
020E 9508 RET
(0142) }
(0143) /* 主程序 */
(0144) void main(void)
(0145) {
(0146) DDRB=0x00;
_main:
020F 2422 CLR R2
0210 BA27 OUT 0x17,R2
(0147) PORTB=0xff;
0211 EF8F LDI R24,0xFF
0212 BB88 OUT 0x18,R24
(0148) DDRC=0x01;
0213 E081 LDI R24,1
0214 BB84 OUT 0x14,R24
(0149) PORTC=0xff;
0215 EF8F LDI R24,0xFF
0216 BB85 OUT 0x15,R24
(0150) SEI();
0217 9478 BSET 7
(0151)
(0152) while(PINB & 0x04);//等待声控(PB2)启动
0218 99B2 SBIC 0x16,2
0219 CFFE RJMP 0x0218
021A C001 RJMP 0x021C
(0153)
(0154) while(1)
(0155) {
(0156) music();
FILE: <library>
021B DFAD RCALL _music
021C CFFE RJMP 0x021B
021D 9508 RET
pop_gset3:
021E E0E4 LDI R30,4
021F 940C022D JMP pop
push_gset5:
0221 92FA ST R15,-Y
0222 92EA ST R14,-Y
push_gset4:
0223 92DA ST R13,-Y
0224 92CA ST R12,-Y
push_gset3:
0225 92BA ST R11,-Y
0226 92AA ST R10,-Y
push_gset2:
0227 937A ST R23,-Y
0228 936A ST R22,-Y
push_gset1:
0229 935A ST R21,-Y
022A 934A ST R20,-Y
022B 9508 RET
pop_gset1:
022C E0E1 LDI R30,1
pop:
022D 9149 LD R20,Y+
022E 9159 LD R21,Y+
022F FDE0 SBRC R30,0
0230 9508 RET
0231 9169 LD R22,Y+
0232 9179 LD R23,Y+
0233 FDE1 SBRC R30,1
0234 9508 RET
0235 90A9 LD R10,Y+
0236 90B9 LD R11,Y+
0237 FDE2 SBRC R30,2
0238 9508 RET
0239 90C9 LD R12,Y+
023A 90D9 LD R13,Y+
023B FDE3 SBRC R30,3
023C 9508 RET
023D 90E9 LD R14,Y+
023E 90F9 LD R15,Y+
023F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -