📄 keyled.lst
字号:
__start:
__text_start:
4E EFCF LDI R28,0xFF
4F E1D0 LDI R29,0x10
50 BFCD OUT 0x3D,R28
51 BFDE OUT 0x3E,R29
52 51C0 SUBI R28,0x10
53 40D0 SBCI R29,0
54 EA0A LDI R16,0xAA
55 8308 STD Y+0,R16
56 2400 CLR R0
57 E0E0 LDI R30,0
58 E0F1 LDI R31,1
59 E011 LDI R17,1
5A 30EF CPI R30,0xF
5B 07F1 CPC R31,R17
5C F011 BEQ 0x005F
5D 9201 ST R0,Z+
5E CFFB RJMP 0x005A
5F 8300 STD Z+0,R16
60 E9EC LDI R30,0x9C
61 E0F0 LDI R31,0
62 E0A0 LDI R26,0
63 E0B1 LDI R27,1
64 E010 LDI R17,0
65 E000 LDI R16,0
66 BF0B OUT 0x3B,R16
67 39EC CPI R30,0x9C
68 07F1 CPC R31,R17
69 F021 BEQ 0x006E
6A 95C8 LPM
6B 9631 ADIW R30,1
6C 920D ST R0,X+
6D CFF9 RJMP 0x0067
6E 940E 0232 CALL _main
_exit:
70 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\按键显示\delay.h
(0001) /* 1MHz 下延时程序*/
(0002)
(0003) #ifndef DELAY_H_H
(0004) #define DELAY_H_H
(0005)
(0006) void delay_1ms() //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
_delay_1ms:
i --> R16
71 E303 LDI R16,0x33
72 E015 LDI R17,5
73 C002 RJMP 0x0076
74 5001 SUBI R16,1
75 4010 SBCI R17,0
76 3000 CPI R16,0
77 0701 CPC R16,R17
78 F7D9 BNE 0x0074
79 9508 RET
_delay:
i --> R20
n --> R10
7A 940E 035A CALL push_xgset300C
7C 0158 MOVW R10,R16
(0014) ;
(0015)
(0016) }
(0017)
(0018) void delay(unsigned int n)
(0019) {
(0020) unsigned int i=0;
7D 2744 CLR R20
7E 2755 CLR R21
(0021) for(i=0;i<n;i++)
7F C003 RJMP 0x0083
(0022) delay_1ms();
80 DFF0 RCALL _delay_1ms
81 5F4F SUBI R20,0xFF
82 4F5F SBCI R21,0xFF
83 154A CP R20,R10
84 055B CPC R21,R11
85 F3D0 BCS 0x0080
86 940C 035F JMP pop_xgset300C
_display:
j --> Y,+1
i --> R20
k --> R20
88 934A ST R20,-Y
FILE: C:\DOCUME~1\Administrator\桌面\按键显示\keyled.c
(0001) /*跑表和计时
(0002) 8MHz */
(0003) #include <iom128v.h>
(0004) #include <macros.h>
(0005) #include "delay.h"
(0006) unsigned char temp;
(0007) unsigned char timer2; //the num of 5ms
(0008) unsigned int timer200; // the num of 1s
(0009) unsigned char work_state; //to set the timer or clock,0表示计时,1表示跑表
(0010) unsigned char time_change; //to sign the state of change
(0011) unsigned char clock_start; // 跑表开始信号,0表示开始,1 表示暂停
(0012) unsigned char time[4]; //array of time
(0013) unsigned char clock[4]; //array of watch
(0014) const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
(0015) 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0016) #pragma interrupt_handler timer0_com_isr:17 //timer0 compare interrupt
(0017)
(0018) void display()
(0019) {
(0020) unsigned char i,j,k;
(0021) DDRA=0xff;
89 EF8F LDI R24,0xFF
8A BB8A OUT 0x1A,R24
(0022) PORTA=0xff;
8B BB8B OUT 0x1B,R24
(0023) DDRC=0xff;
8C BB84 OUT 0x14,R24
(0024) PORTC=0xff;
8D BB85 OUT 0x15,R24
(0025)
(0026) if(work_state==0) //计时显示
8E 9020 010A LDS R2,work_state
90 2022 TST R2
91 F009 BEQ 0x0093
92 C0BD RJMP 0x0150
(0027) {
(0028) if(time_change==0x00) // normal
93 9020 0109 LDS R2,time_change
95 2022 TST R2
96 F501 BNE 0x00B7
(0029) {for(i=0;i<4;i++)
97 2744 CLR R20
98 C01B RJMP 0x00B4
(0030) {
(0031) PORTA=seg_table[time[i]];
99 E084 LDI R24,4
9A E091 LDI R25,1
9B 2FE4 MOV R30,R20
9C 27FF CLR R31
9D 0FE8 ADD R30,R24
9E 1FF9 ADC R31,R25
9F 81E0 LDD R30,Z+0
A0 27FF CLR R31
A1 E88C LDI R24,0x8C
A2 E090 LDI R25,0
A3 0FE8 ADD R30,R24
A4 1FF9 ADC R31,R25
A5 9026 ELPM R2,0(Z)
A6 BA2B OUT 0x1B,R2
(0032) PORTC=~(1<<(i+4));
A7 2F14 MOV R17,R20
A8 5F1C SUBI R17,0xFC
A9 E001 LDI R16,1
AA 940E 0364 CALL lsl8
AC 2E20 MOV R2,R16
AD 9420 COM R2
AE BA25 OUT 0x15,R2
(0033) delay_1ms();
AF DFC1 RCALL _delay_1ms
(0034) PORTC|=0xf0;
B0 B385 IN R24,0x15
B1 6F80 ORI R24,0xF0
B2 BB85 OUT 0x15,R24
B3 9543 INC R20
B4 3044 CPI R20,4
B5 F318 BCS 0x0099
(0035) }
(0036) }
B6 C099 RJMP 0x0150
(0037) else if(time_change==0x01) // change second
B7 9180 0109 LDS R24,time_change
B9 3081 CPI R24,1
BA F009 BEQ 0x00BC
BB C048 RJMP 0x0104
(0038) {
(0039) if(timer200<100) //正常显示
BC 9180 010B LDS R24,timer200
BE 9190 010C LDS R25,timer200+1
C0 3684 CPI R24,0x64
C1 E0E0 LDI R30,0
C2 079E CPC R25,R30
C3 F500 BCC 0x00E4
(0040) {
(0041) for(i=0;i<4;i++)
C4 2744 CLR R20
C5 C01B RJMP 0x00E1
(0042) {
(0043) PORTA=seg_table[time[i]];
C6 E084 LDI R24,4
C7 E091 LDI R25,1
C8 2FE4 MOV R30,R20
C9 27FF CLR R31
CA 0FE8 ADD R30,R24
CB 1FF9 ADC R31,R25
CC 81E0 LDD R30,Z+0
CD 27FF CLR R31
CE E88C LDI R24,0x8C
CF E090 LDI R25,0
D0 0FE8 ADD R30,R24
D1 1FF9 ADC R31,R25
D2 9026 ELPM R2,0(Z)
D3 BA2B OUT 0x1B,R2
(0044) PORTC=~(1<<(i+4));
D4 2F14 MOV R17,R20
D5 5F1C SUBI R17,0xFC
D6 E001 LDI R16,1
D7 940E 0364 CALL lsl8
D9 2E20 MOV R2,R16
DA 9420 COM R2
DB BA25 OUT 0x15,R2
(0045) delay_1ms();
DC DF94 RCALL _delay_1ms
(0046) PORTC|=0xf0;
DD B385 IN R24,0x15
DE 6F80 ORI R24,0xF0
DF BB85 OUT 0x15,R24
E0 9543 INC R20
E1 3044 CPI R20,4
E2 F318 BCS 0x00C6
(0047) }
(0048) }
E3 C06C RJMP 0x0150
(0049) else //只显示分
(0050) {for(i=2;i<4;i++)
E4 E042 LDI R20,2
E5 C01B RJMP 0x0101
(0051) {
(0052) PORTA=seg_table[time[i]];
E6 E084 LDI R24,4
E7 E091 LDI R25,1
E8 2FE4 MOV R30,R20
E9 27FF CLR R31
EA 0FE8 ADD R30,R24
EB 1FF9 ADC R31,R25
EC 81E0 LDD R30,Z+0
ED 27FF CLR R31
EE E88C LDI R24,0x8C
EF E090 LDI R25,0
F0 0FE8 ADD R30,R24
F1 1FF9 ADC R31,R25
F2 9026 ELPM R2,0(Z)
F3 BA2B OUT 0x1B,R2
(0053) PORTC=~(1<<(i+4));
F4 2F14 MOV R17,R20
F5 5F1C SUBI R17,0xFC
F6 E001 LDI R16,1
F7 940E 0364 CALL lsl8
F9 2E20 MOV R2,R16
FA 9420 COM R2
FB BA25 OUT 0x15,R2
(0054) delay_1ms();
FC DF74 RCALL _delay_1ms
(0055) PORTC|=0xc0;
FD B385 IN R24,0x15
FE 6C80 ORI R24,0xC0
FF BB85 OUT 0x15,R24
100 9543 INC R20
101 3044 CPI R20,4
102 F318 BCS 0x00E6
(0056) }
(0057) }
(0058) }
103 C04C RJMP 0x0150
(0059) else if(time_change==0x02) //正常显示
104 9180 0109 LDS R24,time_change
106 3082 CPI R24,2
107 F009 BEQ 0x0109
108 C047 RJMP 0x0150
(0060) { if(timer200<100)
109 9180 010B LDS R24,timer200
10B 9190 010C LDS R25,timer200+1
10D 3684 CPI R24,0x64
10E E0E0 LDI R30,0
10F 079E CPC R25,R30
110 F500 BCC 0x0131
(0061) {
(0062) { for(i=0;i<4;i++)
111 2744 CLR R20
112 C01B RJMP 0x012E
(0063) {
(0064) PORTA=seg_table[time[i]];
113 E084 LDI R24,4
114 E091 LDI R25,1
115 2FE4 MOV R30,R20
116 27FF CLR R31
117 0FE8 ADD R30,R24
118 1FF9 ADC R31,R25
119 81E0 LDD R30,Z+0
11A 27FF CLR R31
11B E88C LDI R24,0x8C
11C E090 LDI R25,0
11D 0FE8 ADD R30,R24
11E 1FF9 ADC R31,R25
11F 9026 ELPM R2,0(Z)
120 BA2B OUT 0x1B,R2
(0065) PORTC=~(1<<(i+4));
121 2F14 MOV R17,R20
122 5F1C SUBI R17,0xFC
123 E001 LDI R16,1
124 940E 0364 CALL lsl8
126 2E20 MOV R2,R16
127 9420 COM R2
128 BA25 OUT 0x15,R2
(0066) delay_1ms();
129 DF47 RCALL _delay_1ms
(0067) PORTC|=0xf0;
12A B385 IN R24,0x15
12B 6F80 ORI R24,0xF0
12C BB85 OUT 0x15,R24
12D 9543 INC R20
12E 3044 CPI R20,4
12F F318 BCS 0x0113
(0068) }
(0069) }
(0070) }
130 C01F RJMP 0x0150
(0071) else //只显示秒
(0072) for(i=0;i<2;i++)
131 2744 CLR R20
132 C01B RJMP 0x014E
(0073) {
(0074) PORTA=seg_table[time[i]];
133 E084 LDI R24,4
134 E091 LDI R25,1
135 2FE4 MOV R30,R20
136 27FF CLR R31
137 0FE8 ADD R30,R24
138 1FF9 ADC R31,R25
139 81E0 LDD R30,Z+0
13A 27FF CLR R31
13B E88C LDI R24,0x8C
13C E090 LDI R25,0
13D 0FE8 ADD R30,R24
13E 1FF9 ADC R31,R25
13F 9026 ELPM R2,0(Z)
140 BA2B OUT 0x1B,R2
(0075) PORTC=~(1<<(i+4));
141 2F14 MOV R17,R20
142 5F1C SUBI R17,0xFC
143 E001 LDI R16,1
144 940E 0364 CALL lsl8
146 2E20 MOV R2,R16
147 9420 COM R2
148 BA25 OUT 0x15,R2
(0076) delay_1ms();
149 DF27 RCALL _delay_1ms
(0077) PORTC|=0x30;
14A B385 IN R24,0x15
14B 6380 ORI R24,0x30
14C BB85 OUT 0x15,R24
14D 9543 INC R20
14E 3042 CPI R20,2
14F F318 BCS 0x0133
(0078) }
(0079) }
(0080) }
(0081) //}
(0082) //if(clock_start==0x00) //跑表显示,当跑表已经启动时
(0083) if(work_state==1)
150 9180 010A LDS R24,work_state
152 3081 CPI R24,1
153 F4F9 BNE 0x0173
(0084) //{for(j=0;j<5;j++)
(0085) {
(0086) for(k=0;k<4;k++)
154 2744 CLR R20
155 C01B RJMP 0x0171
(0087) {
(0088) PORTA=seg_table[clock[k]];
156 E080 LDI R24,0
157 E091 LDI R25,1
158 2FE4 MOV R30,R20
159 27FF CLR R31
15A 0FE8 ADD R30,R24
15B 1FF9 ADC R31,R25
15C 81E0 LDD R30,Z+0
15D 27FF CLR R31
15E E88C LDI R24,0x8C
15F E090 LDI R25,0
160 0FE8 ADD R30,R24
161 1FF9 ADC R31,R25
162 9026 ELPM R2,0(Z)
163 BA2B OUT 0x1B,R2
(0089) PORTC=~(1<<(k+4));
164 2F14 MOV R17,R20
165 5F1C SUBI R17,0xFC
166 E001 LDI R16,1
167 940E 0364 CALL lsl8
169 2E20 MOV R2,R16
16A 9420 COM R2
16B BA25 OUT 0x15,R2
(0090) delay_1ms();
16C DF04 RCALL _delay_1ms
(0091) PORTC|=0xf0;
16D B385 IN R24,0x15
16E 6F80 ORI R24,0xF0
16F BB85 OUT 0x15,R24
170 9543 INC R20
171 3044 CPI R20,4
172 F318 BCS 0x0156
(0092) }
(0093) }
173 9149 LD R20,Y+
174 9508 RET
_timer0_com_isr:
175 920A ST R0,-Y
176 921A ST R1,-Y
177 922A ST R2,-Y
178 923A ST R3,-Y
179 924A ST R4,-Y
17A 925A ST R5,-Y
17B 926A ST R6,-Y
17C 927A ST R7,-Y
17D 928A ST R8,-Y
17E 929A ST R9,-Y
17F 930A ST R16,-Y
180 931A ST R17,-Y
181 932A ST R18,-Y
182 933A ST R19,-Y
183 938A ST R24,-Y
184 939A ST R25,-Y
185 93AA ST R26,-Y
186 93BA ST R27,-Y
187 93EA ST R30,-Y
188 93FA ST R31,-Y
189 B60F IN R0,0x3F
18A 920A ST R0,-Y
(0094) //}
(0095) }
(0096) void timer0_com_isr() /* 2 ms*/
(0097) {
(0098) TIFR=0xff;
18B EF8F LDI R24,0xFF
18C BF86 OUT 0x36,R24
(0099) // timer2++; //10 ms
(0100) timer200++; //1 s,因为没有暂停的说法,所以一直加
18D 9180 010B LDS R24,timer200
18F 9190 010C LDS R25,timer200+1
191 9601 ADIW R24,1
192 9390 010C STS timer200+1,R25
194 9380 010B STS timer200,R24
(0101) //TCNT0=0x05;
(0102) TCNT0=0xd7;
196 ED87 LDI R24,0xD7
197 BF82 OUT 0x32,R24
(0103) if(timer200==200) //计时 1s
198 9180 010B LDS R24,timer200
19A 9190 010C LDS R25,timer200+1
19C 3C88 CPI R24,0xC8
19D E0E0 LDI R30,0
19E 079E CPC R25,R30
19F F589 BNE 0x01D1
(0104) {
(0105) timer200=0;
1A0 2422 CLR R2
1A1 2433 CLR R3
1A2 9230 010C STS timer200+1,R3
1A4 9220 010B STS timer200,R2
(0106) time[0]++;
1A6 9180 0104 LDS R24,time
1A8 5F8F SUBI R24,0xFF
1A9 9380 0104 STS time,R24
(0107) if(time[0]==10) // second 个位
1AB 308A CPI R24,0xA
1AC F521 BNE 0x01D1
(0108) {
(0109) time[0]=0;
1AD 9220 0104 STS time,R2
(0110) time[1]++;
1AF 9180 0105 LDS R24,time+1
1B1 5F8F SUBI R24,0xFF
1B2 9380 0105 STS time+1,R24
(0111) if(time[1]==6) //second 十位
1B4 3086 CPI R24,6
1B5 F4D9 BNE 0x01D1
(0112) {
(0113) time[1]=0;
1B6 9220 0105 STS time+1,R2
(0114) time[2]++;
1B8 9180 0106 LDS R24,time+2
1BA 5F8F SUBI R24,0xFF
1BB 9380 0106 STS time+2,R24
(0115) if(time[2]==10) // 分个位
1BD 308A CPI R24,0xA
1BE F491 BNE 0x01D1
(0116) {
(0117) time[2]=0;
1BF 9220 0106 STS time+2,R2
(0118) time[3]++;
1C1 9180 0107 LDS R24,time+3
1C3 5F8F SUBI R24,0xFF
1C4 9380 0107 STS time+3,R24
(0119) if(time[3]==6)
1C6 3086 CPI R24,6
1C7 F411 BNE 0x01CA
(0120) time[3]=0;
1C8 9220 0107 STS time+3,R2
(0121) time[2]=0;
1CA 2422 CLR R2
1CB 9220 0106 STS time+2,R2
(0122) time[1]=0;
1CD 9220 0105 STS time+1,R2
(0123) time[0]=0;
1CF 9220 0104 STS time,R2
(0124) } //time[2]
(0125) } //time[1]
(0126) } //time[0]
(0127)
(0128) } // 1s
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -