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 + -
显示快捷键?