📄 tc0counter.lst
字号:
1 .file "TC0counter.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:
53 .global CNT
54 .global CNT
55 .section .bss
58 CNT:
59 0000 0000 .skip 2,0
60 .global Data
61 .global Data
64 Data:
65 0002 0000 0000 .skip 8,0
65 0000 0000
66 .global Table
67 .data
70 Table:
71 0000 3F .byte 63
72 0001 06 .byte 6
73 0002 5B .byte 91
74 0003 4F .byte 79
75 0004 66 .byte 102
76 0005 6D .byte 109
77 0006 7D .byte 125
78 0007 07 .byte 7
79 0008 7F .byte 127
80 0009 6F .byte 111
81 .text
84 .global Display
86 Display:
1:TC0counter.c **** //**********基于TC0的计数器设计___TC0工作在计数方式模式***************//
2:TC0counter.c **** //****************WINAVR2005版本,系统时钟为8MHz**********************//
3:TC0counter.c ****
4:TC0counter.c **** #include<avr/io.h>
5:TC0counter.c **** #include<avr/delay.h>
6:TC0counter.c **** #include<avr/interrupt.h>
7:TC0counter.c **** #include<avr/signal.h>
8:TC0counter.c ****
9:TC0counter.c **** #define uchar unsigned char
10:TC0counter.c **** #define uint unsigned int
11:TC0counter.c ****
12:TC0counter.c **** uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
13:TC0counter.c **** uint Data[4]={0,0,0,0}; //显示初始值:1234
14:TC0counter.c **** uint CNT=0; //初始计数值1234
15:TC0counter.c **** uchar Key_Up; //加计数按键标志
16:TC0counter.c **** uchar Key_Down; //减计数按键标志
17:TC0counter.c ****
18:TC0counter.c ****
19:TC0counter.c **** void Display(uint *p) //动态显示函数,参数p为待显示的数组名
20:TC0counter.c **** {
88 .LM1:
89 /* prologue: frame size=0 */
90 /* prologue end (size=0) */
21:TC0counter.c **** uchar i,sel=0x01;
92 .LM2:
93 0000 71E0 ldi r23,lo8(1)
94 0002 20EA ldi r18,lo8(4000)
95 0004 3FE0 ldi r19,hi8(4000)
96 0006 40E0 ldi r20,hlo8(4000)
97 0008 50E0 ldi r21,hhi8(4000)
98 000a 63E0 ldi r22,lo8(3)
99 000c DC01 movw r26,r24
100 .L13:
22:TC0counter.c **** for(i=0;i<4;i++)
23:TC0counter.c **** {
24:TC0counter.c **** PORTC=~sel; //选通最右边的数码管
102 .LM3:
103 000e 872F mov r24,r23
104 0010 8095 com r24
105 0012 85BB out 53-0x20,r24
25:TC0counter.c **** PORTA=Table[p[i]]; //送字型码
107 .LM4:
108 0014 ED91 ld r30,X+
109 0016 FD91 ld r31,X+
110 0018 E050 subi r30,lo8(-(Table))
111 001a F040 sbci r31,hi8(-(Table))
112 001c 8081 ld r24,Z
113 001e 8BBB out 59-0x20,r24
114 .LBB2:
115 .LBB3:
116 .LBB4:
117 .LBB5:
119 .Ltext1:
1:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /* Copyright (c) 2002, Marek Michalkiewicz
2:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Copyright (c) 2004, Joerg Wunsch
3:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** All rights reserved.
4:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
5:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Redistribution and use in source and binary forms, with or without
6:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** modification, are permitted provided that the following conditions are met:
7:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
8:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** * Redistributions of source code must retain the above copyright
9:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** notice, this list of conditions and the following disclaimer.
10:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
11:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** * Redistributions in binary form must reproduce the above copyright
12:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** notice, this list of conditions and the following disclaimer in
13:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** the documentation and/or other materials provided with the
14:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** distribution.
15:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
16:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** * Neither the name of the copyright holders nor the names of
17:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** contributors may be used to endorse or promote products derived
18:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** from this software without specific prior written permission.
19:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
20:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** POSSIBILITY OF SUCH DAMAGE. */
31:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
32:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /* $Id: delay.h,v 1.9 2004/12/22 10:16:54 joerg_wunsch Exp $ */
33:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
34:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /*
35:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** avr/delay.h - loops for small accurate delays
36:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
37:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
38:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #ifndef _AVR_DELAY_H_
39:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #define _AVR_DELAY_H_ 1
40:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
41:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #include <inttypes.h>
42:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
43:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /** \defgroup avr_delay Busy-wait delay loops
44:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** \code
45:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #define F_CPU 1000000UL // 1 MHz
46:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** //#define F_CPU 14.7456E6
47:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** #include <avr/delay.h>
48:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** \endcode
49:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
50:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** The functions in this header file implement simple delay loops
51:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** that perform a busy-waiting. They are typically used to
52:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** facilitate short delays in the program execution. They are
53:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** implemented as count-down loops with a well-known CPU cycle
54:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** count per loop iteration. As such, no other processing can
55:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** occur simultaneously. It should be kept in mind that the
56:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** functions described here do not disable interrupts.
57:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
58:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** In general, for long delays, the use of hardware timers is
59:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** much preferrable, as they free the CPU, and allow for
60:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** concurrent processing of other events while the timer is
61:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** running. However, in particular for very short delays, the
62:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** overhead of setting up a hardware timer is too much compared
63:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** to the overall delay time.
64:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
65:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Two inline functions are provided for the actual delay algorithms.
66:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
67:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Two wrapper functions allow the specification of microsecond, and
68:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** millisecond delays directly, using the application-supplied macro
69:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** F_CPU as the CPU clock frequency (in Hertz). These functions
70:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** operate on double typed arguments, however when optimization is
71:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** turned on, the entire floating-point calculation will be done at
72:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** compile-time.
73:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
74:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
75:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /** \ingroup avr_delay
76:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
77:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Delay loop using an 8-bit counter \c __count, so up to 256
78:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** iterations are possible. (The value 256 would have to be passed
79:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** as 0.) The loop executes three CPU cycles per iteration, not
80:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** including the overhead the compiler needs to setup the counter
81:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** register.
82:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
83:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
84:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** can be achieved.
85:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
86:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** static __inline__ void
87:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** _delay_loop_1(uint8_t __count)
88:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** {
89:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** __asm__ volatile (
90:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** "1: dec %0" "\n\t"
91:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** "brne 1b"
92:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** : "=r" (__count)
93:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** : "0" (__count)
94:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** );
95:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** }
96:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
97:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** /** \ingroup avr_delay
98:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
99:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Delay loop using a 16-bit counter \c __count, so up to 65536
100:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** iterations are possible. (The value 65536 would have to be
101:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** passed as 0.) The loop executes four CPU cycles per iteration,
102:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** not including the overhead the compiler requires to setup the
103:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** counter register pair.
104:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h ****
105:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
106:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** milliseconds can be achieved.
107:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** */
108:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** static __inline__ void
109:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** _delay_loop_2(uint16_t __count)
110:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** {
111:C:/electrotic/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h **** __asm__ volatile (
121 .LM5:
122 0020 C901 movw r24,r18
123 /* #APP */
124 0022 0197 1: sbiw r24,1
125 0024 F1F7 brne 1b
126 /* #NOAPP */
127 .LBE5:
128 .LBE4:
129 .LBE3:
130 .LBE2:
132 .Ltext2:
26:TC0counter.c **** _delay_ms(2); //显示延时
27:TC0counter.c **** sel=sel<<1; //移位以显示前一位
134 .LM6:
135 0026 770F lsl r23
137 .LM7:
138 0028 6150 subi r22,lo8(-(-1))
139 002a 67FF sbrs r22,7
140 002c F0CF rjmp .L13
141 /* epilogue: frame size=0 */
142 002e 0895 ret
143 /* epilogue end (size=1) */
144 /* function Display size 26 (25) */
153 .Lscope0:
157 .global Process
159 Process:
28:TC0counter.c **** }
29:TC0counter.c **** }
30:TC0counter.c ****
31:TC0counter.c ****
32:TC0counter.c **** //******************************计数值处理函数******************************
33:TC0counter.c **** //功能:此函数用于将计数值拆分为BCD码的千,百,十,一数据,用于查表显示//
34:TC0counter.c **** //参数说明:参数i:计数值;参数p:处理数据存放的数组名//
35:TC0counter.c ****
36:TC0counter.c ****
37:TC0counter.c **** void Process(uint i,uint *p)
38:TC0counter.c **** {
161 .LM8:
162 /* prologue: frame size=0 */
163 0030 0F93 push r16
164 0032 1F93 push r17
165 0034 CF93 push r28
166 0036 DF93 push r29
167 /* prologue end (size=4) */
168 0038 FC01 movw r30,r24
169 003a 8B01 movw r16,r22
39:TC0counter.c **** p[0]=i/1000;
171 .LM9:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -