1602.lst
来自「10K到5MHz的频率测量」· LST 代码 · 共 1,887 行 · 第 1/4 页
LST
1,887 行
14F 9AC7 SBI 0x18,7
(0172) s_ms(20);
150 E104 LDI R16,0x14
151 E010 LDI R17,0
152 DF06 RCALL _s_ms
(0173) PORTB&=~(1<<EN);
153 98C7 CBI 0x18,7
(0174) pBuffer++;
154 5F4F SUBI R20,0xFF
155 4F5F SBCI R21,0xFF
156 9563 INC R22
157 3160 CPI R22,0x10
158 F398 BCS 0x014C
159 940C 041F JMP pop_xgsetF00C
_WriteNum:
num --> R20
col --> R10
row --> R22
15B 940E 0418 CALL push_xgsetF00C
15D 0159 MOVW R10,R18
15E 01B8 MOVW R22,R16
15F 814E LDD R20,Y+6
160 815F LDD R21,Y+7
(0175) }
(0176) }
(0177) //====================================================
(0178) // 描述:在任意位置写数字函数
(0179) // 入口:’row‘表示要写数字所在的行地址,只能为1或2
(0180) // ’col‘表示要写数字所在的列地址,只能为0--15
(0181) // ‘num’表示要写的数字,只能为0--9
(0182) // 出口:无
(0183) //===================================================
(0184) void WriteNum(uint row,uint col,uint num)
(0185) {
(0186) if (row == 1) row = 0x80 + col;
161 3061 CPI R22,1
162 E0E0 LDI R30,0
163 077E CPC R23,R30
164 F421 BNE 0x0169
165 01B5 MOVW R22,R10
166 5860 SUBI R22,0x80
167 4F7F SBCI R23,0xFF
168 C003 RJMP 0x016C
(0187) else row = 0xC0 + col;
169 01B5 MOVW R22,R10
16A 5460 SUBI R22,0x40
16B 4F7F SBCI R23,0xFF
(0188) writecom(row);
16C 2F06 MOV R16,R22
16D DF1C RCALL _writecom
(0189) if (num<=0 | num>9) num =0x30;
16E 3040 CPI R20,0
16F 0745 CPC R20,R21
170 F421 BNE 0x0175
171 E081 LDI R24,1
172 E090 LDI R25,0
173 015C MOVW R10,R24
174 C002 RJMP 0x0177
175 24AA CLR R10
176 24BB CLR R11
177 E089 LDI R24,0x9
178 E090 LDI R25,0
179 1784 CP R24,R20
17A 0795 CPC R25,R21
17B F418 BCC 0x017F
17C E061 LDI R22,1
17D E070 LDI R23,0
17E C002 RJMP 0x0181
17F 2766 CLR R22
180 2777 CLR R23
181 0115 MOVW R2,R10
182 2A26 OR R2,R22
183 2A37 OR R3,R23
184 2022 TST R2
185 F411 BNE 0x0188
186 2033 TST R3
187 F019 BEQ 0x018B
188 E340 LDI R20,0x30
189 E050 LDI R21,0
18A C002 RJMP 0x018D
(0190) else num = 0x30 + num;
18B 5D40 SUBI R20,0xD0
18C 4F5F SBCI R21,0xFF
(0191)
(0192) PORTB|=(1<<RS);
18D 9AC5 SBI 0x18,5
(0193) s_ms(20);
18E E104 LDI R16,0x14
18F E010 LDI R17,0
190 DEC8 RCALL _s_ms
(0194) PORTB&=~(1<<RW);
191 98C6 CBI 0x18,6
(0195) s_ms(20);
192 E104 LDI R16,0x14
193 E010 LDI R17,0
194 DEC4 RCALL _s_ms
(0196) PORTA = num;
195 BB4B OUT 0x1B,R20
(0197) s_ms(20);
196 E104 LDI R16,0x14
197 E010 LDI R17,0
198 DEC0 RCALL _s_ms
(0198) PORTB|=(1<<EN);
199 9AC7 SBI 0x18,7
(0199) s_ms(20);
19A E104 LDI R16,0x14
19B E010 LDI R17,0
19C DEBC RCALL _s_ms
(0200) PORTB&=~(1<<EN);
19D 98C7 CBI 0x18,7
(0201) s_ms(20);
19E E104 LDI R16,0x14
19F E010 LDI R17,0
1A0 DEB8 RCALL _s_ms
1A1 940C 041F JMP pop_xgsetF00C
_WriteChar:
t --> R12
i --> R10
pBuffer --> R20
num --> Y,+8
col --> R10
row --> R22
1A3 940E 0426 CALL push_xgsetF03C
1A5 2EA2 MOV R10,R18
1A6 2F60 MOV R22,R16
1A7 854A LDD R20,Y+10
1A8 855B LDD R21,Y+11
(0202) }
(0203) //================================================================
(0204) // 描述:在任意位置写任意多个字符
(0205) // 入口:’row‘要写的字符所在的行,只能为1或2;
(0206) // ‘col’要写的字符所在的列,只能为0---15
(0207) // ‘num’要写字符的个数
(0208) // ‘pbuffer’要写字符的首地址
(0209) //==================================================================
(0210) void WriteChar(uchar row,uchar col,uchar num,uchar *pBuffer)
(0211) {
(0212) uchar i,t;
(0213) if (row == 1) row = 0x80 + col;
1A9 3061 CPI R22,1
1AA F419 BNE 0x01AE
1AB 2D6A MOV R22,R10
1AC 5860 SUBI R22,0x80
1AD C002 RJMP 0x01B0
(0214) else row = 0xC0 + col;
1AE 2D6A MOV R22,R10
1AF 5460 SUBI R22,0x40
(0215) writecom(row);
1B0 2F06 MOV R16,R22
1B1 DED8 RCALL _writecom
(0216) //if (num<=0 | num>9) num =0x30;
(0217) //else num = 0x30 + num;
(0218)
(0219) PORTB|=(1<<RS);
1B2 9AC5 SBI 0x18,5
(0220) s_ms(20);
1B3 E104 LDI R16,0x14
1B4 E010 LDI R17,0
1B5 DEA3 RCALL _s_ms
(0221) PORTB&=~(1<<RW);
1B6 98C6 CBI 0x18,6
(0222) s_ms(20);
1B7 E104 LDI R16,0x14
1B8 E010 LDI R17,0
1B9 DE9F RCALL _s_ms
(0223) for(i=num;i!=0;i--)
1BA 84A8 LDD R10,Y+8
1BB C014 RJMP 0x01D0
(0224) {
(0225) t = *pBuffer;
1BC 01FA MOVW R30,R20
1BD 80C0 LDD R12,Z+0
(0226) s_ms(20);
1BE E104 LDI R16,0x14
1BF E010 LDI R17,0
1C0 DE98 RCALL _s_ms
(0227) PORTA = t;
1C1 BACB OUT 0x1B,R12
(0228) s_ms(20);
1C2 E104 LDI R16,0x14
1C3 E010 LDI R17,0
1C4 DE94 RCALL _s_ms
(0229) PORTB|=(1<<EN);
1C5 9AC7 SBI 0x18,7
(0230) s_ms(20);
1C6 E104 LDI R16,0x14
1C7 E010 LDI R17,0
1C8 DE90 RCALL _s_ms
(0231) PORTB&=~(1<<EN);
1C9 98C7 CBI 0x18,7
(0232) s_ms(20);
1CA E104 LDI R16,0x14
1CB E010 LDI R17,0
1CC DE8C RCALL _s_ms
(0233) pBuffer++;
1CD 5F4F SUBI R20,0xFF
1CE 4F5F SBCI R21,0xFF
1CF 94AA DEC R10
1D0 20AA TST R10
1D1 F751 BNE 0x01BC
1D2 940C 042F JMP pop_xgsetF03C
FILE: D:\我的资源\我的文件\电子技术\AVR\AVR学习\JASON'~2\M16频率计(10K-5MHz,误差0.1%以下)(已验证)\1602_main.c
(0001) #include<iom16v.h>
(0002) #include<macros.h>
(0003) #include"1602.h"
(0004) #define uint unsigned int
(0005) #define uchar unsigned char
(0006) #define ulint unsigned long int
(0007) uchar F[]={"F="},Hz[]={"Hz"},T[]={"T="};
(0008) uchar S[]={"S"},uS[]={"uS"},dot[]={"."};
(0009) float TT,FF;
(0010) ulint f,ff,T_int;
(0011) uchar i,t,f_hign,f_low,hignf;
(0012)
(0013) void port_init(void)
(0014) {
(0015) DDRA = 0xff;
_port_init:
1D4 EF8F LDI R24,0xFF
1D5 BB8A OUT 0x1A,R24
(0016) PORTA = 0xff;
1D6 BB8B OUT 0x1B,R24
(0017) PORTB = 0x00;
1D7 2422 CLR R2
1D8 BA28 OUT 0x18,R2
(0018) DDRB = 0xF0;
1D9 EF80 LDI R24,0xF0
1DA BB87 OUT 0x17,R24
(0019) PORTC = 0x00; //m103 output only
1DB BA25 OUT 0x15,R2
(0020) DDRC = 0x00;
1DC BA24 OUT 0x14,R2
(0021) DDRD = 0xff;
1DD EF8F LDI R24,0xFF
1DE BB81 OUT 0x11,R24
(0022) PORTD = 0xff;
1DF BB82 OUT 0x12,R24
1E0 9508 RET
(0023) }
(0024)
(0025) //TIMER0 initialize - prescale:1024
(0026) // WGM: Normal
(0027) // desired value: 8mSec
(0028) // actual value: 8.000mSec (0.0%)
(0029) void timer0_init(void)
(0030) {
(0031) TCCR0 = 0x00; //stop
_timer0_init:
1E1 2422 CLR R2
1E2 BE23 OUT 0x33,R2
(0032) TCNT0 = 0x83; //set count
1E3 E883 LDI R24,0x83
1E4 BF82 OUT 0x32,R24
(0033) TCCR0 = 0x35; //start timer
1E5 E385 LDI R24,0x35
1E6 BF83 OUT 0x33,R24
1E7 9508 RET
_timer0_ovf_isr:
1E8 938A ST R24,-Y
1E9 939A ST R25,-Y
1EA B78F IN R24,0x3F
1EB 938A ST R24,-Y
(0034) }
(0035)
(0036) #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
(0037) void timer0_ovf_isr(void)
(0038) {
(0039) TCNT0 = 0x83; //reload counter value
1EC E883 LDI R24,0x83
1ED BF82 OUT 0x32,R24
(0040) t++;
1EE 9180 0073 LDS R24,t
1F0 5F8F SUBI R24,0xFF
1F1 9380 0073 STS t,R24
1F3 9189 LD R24,Y+
1F4 BF8F OUT 0x3F,R24
1F5 9199 LD R25,Y+
1F6 9189 LD R24,Y+
1F7 9518 RETI
(0041) }
(0042)
(0043) //TIMER1 initialize - prescale:Falling edge
(0044) // WGM: 0) Normal, TOP=0xFFFF
(0045) void timer1_init(void)
(0046) {
(0047) TCCR1B = 0x00; //stop
_timer1_init:
1F8 2422 CLR R2
1F9 BC2E OUT 0x2E,R2
(0048) TCCR1A = 0x00;
1FA BC2F OUT 0x2F,R2
(0049) TCNT1H=0;
1FB BC2D OUT 0x2D,R2
(0050) TCNT1L=0;
1FC BC2C OUT 0x2C,R2
(0051) TCCR1B = 0x07; //start Timer
1FD E087 LDI R24,7
1FE BD8E OUT 0x2E,R24
1FF 9508 RET
_timer1_ovf_isr:
200 922A ST R2,-Y
201 938A ST R24,-Y
202 939A ST R25,-Y
203 B62F IN R2,0x3F
204 922A ST R2,-Y
(0052) }
(0053)
(0054) #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0055) void timer1_ovf_isr(void)
(0056) {
(0057) TCNT1H=0;
205 2422 CLR R2
206 BC2D OUT 0x2D,R2
(0058) TCNT1L=0;
207 BC2C OUT 0x2C,R2
(0059) hignf++;
208 9180 0070 LDS R24,hignf
20A 5F8F SUBI R24,0xFF
20B 9380 0070 STS hignf,R24
20D 9029 LD R2,Y+
20E BE2F OUT 0x3F,R2
20F 9199 LD R25,Y+
210 9189 LD R24,Y+
211 9029 LD R2,Y+
212 9518 RETI
(0060) }
(0061)
(0062) //call this routine to initialize all peripherals
(0063) void init_devices(void)
(0064) {
(0065) port_init();
_init_devices:
213 DFC0 RCALL _port_init
(0066) timer0_init();
214 DFCC RCALL _timer0_init
(0067) timer1_init();
215 DFE2 RCALL _timer1_init
(0068) MCUCR = 0x00;
216 2422 CLR R2
217 BE25 OUT 0x35,R2
(0069) GICR = 0x00;
218 BE2B OUT 0x3B,R2
(0070) TIMSK = 0x05; //timer interrupt sources
219 E085 LDI R24,5
21A BF89 OUT 0x39,R24
21B 9508 RET
_main:
21C 9724 SBIW R28,4
(0071) }
(0072)
(0073) //主函数
(0074) void main()
(0075) {
(0076) CLI();
21D 94F8 BCLR 7
(0077) t=0;
21E 2422 CLR R2
21F 9220 0073 STS t,R2
(0078) hignf=0;
221 9220 0070 STS hignf,R2
(0079) init_devices();
223 DFEF RCALL _init_devices
(0080) s_ms(5000); //延时
224 E808 LDI R16,0x88
225 E113 LDI R17,0x13
226 DE32 RCALL _s_ms
(0081) LcdInit(); //1602初始化
227 DE7E RCALL _LcdInit
(0082) WriteChar(1,0,2,T);
228 E686 LDI R24,0x66
229 E090 LDI R25,0
22A 839B STD Y+3,R25
22B 838A STD Y+2,R24
22C E082 LDI R24,2
22D 8388 STD Y+0,R24
22E 2722 CLR R18
22F E001 LDI R16,1
230 DF72 RCALL _WriteChar
(0083) WriteChar(1,15,1,S);
231 E689 LDI R24,0x69
232 E090 LDI R25,0
233 839B STD Y+3,R25
234 838A STD Y+2,R24
235 E081 LDI R24,1
236 8388 STD Y+0,R24
237 E02F LDI R18,0xF
238 E001 LDI R16,1
239 DF69 RCALL _WriteChar
(0084) WriteNum(1,4,0);
23A 2422 CLR R2
23B 2433 CLR R3
23C 8239 STD Y+1,R3
23D 8228 STD Y+0,R2
23E E024 LDI R18,4
23F E030 LDI R19,0
240 E001 LDI R16,1
241 E010 LDI R17,0
242 DF18 RCALL _WriteNum
(0085) WriteChar(1,5,1,dot);
243 E68E LDI R24,0x6E
244 E090 LDI R25,0
245 839B STD Y+3,R25
246 838A STD Y+2,R24
247 E081 LDI R24,1
248 8388 STD Y+0,R24
249 E025 LDI R18,5
24A E001 LDI R16,1
24B DF57 RCALL _WriteChar
(0086) WriteChar(2,0,2,F);
24C E680 LDI R24,0x60
24D E090 LDI R25,0
24E 839B STD Y+3,R25
24F 838A STD Y+2,R24
250 E082 LDI R24,2
251 8388 STD Y+0,R24
252 2722 CLR R18
253 E002 LDI R16,2
254 DF4E RCALL _WriteChar
(0087) WriteChar(2,14,2,Hz);
255 E683 LDI R24,0x63
256 E090 LDI R25,0
257 839B STD Y+3,R25
258 838A STD Y+2,R24
259 E082 LDI R24,2
25A 8388 STD Y+0,R24
25B E02E LDI R18,0xE
25C E002 LDI R16,2
25D DF45 RCALL _WriteChar
(0088) SEI();
25E 9478 BSET 7
25F C117 RJMP 0x0377
(0089) while(1)
(0090) {
(0091) if(t==125) //100KHz~5MHz
260 9180 0073 LDS R24,t
262 378D CPI R24,0x7D
263 F009 BEQ 0x0265
264 C112 RJMP 0x0377
(0092) {
(0093) f_low=TCNT1L;
265 B42C IN R2,0x2C
266 9220 0071 STS f_low,R2
(0094) f_hign=TCNT1H;
268 B42D IN R2,0x2D
269 9220 0072 STS f_hign,R2
(0095) f=(ulint)f_hign*256+f_low; //转换为unsigned long类型,否则所测频率最多32670HZ
26B 2433 CLR R3
26C 2444 CLR R4
26D 2455 CLR R5
26E E040 LDI R20,0
26F E051 LDI R21,1
270 E060 LDI R22,0
271 E070 LDI R23,0
272 925A ST R5,-Y
273 924A ST R4,-Y
274 923A ST R3,-Y
275 922A ST R2,-Y
276 018A MOVW R16,R20
277 019B MOVW R18,R22
278 940E 03E4 CALL empy32s
27A 0118 MOVW R2,R16
27B 0129 MOVW R4,R18
27C 9060 0071 LDS R6,f_low
27E 2477 CLR R7
27F 2488 CLR R8
280 2499 CLR R9
281 0C26 ADD R2,R6
282 1C37 ADC R3,R7
283 1C48 ADC R4,R8
284 1C59 ADC R5,R9
285 9230 007E STS f+1,R3
287 9220 007D STS f,R2
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?