⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 countermeter.lst

📁 一个用AVR做出的一个频率计
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"countermeter.c"
   2               		.arch atmega16
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
  70               	.global	digits
  71               		.data
  74               	digits:
  75 0000 3F        		.byte	63
  76 0001 06        		.byte	6
  77 0002 5B        		.byte	91
  78 0003 4F        		.byte	79
  79 0004 66        		.byte	102
  80 0005 6D        		.byte	109
  81 0006 7D        		.byte	125
  82 0007 07        		.byte	7
  83 0008 7F        		.byte	127
  84 0009 6F        		.byte	111
  85 000a 01        		.byte	1
  86 000b 40        		.byte	64
  87 000c 08        		.byte	8
  88               	.global	active_led
  89               	.global	active_led
  90               		.section .bss
  93               	active_led:
  94 0000 00        		.skip 1,0
  95               	.global	led_value
  96               	.global	led_value
  99               	led_value:
 100 0001 0000 0000 		.skip 4,0
 101               	.global	decimal_point
 102               	.global	decimal_point
 105               	decimal_point:
 106 0005 00        		.skip 1,0
 107               	.global	mode_setting
 108               	.global	mode_setting
 111               	mode_setting:
 112 0006 00        		.skip 1,0
 113               		.text
 115               	.global	__vector_9
 117               	__vector_9:
   1:countermeter.c **** /*************************************************
   2:countermeter.c **** **
   3:countermeter.c **** ** 本程序根据Jesper的应用例子改编
   4:countermeter.c **** ** 源例子网页:http://www.myplace.nu/avr/countermeasures/index.htm
   5:countermeter.c **** ** CPU        ATmega16
   6:countermeter.c **** ** 晶振频率   4MHz
   7:countermeter.c **** ** 编译环境   AVR Studio 4.12.460  + GCC 3.4.3
   8:countermeter.c **** ** 程序修改   machao
   9:countermeter.c **** ** 时间      2005-12-07
  10:countermeter.c **** **
  11:countermeter.c **** *************************************************/
  12:countermeter.c **** #define COUNTERMETER_C
  13:countermeter.c **** 
  14:countermeter.c **** #include <avr/io.h>
  15:countermeter.c **** #include <avr/signal.h>
  16:countermeter.c **** #include <avr/interrupt.h>
  17:countermeter.c **** #include <stdio.h>
  18:countermeter.c **** #include <stdlib.h>
  19:countermeter.c **** 
  20:countermeter.c **** //定义计数器控制引脚
  21:countermeter.c **** #define CLEAR	PA6
  22:countermeter.c **** #define OE_H	PA5
  23:countermeter.c **** #define	OE_L	PA4
  24:countermeter.c **** 
  25:countermeter.c **** 
  26:countermeter.c **** //#define F_CPU        4000000               		// 晶振频率 4MHz
  27:countermeter.c **** #define CYCLES_PER_US ((F_CPU+500000)/1000000) 	// cpu cycles per microsecond 
  28:countermeter.c **** 
  29:countermeter.c **** 
  30:countermeter.c **** // 数码管显示数据
  31:countermeter.c **** 
  32:countermeter.c **** #define SEG_a	0x01
  33:countermeter.c **** #define SEG_b	0x02
  34:countermeter.c **** #define SEG_c	0x04
  35:countermeter.c **** #define SEG_d	0x08
  36:countermeter.c **** #define SEG_e	0x10
  37:countermeter.c **** #define SEG_f	0x20
  38:countermeter.c **** #define SEG_g	0x40
  39:countermeter.c **** #define SEG_dot	0x80
  40:countermeter.c **** 
  41:countermeter.c **** 
  42:countermeter.c **** unsigned char digits[] = {
  43:countermeter.c **** 	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f),			// 0
  44:countermeter.c **** 	(SEG_b|SEG_c),									// 1
  45:countermeter.c **** 	(SEG_a|SEG_b|SEG_d|SEG_e|SEG_g),				// 2
  46:countermeter.c **** 	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_g),				// 3
  47:countermeter.c **** 	(SEG_b|SEG_c|SEG_c|SEG_f|SEG_g),				// 4
  48:countermeter.c **** 	(SEG_a|SEG_c|SEG_d|SEG_f|SEG_g),				// 5
  49:countermeter.c **** 	(SEG_a|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g),			// 6
  50:countermeter.c **** 	(SEG_a|SEG_b|SEG_c),							// 7
  51:countermeter.c **** 	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g),	// 8
  52:countermeter.c **** 	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_f|SEG_g),			// 9	
  53:countermeter.c **** 	(SEG_a),										// mode 0 indicator	(Hz)
  54:countermeter.c **** 	(SEG_g),										// mode 1 indicator (kHz)
  55:countermeter.c **** 	(SEG_d),										// mode 2 indicator (MHz)
  56:countermeter.c **** };
  57:countermeter.c **** 
  58:countermeter.c **** 
  59:countermeter.c **** /****************************************************************************/
  60:countermeter.c **** 
  61:countermeter.c **** 
  62:countermeter.c **** // timer 0 interrupt handles multiplex and refresh of the displays
  63:countermeter.c **** //定时器T0的溢出中断用于刷新数码管
  64:countermeter.c **** // timer is clocked at 62500 Hz
  65:countermeter.c **** 
  66:countermeter.c **** #define TI0_L		(256-125)		// 500 Hz -> 2 mS
  67:countermeter.c **** 
  68:countermeter.c **** volatile unsigned char 	active_led = 0;  //当前点亮的数码管
  69:countermeter.c **** 
  70:countermeter.c **** volatile unsigned long 	led_value = 0;	// four BCD nibbles
  71:countermeter.c **** volatile unsigned char 	decimal_point = 0;
  72:countermeter.c **** volatile unsigned char 	mode_setting = 0;
  73:countermeter.c **** 
  74:countermeter.c **** 
  75:countermeter.c **** 
  76:countermeter.c **** SIGNAL(SIG_OVERFLOW0)	//定时器T0溢出中断程序(16 uS中断一次)
  77:countermeter.c **** {
 119               	.LM1:
 120               	/* prologue: frame size=2 */
 121 0000 1F92      		push __zero_reg__
 122 0002 0F92      		push __tmp_reg__
 123 0004 0FB6      		in __tmp_reg__,__SREG__
 124 0006 0F92      		push __tmp_reg__
 125 0008 1124      		clr __zero_reg__
 126 000a 2F93      		push r18
 127 000c 3F93      		push r19
 128 000e 4F93      		push r20
 129 0010 5F93      		push r21
 130 0012 6F93      		push r22
 131 0014 7F93      		push r23
 132 0016 8F93      		push r24
 133 0018 9F93      		push r25
 134 001a AF93      		push r26
 135 001c BF93      		push r27
 136 001e EF93      		push r30
 137 0020 FF93      		push r31
 138 0022 CF93      		push r28
 139 0024 DF93      		push r29
 140 0026 CDB7      		in r28,__SP_L__
 141 0028 DEB7      		in r29,__SP_H__
 142 002a 2297      		sbiw r28,2
 143 002c DEBF      		out __SP_H__,r29
 144 002e CDBF      		out __SP_L__,r28
 145               	/* prologue end (size=24) */
  78:countermeter.c **** 	unsigned char a,b;
  79:countermeter.c ****     //重新装载初值
  80:countermeter.c ****     TCNT0 = TI0_L;
 147               	.LM2:
 148 0030 83E8      		ldi r24,lo8(-125)
 149 0032 8093 5200 		sts 82,r24
  81:countermeter.c ****     //关闭所有数码管
  82:countermeter.c ****     PORTA |= 0X07; 
 151               	.LM3:
 152 0036 8091 3B00 		lds r24,59
 153 003a 8760      		ori r24,lo8(7)
 154 003c 8093 3B00 		sts 59,r24
  83:countermeter.c **** 	
  84:countermeter.c **** 	if (active_led == 5)
 156               	.LM4:
 157 0040 8091 0000 		lds r24,active_led
 158 0044 8530      		cpi r24,lo8(5)
 159 0046 49F4      		brne .L2
  85:countermeter.c **** 	{
  86:countermeter.c **** 		b = digits[10 + mode_setting];    //第6为数码管用于模式指示
 161               	.LM5:
 162 0048 8091 0000 		lds r24,mode_setting
 163 004c 9927      		clr r25
 164 004e FC01      		movw r30,r24
 165 0050 E050      		subi r30,lo8(-(digits+10))
 166 0052 F040      		sbci r31,hi8(-(digits+10))
 167 0054 8081      		ld r24,Z
 168 0056 8A83      		std Y+2,r24
 169 0058 38C0      		rjmp .L3
 170               	.L2:
  87:countermeter.c **** 	}
  88:countermeter.c **** 	else
  89:countermeter.c **** 	{
  90:countermeter.c **** 		a = led_value >> (( 4 - active_led ) * 4);
 172               	.LM6:
 173 005a 8091 0000 		lds r24,active_led
 174 005e 282F      		mov r18,r24
 175 0060 3327      		clr r19
 176 0062 84E0      		ldi r24,lo8(4)
 177 0064 90E0      		ldi r25,hi8(4)
 178 0066 821B      		sub r24,r18
 179 0068 930B      		sbc r25,r19
 180 006a 9C01      		movw r18,r24
 181 006c 220F      		lsl r18
 182 006e 331F      		rol r19
 183 0070 220F      		lsl r18
 184 0072 331F      		rol r19
 185 0074 8091 0000 		lds r24,led_value
 186 0078 9091 0000 		lds r25,(led_value)+1
 187 007c A091 0000 		lds r26,(led_value)+2
 188 0080 B091 0000 		lds r27,(led_value)+3
 189 0084 04C0      		rjmp 2f
 190 0086 B695      	1:	lsr r27
 191 0088 A795      		ror r26
 192 008a 9795      		ror r25
 193 008c 8795      		ror r24
 194 008e 2A95      	2:	dec r18
 195 0090 D2F7      		brpl 1b
 196 0092 8983      		std Y+1,r24
  91:countermeter.c **** 	
  92:countermeter.c **** 		b = digits[a & 0x0f];
 198               	.LM7:
 199 0094 8981      		ldd r24,Y+1
 200 0096 9927      		clr r25
 201 0098 8F70      		andi r24,lo8(15)
 202 009a 9070      		andi r25,hi8(15)
 203 009c FC01      		movw r30,r24
 204 009e E050      		subi r30,lo8(-(digits))
 205 00a0 F040      		sbci r31,hi8(-(digits))
 206 00a2 8081      		ld r24,Z
 207 00a4 8A83      		std Y+2,r24
  93:countermeter.c **** 	
  94:countermeter.c **** 		if (decimal_point == (4 - active_led) )
 209               	.LM8:
 210 00a6 8091 0000 		lds r24,decimal_point
 211 00aa 482F      		mov r20,r24
 212 00ac 5527      		clr r21
 213 00ae 8091 0000 		lds r24,active_led
 214 00b2 282F      		mov r18,r24
 215 00b4 3327      		clr r19
 216 00b6 84E0      		ldi r24,lo8(4)
 217 00b8 90E0      		ldi r25,hi8(4)
 218 00ba 821B      		sub r24,r18
 219 00bc 930B      		sbc r25,r19
 220 00be 4817      		cp r20,r24
 221 00c0 5907      		cpc r21,r25
 222 00c2 19F4      		brne .L3
  95:countermeter.c **** 			b |= SEG_dot;
 224               	.LM9:
 225 00c4 8A81      		ldd r24,Y+2
 226 00c6 8068      		ori r24,lo8(-128)
 227 00c8 8A83      		std Y+2,r24
 228               	.L3:
  96:countermeter.c **** 	}
  97:countermeter.c ****     PORTB = b;
 230               	.LM10:
 231 00ca 8A81      		ldd r24,Y+2
 232 00cc 8093 3800 		sts 56,r24
  98:countermeter.c **** 	//设置显示位置			
  99:countermeter.c ****     PORTA = ((PORTA & 0Xf8)|active_led);
 234               	.LM11:
 235 00d0 98EF      		ldi r25,lo8(-8)
 236 00d2 8091 3B00 		lds r24,59
 237 00d6 9823      		and r25,r24
 238 00d8 8091 0000 		lds r24,active_led
 239 00dc 892B      		or r24,r25
 240 00de 8093 3B00 		sts 59,r24
 100:countermeter.c **** 	active_led = (active_led+1) % 6;
 242               	.LM12:
 243 00e2 8091 0000 		lds r24,active_led
 244 00e6 9927      		clr r25
 245 00e8 0196      		adiw r24,1
 246 00ea 26E0      		ldi r18,lo8(6)
 247 00ec 30E0      		ldi r19,hi8(6)
 248 00ee B901      		movw r22,r18
 249 00f0 0E94 0000 		call __divmodhi4
 250 00f4 8093 0000 		sts active_led,r24
 251               	/* epilogue: frame size=2 */
 252 00f8 2296      		adiw r28,2
 253 00fa F894      		cli
 254 00fc DEBF      		out __SP_H__,r29
 255 00fe CDBF      		out __SP_L__,r28
 256 0100 DF91      		pop r29
 257 0102 CF91      		pop r28
 258 0104 FF91      		pop r31
 259 0106 EF91      		pop r30
 260 0108 BF91      		pop r27
 261 010a AF91      		pop r26
 262 010c 9F91      		pop r25
 263 010e 8F91      		pop r24
 264 0110 7F91      		pop r23
 265 0112 6F91      		pop r22
 266 0114 5F91      		pop r21
 267 0116 4F91      		pop r20
 268 0118 3F91      		pop r19
 269 011a 2F91      		pop r18
 270 011c 0F90      		pop __tmp_reg__
 271 011e 0FBE      		out __SREG__,__tmp_reg__
 272 0120 0F90      		pop __tmp_reg__
 273 0122 1F90      		pop __zero_reg__
 274 0124 1895      		reti
 275               	/* epilogue end (size=23) */
 276               	/* function __vector_9 size 148 (101) */
 282               	.Lscope0:
 285               	.global	delay
 287               	delay:
 101:countermeter.c **** }
 102:countermeter.c **** 
 103:countermeter.c **** 
 104:countermeter.c **** 
 105:countermeter.c **** 
 106:countermeter.c **** 
 107:countermeter.c **** /****************************************************************************/
 108:countermeter.c **** /*  helpers  ****************************************************************/
 109:countermeter.c **** /****************************************************************************/
 110:countermeter.c **** 
 111:countermeter.c **** 
 112:countermeter.c **** void delay(unsigned short us) 
 113:countermeter.c **** {
 289               	.LM13:
 290               	/* prologue: frame size=6 */
 291 0126 CF93      		push r28
 292 0128 DF93      		push r29
 293 012a CDB7      		in r28,__SP_L__
 294 012c DEB7      		in r29,__SP_H__
 295 012e 2697      		sbiw r28,6
 296 0130 0FB6      		in __tmp_reg__,__SREG__
 297 0132 F894      		cli
 298 0134 DEBF      		out __SP_H__,r29
 299 0136 0FBE      		out __SREG__,__tmp_reg__
 300 0138 CDBF      		out __SP_L__,r28
 301               	/* prologue end (size=10) */
 302 013a 8983      		std Y+1,r24
 303 013c 9A83      		std Y+2,r25
 114:countermeter.c ****     unsigned short  delay_loops;
 115:countermeter.c ****     register unsigned short  i;
 116:countermeter.c **** 
 117:countermeter.c ****     delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty) 
 305               	.LM14:
 306 013e 8981      		ldd r24,Y+1
 307 0140 9A81      		ldd r25,Y+2
 308 0142 0396      		adiw r24,3
 309 0144 25E0      		ldi r18,lo8(5)
 310 0146 30E0      		ldi r19,hi8(5)
 311 0148 B901      		movw r22,r18
 312 014a 0E94 0000 		call __udivmodhi4
 313 014e CB01      		movw r24,r22
 314 0150 AA27      		clr r26
 315 0152 BB27      		clr r27
 316 0154 6894      		set
 317 0156 12F8      		bld __zero_reg__,3-1
 318 0158 880F      	1:	lsl r24
 319 015a 991F      		rol r25
 320 015c AA1F      		rol r26
 321 015e BB1F      		rol r27
 322 0160 1694      		lsr __zero_reg__
 323 0162 D1F7      		brne 1b
 324 0164 8B83      		std Y+3,r24
 325 0166 9C83      		std Y+4,r25
 118:countermeter.c **** 
 119:countermeter.c **** 	// one loop takes 5 cpu cycles 
 120:countermeter.c ****     for (i=0; i < delay_loops; i++);
 327               	.LM15:
 328 0168 1D82      		std Y+5,__zero_reg__
 329 016a 1E82      		std Y+6,__zero_reg__
 330               	.L6:
 332               	.LM16:
 333 016c 8B81      		ldd r24,Y+3
 334 016e 9C81      		ldd r25,Y+4
 335 0170 2D81      		ldd r18,Y+5
 336 0172 3E81      		ldd r19,Y+6
 337 0174 2817      		cp r18,r24
 338 0176 3907      		cpc r19,r25
 339 0178 30F4      		brsh .L5
 340 017a 8D81      		ldd r24,Y+5
 341 017c 9E81      		ldd r25,Y+6
 342 017e 0196      		adiw r24,1
 343 0180 8D83      		std Y+5,r24
 344 0182 9E83      		std Y+6,r25
 345 0184 F3CF      		rjmp .L6
 346               	.L5:
 347               	/* epilogue: frame size=6 */
 348 0186 2696      		adiw r28,6
 349 0188 0FB6      		in __tmp_reg__,__SREG__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -