?? 計算器.lst
字號:
__text_start:
__start:
39 E5CF LDI R28,0x5F
3A E0D4 LDI R29,4
3B BFCD OUT 0x3D,R28
3C BFDE OUT 0x3E,R29
3D 51C0 SUBI R28,0x10
3E 40D0 SBCI R29,0
3F EA0A LDI R16,0xAA
40 8308 STD Y+0,R16
41 2400 CLR R0
42 E7E5 LDI R30,0x75
43 E0F0 LDI R31,0
44 E010 LDI R17,0
45 37E6 CPI R30,0x76
46 07F1 CPC R31,R17
47 F011 BEQ 0x004A
48 9201 ST R0,Z+
49 CFFB RJMP 0x0045
4A 8300 STD Z+0,R16
4B E5EC LDI R30,0x5C
4C E0F0 LDI R31,0
4D E6A0 LDI R26,0x60
4E E0B0 LDI R27,0
4F E010 LDI R17,0
50 E000 LDI R16,0
51 BF0B OUT 0x3B,R16
52 37E1 CPI R30,0x71
53 07F1 CPC R31,R17
54 F021 BEQ 0x0059
55 95C8 LPM
56 9631 ADIW R30,1
57 920D ST R0,X+
58 CFF9 RJMP 0x0052
59 940E 02C2 CALL _main
_exit:
5B CFFF RJMP _exit
_int0:
t --> R20
5C 920A ST R0,-Y
5D 921A ST R1,-Y
5E 922A ST R2,-Y
5F 923A ST R3,-Y
60 924A ST R4,-Y
61 925A ST R5,-Y
62 926A ST R6,-Y
63 927A ST R7,-Y
64 928A ST R8,-Y
65 929A ST R9,-Y
66 930A ST R16,-Y
67 931A ST R17,-Y
68 932A ST R18,-Y
69 933A ST R19,-Y
6A 934A ST R20,-Y
6B 936A ST R22,-Y
6C 937A ST R23,-Y
6D 938A ST R24,-Y
6E 939A ST R25,-Y
6F 93AA ST R26,-Y
70 93BA ST R27,-Y
71 93EA ST R30,-Y
72 93FA ST R31,-Y
73 B60F IN R0,0x3F
74 920A ST R0,-Y
75 940E 0459 CALL push_xgsetF000
FILE: E:\avr工程\計算器\計算器\程序\計算器.c
(0001) #include<iom16v.h>
(0002) #include<macros.h>
(0003) #include<math.h>
(0004) #define uint unsigned int
(0005) #define uchar unsigned char
(0006) #pragma interrupt_handler int0:2
(0007)
(0008) uint code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0009) uchar i=0;
(0010) uchar sign;
(0011)
(0012) void int0()
(0013) { uchar t=255;
77 EF4F LDI R20,0xFF
(0014) GICR&=~BIT(6); //先關閉中斷,因為用的是鍵盤反轉掃描法,故掃描過程中會出現
78 B78B IN R24,0x3B
79 7B8F ANDI R24,0xBF
7A BF8B OUT 0x3B,R24
(0015) //電平交替變化,為防止再次觸發中斷先關閉中斷
(0016) if(keyscan()!=255) //檢測按鍵是否有效
7B D1BD RCALL _keyscan
7C 3F0F CPI R16,0xFF
7D E0E0 LDI R30,0
7E 071E CPC R17,R30
7F F019 BEQ 0x0083
(0017) i=keyscan();
80 D1B8 RCALL _keyscan
81 9300 0074 STS i,R16
(0018) while(t--); //按鍵掃描會導致電平不穩定,延時一小段時間等待波形穩定
83 2F64 MOV R22,R20
84 2777 CLR R23
85 5041 SUBI R20,1
86 2366 TST R22
87 F7D9 BNE 0x0083
(0019) while((PIND|=BIT(2))==0); //檢測按鍵是否抬起
88 B340 IN R20,0x10
89 6044 ORI R20,4
8A BB40 OUT 0x10,R20
8B 2344 TST R20
8C F3D9 BEQ 0x0088
(0020)
(0021) GICR|=BIT(6);
8D B78B IN R24,0x3B
8E 6480 ORI R24,0x40
8F BF8B OUT 0x3B,R24
90 940E 045E CALL pop_xgsetF000
92 9009 LD R0,Y+
93 BE0F OUT 0x3F,R0
94 91F9 LD R31,Y+
95 91E9 LD R30,Y+
96 91B9 LD R27,Y+
97 91A9 LD R26,Y+
98 9199 LD R25,Y+
99 9189 LD R24,Y+
9A 9179 LD R23,Y+
9B 9169 LD R22,Y+
9C 9149 LD R20,Y+
9D 9139 LD R19,Y+
9E 9129 LD R18,Y+
9F 9119 LD R17,Y+
A0 9109 LD R16,Y+
A1 9099 LD R9,Y+
A2 9089 LD R8,Y+
A3 9079 LD R7,Y+
A4 9069 LD R6,Y+
A5 9059 LD R5,Y+
A6 9049 LD R4,Y+
A7 9039 LD R3,Y+
A8 9029 LD R2,Y+
A9 9019 LD R1,Y+
AA 9009 LD R0,Y+
AB 9518 RETI
_delay:
i --> R20
j --> R22
t --> R16
AC 940E 0459 CALL push_xgsetF000
(0022)
(0023) }
(0024)
(0025)
(0026) void delay(uint t)
(0027) {
(0028) uint i,j;
(0029) for(i=0;i<t;i++)
AE 2744 CLR R20
AF 2755 CLR R21
B0 C00B RJMP 0x00BC
(0030) for(j=0;j<1141;j++);
B1 2766 CLR R22
B2 2777 CLR R23
B3 C002 RJMP 0x00B6
B4 5F6F SUBI R22,0xFF
B5 4F7F SBCI R23,0xFF
B6 3765 CPI R22,0x75
B7 E0E4 LDI R30,4
B8 077E CPC R23,R30
B9 F3D0 BCS 0x00B4
BA 5F4F SUBI R20,0xFF
BB 4F5F SBCI R21,0xFF
BC 1740 CP R20,R16
BD 0751 CPC R21,R17
BE F390 BCS 0x00B1
BF 940C 045E JMP pop_xgsetF000
(0031) }
(0032)
(0033)
(0034) void InitC_0() //配置c口高四位為輸出,低四位為帶上拉電阻的輸入
(0035) { DDRC=0xf0;
_InitC_0:
C1 EF80 LDI R24,0xF0
C2 BB84 OUT 0x14,R24
(0036) PORTC=0x0f;
C3 E08F LDI R24,0xF
C4 BB85 OUT 0x15,R24
C5 9508 RET
(0037) }
(0038) void InitC_1() //配置c口低四位為輸出,高四位為帶上拉電阻的輸入
(0039) {
(0040) DDRC=0x0f;
_InitC_1:
C6 E08F LDI R24,0xF
C7 BB84 OUT 0x14,R24
(0041) PORTC=0xf0;
C8 EF80 LDI R24,0xF0
C9 BB85 OUT 0x15,R24
CA 9508 RET
_show:
j --> R10
i --> R12
CB 92AA ST R10,-Y
CC 92CA ST R12,-Y
CD 2EA2 MOV R10,R18
CE 2EC0 MOV R12,R16
(0042) }
(0043)
(0044)
(0045)
(0046) void show(uchar i,uchar j) //在數碼管的第i位,顯示數字j
(0047) {
(0048) PORTA=0x00;
CF 2422 CLR R2
D0 BA2B OUT 0x1B,R2
(0049) PORTA|=BIT(i);
D1 E001 LDI R16,1
D2 2D1C MOV R17,R12
D3 940E 0480 CALL lsl8
D5 B22B IN R2,0x1B
D6 2A20 OR R2,R16
D7 BA2B OUT 0x1B,R2
(0050) PORTB=0x02;
D8 E082 LDI R24,2
D9 BB88 OUT 0x18,R24
(0051) PORTB=0x00;
DA 2422 CLR R2
DB BA28 OUT 0x18,R2
(0052) PORTA=0x00;
DC BA2B OUT 0x1B,R2
(0053) PORTA=~code[j];
DD E680 LDI R24,0x60
DE E090 LDI R25,0
DF 2DEA MOV R30,R10
E0 27FF CLR R31
E1 0FEE LSL R30
E2 1FFF ROL R31
E3 0FE8 ADD R30,R24
E4 1FF9 ADC R31,R25
E5 8020 LDD R2,Z+0
E6 8031 LDD R3,Z+1
E7 9420 COM R2
E8 9430 COM R3
E9 BA2B OUT 0x1B,R2
(0054) PORTB=0X01;
EA E081 LDI R24,1
EB BB88 OUT 0x18,R24
(0055) PORTB=0X00;
EC 2422 CLR R2
ED BA28 OUT 0x18,R2
EE 90C9 LD R12,Y+
EF 90A9 LD R10,Y+
F0 9508 RET
_display_1:
j --> Y,+0
x --> R10
t --> R12
wei --> R10
i --> Y,+14
F1 940E 03D4 CALL push_arg4
F3 940E 044E CALL push_xgsetF0FC
F5 9724 SBIW R28,4
(0056) // delay(1);
(0057) }
(0058)
(0059) void display_1(long i) //檢測一整數的位數并顯示
(0060) {
(0061) if(i==0)show(0,0);
F6 E040 LDI R20,0
F7 E050 LDI R21,0
F8 E060 LDI R22,0
F9 E070 LDI R23,0
FA 842E LDD R2,Y+14
FB 843F LDD R3,Y+15
FC 8848 LDD R4,Y+16
FD 8859 LDD R5,Y+17
FE 1624 CP R2,R20
FF 0635 CPC R3,R21
100 0646 CPC R4,R22
101 0657 CPC R5,R23
102 F421 BNE 0x0107
103 2722 CLR R18
104 2700 CLR R16
105 DFC5 RCALL _show
106 C05D RJMP 0x0164
(0062) else
(0063) {
(0064) uchar t=9;
107 E089 LDI R24,0x9
108 2EC8 MOV R12,R24
(0065) uchar wei,x=0;
109 24AA CLR R10
(0066) long j=10000000;
10A E840 LDI R20,0x80
10B E956 LDI R21,0x96
10C E968 LDI R22,0x98
10D E070 LDI R23,0
10E 8348 STD Y+0,R20
10F 8359 STD Y+1,R21
110 836A STD Y+2,R22
111 837B STD Y+3,R23
112 C027 RJMP 0x013A
(0067) while(x==0) //檢測i的位數
(0068) { x=(i>=j);
113 8028 LDD R2,Y+0
114 8039 LDD R3,Y+1
115 804A LDD R4,Y+2
116 805B LDD R5,Y+3
117 846E LDD R6,Y+14
118 847F LDD R7,Y+15
119 8888 LDD R8,Y+16
11A 8899 LDD R9,Y+17
11B 1462 CP R6,R2
11C 0473 CPC R7,R3
11D 0484 CPC R8,R4
11E 0495 CPC R9,R5
11F F024 BLT 0x0124
120 E081 LDI R24,1
121 E090 LDI R25,0
122 017C MOVW R14,R24
123 C002 RJMP 0x0126
124 24EE CLR R14
125 24FF CLR R15
126 2CAE MOV R10,R14
(0069) j/=10;
127 E04A LDI R20,0xA
128 E050 LDI R21,0
129 E060 LDI R22,0
12A E070 LDI R23,0
12B 8108 LDD R16,Y+0
12C 8119 LDD R17,Y+1
12D 812A LDD R18,Y+2
12E 813B LDD R19,Y+3
12F 937A ST R23,-Y
130 936A ST R22,-Y
131 935A ST R21,-Y
132 934A ST R20,-Y
133 940E 03DF CALL div32s
135 8308 STD Y+0,R16
136 8319 STD Y+1,R17
137 832A STD Y+2,R18
138 833B STD Y+3,R19
(0070) t--;
139 94CA DEC R12
13A 20AA TST R10
13B F2B9 BEQ 0x0113
(0071) }
(0072)
(0073) for(wei=0;wei<t;wei++) //從低位到高位依次顯示
13C 24AA CLR R10
13D C024 RJMP 0x0162
(0074) { show(wei,i%10);
13E E04A LDI R20,0xA
13F E050 LDI R21,0
140 E060 LDI R22,0
141 E070 LDI R23,0
142 850E LDD R16,Y+14
143 851F LDD R17,Y+15
144 8928 LDD R18,Y+16
145 8939 LDD R19,Y+17
146 937A ST R23,-Y
147 936A ST R22,-Y
148 935A ST R21,-Y
149 934A ST R20,-Y
14A 940E 03E1 CALL mod32s
14C 2F20 MOV R18,R16
14D 2D0A MOV R16,R10
14E DF7C RCALL _show
(0075) i/=10;
14F E04A LDI R20,0xA
150 E050 LDI R21,0
151 E060 LDI R22,0
152 E070 LDI R23,0
153 850E LDD R16,Y+14
154 851F LDD R17,Y+15
155 8928 LDD R18,Y+16
156 8939 LDD R19,Y+17
157 937A ST R23,-Y
158 936A ST R22,-Y
159 935A ST R21,-Y
15A 934A ST R20,-Y
15B 940E 03DF CALL div32s
15D 870E STD Y+14,R16
15E 871F STD Y+15,R17
15F 8B28 STD Y+16,R18
160 8B39 STD Y+17,R19
161 94A3 INC R10
162 14AC CP R10,R12
163 F2D0 BCS 0x013E
(0076) }
(0077) }
164 9624 ADIW R28,4
165 940E 0443 CALL pop_xgsetF0FC
167 9624 ADIW R28,4
168 9508 RET
_display:
t --> R12
j --> Y,+8
x --> R10
wei --> R10
n --> Y,+4
i --> Y,+0
a --> Y,+22
169 940E 03D4 CALL push_arg4
16B 940E 044E CALL push_xgsetF0FC
16D 972C SBIW R28,0xC
(0078) }
(0079)
(0080)
(0081) void display(float a)
(0082) {
(0083) float n;
(0084) long i=(long)a;
16E 890E LDD R16,Y+22
16F 891F LDD R17,Y+23
170 8D28 LDD R18,Y+24
171 8D39 LDD R19,Y+25
172 940E 0518 CALL fpint
174 8308 STD Y+0,R16
175 8319 STD Y+1,R17
176 832A STD Y+2,R18
177 833B STD Y+3,R19
(0085) n=a-i;
178 882E LDD R2,Y+22
179 883F LDD R3,Y+23
17A 8C48 LDD R4,Y+24
17B 8C59 LDD R5,Y+25
17C 8108 LDD R16,Y+0
17D 8119 LDD R17,Y+1
17E 812A LDD R18,Y+2
17F 813B LDD R19,Y+3
180 940E 0551 CALL long2fp
182 933A ST R19,-Y
183 932A ST R18,-Y
184 931A ST R17,-Y
185 930A ST R16,-Y
186 0181 MOVW R16,R2
187 0192 MOVW R18,R4
188 940E 050D CALL fpsub2
18A 830C STD Y+4,R16
18B 831D STD Y+5,R17
18C 832E STD Y+6,R18
18D 833F STD Y+7,R19
(0086) if(n==0)display_1(i);
18E 802C LDD R2,Y+4
18F 803D LDD R3,Y+5
190 804E LDD R4,Y+6
191 805F LDD R5,Y+7
192 E508 LDI R16,0x58
193 E010 LDI R17,0
194 940E 046C CALL lpm32
196 933A ST R19,-Y
197 932A ST R18,-Y
198 931A ST R17,-Y
199 930A ST R16,-Y
19A 0181 MOVW R16,R2
19B 0192 MOVW R18,R4
19C 940E 0703 CALL fpcmp2
19E F431 BNE 0x01A5
19F 8108 LDD R16,Y+0
1A0 8119 LDD R17,Y+1
1A1 812A LDD R18,Y+2
1A2 813B LDD R19,Y+3
1A3 DF4D RCALL _display_1
1A4 C08F RJMP 0x0234
(0087) else{
(0088) uchar t=9;
1A5 E089 LDI R24,0x9
1A6 2EC8 MOV R12,R24
(0089) uchar wei,x=0;
1A7 24AA CLR R10
(0090) long j=10000000;
1A8 E840 LDI R20,0x80
1A9 E956 LDI R21,0x96
1AA E968 LDI R22,0x98
1AB E070 LDI R23,0
1AC 8748 STD Y+8,R20
1AD 8759 STD Y+9,R21
1AE 876A STD Y+10,R22
1AF 877B STD Y+11,R23
1B0 C027 RJMP 0x01D8
(0091)
(0092) while(x==0) //檢測i的位數
(0093) { x=(i>=j);
1B1 8428 LDD R2,Y+8
1B2 8439 LDD R3,Y+9
1B3 844A LDD R4,Y+10
1B4 845B LDD R5,Y+11
1B5 8068 LDD R6,Y+0
1B6 8079 LDD R7,Y+1
1B7 808A LDD R8,Y+2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -