📄 dianziqin.lst
字号:
__start:
__text_start:
4B EFCF LDI R28,0xFF
4C E1D0 LDI R29,0x10
4D BFCD OUT 0x3D,R28
4E BFDE OUT 0x3E,R29
4F 51CE SUBI R28,0x1E
50 40D0 SBCI R29,0
51 EA0A LDI R16,0xAA
52 8308 STD Y+0,R16
53 2400 CLR R0
54 E0E1 LDI R30,1
55 E0F1 LDI R31,1
56 E011 LDI R17,1
57 30E3 CPI R30,3
58 07F1 CPC R31,R17
59 F011 BEQ 0x005C
5A 9201 ST R0,Z+
5B CFFB RJMP 0x0057
5C 8300 STD Z+0,R16
5D E9E5 LDI R30,0x95
5E E0F0 LDI R31,0
5F E0A0 LDI R26,0
60 E0B1 LDI R27,1
61 E010 LDI R17,0
62 E000 LDI R16,0
63 BF0B OUT 0x3B,R16
64 39E6 CPI R30,0x96
65 07F1 CPC R31,R17
66 F021 BEQ 0x006B
67 95C8 LPM
68 9631 ADIW R30,1
69 920D ST R0,X+
6A CFF9 RJMP 0x0064
6B 940E 011B CALL _main
_exit:
6D CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\delay.h
(0001) /* 1MHz 下延时程序*/
(0002)
(0003) #ifndef DELAY_H_H
(0004) #define DELAY_H_H
(0005)
(0006) void delay_1ms(void) //1ms 延时
(0007) {
(0008) unsigned int i;
(0009) /*
(0010) for(i=1;i<140;i++) //1MHz
(0011) ;
(0012)
(0013) for(i=1331;i>0;i--) // 8MHz
(0014) ;
(0015) */
(0016) for(i=0;i<2;i++) //1MHz,24us
_delay_1ms:
i --> R16
6E 2700 CLR R16
6F 2711 CLR R17
70 C002 RJMP 0x0073
71 5F0F SUBI R16,0xFF
72 4F1F SBCI R17,0xFF
73 3002 CPI R16,2
74 E0E0 LDI R30,0
75 071E CPC R17,R30
76 F3D0 BCS 0x0071
77 9508 RET
_delay:
i --> R20
n --> R10
78 940E 014D CALL push_xgset300C
7A 0158 MOVW R10,R16
(0017) ;
(0018) }
(0019)
(0020) void delay(unsigned int n)
(0021) {
(0022) unsigned int i=0;
7B 2744 CLR R20
7C 2755 CLR R21
(0023) for(i=0;i<n;i++)
7D C003 RJMP 0x0081
(0024) delay_1ms();
7E DFEF RCALL _delay_1ms
7F 5F4F SUBI R20,0xFF
80 4F5F SBCI R21,0xFF
81 154A CP R20,R10
82 055B CPC R21,R11
83 F3D0 BCS 0x007E
84 940C 0152 JMP pop_xgset300C
_delay_ms:
i --> R20
n --> R16
86 934A ST R20,-Y
87 935A ST R21,-Y
(0025) }
(0026)
(0027) void delay_ms(int n)
(0028) {
(0029) int i;
(0030) for(i=0;i<n;i++)
88 2744 CLR R20
89 2755 CLR R21
8A C00A RJMP 0x0095
(0031) {
(0032) for(i=0;i<140;i++)
8B 2744 CLR R20
8C 2755 CLR R21
8D 5F4F SUBI R20,0xFF
8E 4F5F SBCI R21,0xFF
8F 384C CPI R20,0x8C
90 E0E0 LDI R30,0
91 075E CPC R21,R30
92 F3D4 BLT 0x008D
93 5F4F SUBI R20,0xFF
94 4F5F SBCI R21,0xFF
95 1740 CP R20,R16
96 0751 CPC R21,R17
97 F39C BLT 0x008B
98 9159 LD R21,Y+
99 9149 LD R20,Y+
9A 9508 RET
_scan_key:
intKey --> R22
i --> R20
tmp --> R10
9B 940E 0157 CALL push_xgsetF00C
FILE: C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\dianziqin.c
(0001) /*模拟电子琴,0、1、2、4、5、6、8 分别模拟do re mi fa so la xi*/
(0002)
(0003) #include <iom128v.h>
(0004) #include <macros.h>
(0005) #include "delay.h"
(0006)
(0007) char count=0x00;
(0008) char sound_signal;//定义音符大小
(0009) char sound_pace;//定义节拍大小
(0010) const char music_key[]={0x27,0x23,0x1f,0x00,0x1d,0x1a,0x17,0x00,0x15};
(0011) char scan_key()
(0012) {
(0013) char i=0;
9D 2744 CLR R20
(0014) char tmp=0x00;
9E 24AA CLR R10
(0015) char intKey=0x00;
9F 2766 CLR R22
(0016) DDRB=0x8f;
A0 E88F LDI R24,0x8F
A1 BB87 OUT 0x17,R24
(0017) PORTB=0xf8;
A2 EF88 LDI R24,0xF8
A3 BB88 OUT 0x18,R24
(0018)
(0019) for(i=0;i<3;i++)
A4 C05A RJMP 0x00FF
(0020) {
(0021) PORTB=~(1<<i);
A5 E001 LDI R16,1
A6 2F14 MOV R17,R20
A7 940E 0165 CALL lsl8
A9 2E20 MOV R2,R16
AA 9420 COM R2
AB BA28 OUT 0x18,R2
(0022) delay(10); //等待低电平稳定
AC E00A LDI R16,0xA
AD E010 LDI R17,0
AE DFC9 RCALL _delay
(0023) tmp=PINB&0xf0;
AF B386 IN R24,0x16
B0 7F80 ANDI R24,0xF0
B1 2EA8 MOV R10,R24
(0024) if(tmp!=0xf0) //有键按下,延时10ms去抖
B2 3F80 CPI R24,0xF0
B3 F031 BEQ 0x00BA
(0025) {
(0026) delay_ms(10);
B4 E00A LDI R16,0xA
B5 E010 LDI R17,0
B6 DFCF RCALL _delay_ms
(0027) tmp=PINB&0xf0;
B7 B386 IN R24,0x16
B8 7F80 ANDI R24,0xF0
B9 2EA8 MOV R10,R24
(0028) }
(0029) if(tmp!=0xf0) //确有键按下
BA 2D8A MOV R24,R10
BB 3F80 CPI R24,0xF0
BC F409 BNE 0x00BE
BD C040 RJMP 0x00FE
(0030) {
(0031) tmp&=0xf0;
BE 7F80 ANDI R24,0xF0
BF 2EA8 MOV R10,R24
(0032) switch(tmp)
C0 24BB CLR R11
C1 01C5 MOVW R24,R10
C2 3B80 CPI R24,0xB0
C3 E0E0 LDI R30,0
C4 079E CPC R25,R30
C5 F139 BEQ 0x00ED
C6 EB80 LDI R24,0xB0
C7 158A CP R24,R10
C8 059B CPC R25,R11
C9 F034 BLT 0x00D0
CA 01C5 MOVW R24,R10
CB 3780 CPI R24,0x70
CC E0E0 LDI R30,0
CD 079E CPC R25,R30
CE F129 BEQ 0x00F4
CF C02B RJMP 0x00FB
D0 01C5 MOVW R24,R10
D1 3D80 CPI R24,0xD0
D2 E0E0 LDI R30,0
D3 079E CPC R25,R30
D4 F089 BEQ 0x00E6
D5 3D80 CPI R24,0xD0
D6 E0E0 LDI R30,0
D7 079E CPC R25,R30
D8 F114 BLT 0x00FB
D9 01C5 MOVW R24,R10
DA 3E80 CPI R24,0xE0
DB E0E0 LDI R30,0
DC 079E CPC R25,R30
DD F009 BEQ 0x00DF
DE C01C RJMP 0x00FB
(0033) {
(0034) case 0xe0:
(0035) intKey=12-4*(3-i);
DF E083 LDI R24,3
E0 1B84 SUB R24,R20
E1 0F88 LSL R24
E2 0F88 LSL R24
E3 E06C LDI R22,0xC
E4 1B68 SUB R22,R24
(0036) break;
E5 C016 RJMP 0x00FC
(0037) case 0xd0: //1 or 5
(0038) intKey=13-4*(3-i);
E6 E083 LDI R24,3
E7 1B84 SUB R24,R20
E8 0F88 LSL R24
E9 0F88 LSL R24
EA E06D LDI R22,0xD
EB 1B68 SUB R22,R24
(0039) break;
EC C00F RJMP 0x00FC
(0040) case 0xb0:
(0041) intKey=14-4*(3-i);
ED E083 LDI R24,3
EE 1B84 SUB R24,R20
EF 0F88 LSL R24
F0 0F88 LSL R24
F1 E06E LDI R22,0xE
F2 1B68 SUB R22,R24
(0042) break;
F3 C008 RJMP 0x00FC
(0043) case 0x70:
(0044) intKey=15-4*(3-i);
F4 E083 LDI R24,3
F5 1B84 SUB R24,R20
F6 0F88 LSL R24
F7 0F88 LSL R24
F8 E06F LDI R22,0xF
F9 1B68 SUB R22,R24
(0045) break;
FA C001 RJMP 0x00FC
(0046) default:
(0047) intKey=0xf0;
FB EF60 LDI R22,0xF0
(0048) break;
(0049) }
(0050) return intKey;
FC 2F06 MOV R16,R22
FD C005 RJMP 0x0103
FE 9543 INC R20
FF 3043 CPI R20,3
100 F408 BCC 0x0102
101 CFA3 RJMP 0x00A5
(0051) }
(0052) }
(0053) return 0xf0;
102 EF00 LDI R16,0xF0
103 940C 015E JMP pop_xgsetF00C
_timer1_isr:
105 922A ST R2,-Y
106 923A ST R3,-Y
107 938A ST R24,-Y
108 939A ST R25,-Y
109 B62F IN R2,0x3F
10A 922A ST R2,-Y
(0054) }
(0055)
(0056) #pragma interrupt_handler timer1_isr:13
(0057) void timer1_isr() // 50ms
(0058) {
(0059) count=count+1;
10B 9180 0100 LDS R24,count
10D 5F8F SUBI R24,0xFF
10E 9380 0100 STS count,R24
(0060) TCNT1=0x00;
110 2422 CLR R2
111 2433 CLR R3
112 BC3D OUT 0x2D,R3
113 BC2C OUT 0x2C,R2
114 9029 LD R2,Y+
115 BE2F OUT 0x3F,R2
116 9199 LD R25,Y+
117 9189 LD R24,Y+
118 9039 LD R3,Y+
119 9029 LD R2,Y+
11A 9518 RETI
(0061)
(0062) }
(0063) void main()
(0064) {
(0065)
(0066) char key=0x00;
_main:
intKey --> R10
key --> R20
11B 2744 CLR R20
(0067) char intKey=0x00;
11C 24AA CLR R10
(0068) DDRB=0x8f;
11D E88F LDI R24,0x8F
11E BB87 OUT 0x17,R24
(0069) PORTB=0xf8;
11F EF88 LDI R24,0xF8
120 BB88 OUT 0x18,R24
(0070)
(0071) TCNT1H=0x00;
121 2422 CLR R2
122 BC2D OUT 0x2D,R2
(0072) TCNT1L=0x00;
123 BC2C OUT 0x2C,R2
(0073) OCR1AH=0x00;
124 BC2B OUT 0x2B,R2
(0074) OCR1AL=0x30;
125 E380 LDI R24,0x30
126 BD8A OUT 0x2A,R24
(0075) TIMSK=0x10;
127 E180 LDI R24,0x10
128 BF87 OUT 0x37,R24
(0076) TCCR1A=0x00;
129 BC2F OUT 0x2F,R2
(0077) SEI();
12A 9478 BSET 7
12B C01F RJMP 0x014B
(0078)
(0079) while(1)
(0080) {
(0081)
(0082) key=scan_key();
12C DF6E RCALL _scan_key
12D 2F40 MOV R20,R16
(0083) if(key!=0xf0) //有键按下
12E 3F00 CPI R16,0xF0
12F F0B9 BEQ 0x0147
(0084) {
(0085) TCCR1B=0x05;
130 E085 LDI R24,5
131 BD8E OUT 0x2E,R24
132 C010 RJMP 0x0143
(0086) while(count!=4){
(0087)
(0088) PORTB^=0x80;
133 E880 LDI R24,0x80
134 E090 LDI R25,0
135 B228 IN R2,0x18
136 2433 CLR R3
137 2628 EOR R2,R24
138 2639 EOR R3,R25
139 BA28 OUT 0x18,R2
(0089) delay(music_key[key]);}
13A E88C LDI R24,0x8C
13B E090 LDI R25,0
13C 2FE4 MOV R30,R20
13D 27FF CLR R31
13E 0FE8 ADD R30,R24
13F 1FF9 ADC R31,R25
140 9106 ELPM R16,0(Z)
141 2711 CLR R17
142 DF35 RCALL _delay
143 9180 0100 LDS R24,count
145 3084 CPI R24,4
146 F761 BNE 0x0133
(0090) }
(0091) TCCR1B=0x00;
147 2422 CLR R2
148 BC2E OUT 0x2E,R2
(0092) count=0;
FILE: <library>
149 9220 0100 STS count,R2
14B CFE0 RJMP 0x012C
14C 9508 RET
push_xgset300C:
14D 935A ST R21,-Y
14E 934A ST R20,-Y
14F 92BA ST R11,-Y
150 92AA ST R10,-Y
151 9508 RET
pop_xgset300C:
152 90A9 LD R10,Y+
153 90B9 LD R11,Y+
154 9149 LD R20,Y+
155 9159 LD R21,Y+
156 9508 RET
push_xgsetF00C:
157 937A ST R23,-Y
158 936A ST R22,-Y
159 935A ST R21,-Y
15A 934A ST R20,-Y
15B 92BA ST R11,-Y
15C 92AA ST R10,-Y
15D 9508 RET
pop_xgsetF00C:
15E 90A9 LD R10,Y+
15F 90B9 LD R11,Y+
160 9149 LD R20,Y+
161 9159 LD R21,Y+
162 9169 LD R22,Y+
163 9179 LD R23,Y+
164 9508 RET
lsl8:
165 2311 TST R17
166 F019 BEQ 0x016A
167 0F00 LSL R16
168 951A DEC R17
169 CFFB RJMP lsl8
16A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -