📄 12.lst
字号:
__start:
__text_start:
22 EFCF LDI R28,0xFF
23 E0D2 LDI R29,2
24 BFCD OUT 0x3D,R28
25 BFDE OUT 0x3E,R29
26 51CE SUBI R28,0x1E
27 40D0 SBCI R29,0
28 EA0A LDI R16,0xAA
29 8308 STD Y+0,R16
2A 2400 CLR R0
2B E1E0 LDI R30,0x10
2C E0F1 LDI R31,1
2D E011 LDI R17,1
2E 31E0 CPI R30,0x10
2F 07F1 CPC R31,R17
30 F011 BEQ 0x0033
31 9201 ST R0,Z+
32 CFFB RJMP 0x002E
33 8300 STD Z+0,R16
34 E3E4 LDI R30,0x34
35 E0F0 LDI R31,0
36 E0A0 LDI R26,0
37 E0B1 LDI R27,1
38 E010 LDI R17,0
39 E000 LDI R16,0
3A BF0B OUT 0x3B,R16
3B 34E4 CPI R30,0x44
3C 07F1 CPC R31,R17
3D F021 BEQ 0x0042
3E 95C8 LPM
3F 9631 ADIW R30,1
40 920D ST R0,X+
41 CFF9 RJMP 0x003B
42 D05A RCALL _main
_exit:
43 CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
44 934A ST R20,-Y
45 935A ST R21,-Y
FILE: G:\avr祥例·附原理图,及源代码c语言·\AVR单片机应用系统开发典型实例\实例源文件\第2章程序\定时计数器的c语言编程\基于tc0的计数器设计\Counter.c
(0001) //******************************FileName: Counter.C*************************//
(0002) //******************************ICCAVR V6.30编译***************************//
(0003)
(0004) #include <io8535v.h>
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007)
(0008) //数码管字型表,对应0,1,2,3,4,5,6,7,8,9//
(0009) uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0010) uchar Data[4]={0,0,0,0}; //显示初始值:0 0 0 0
(0011) uint CNT=0; //初始计数值:0
(0012)
(0013) void DelayMs(uint i) //Ms级延时,参数i为延时时间
(0014) {uint j;
(0015) for(;i!=0;i--)
46 C00A RJMP 0x0051
(0016) {for(j=8000;j!=0;j--) {;}}
47 E440 LDI R20,0x40
48 E15F LDI R21,0x1F
49 C002 RJMP 0x004C
4A 5041 SUBI R20,1
4B 4050 SBCI R21,0
4C 3040 CPI R20,0
4D 0745 CPC R20,R21
4E F7D9 BNE 0x004A
4F 5001 SUBI R16,1
50 4010 SBCI R17,0
51 3000 CPI R16,0
52 0701 CPC R16,R17
53 F799 BNE 0x0047
54 9159 LD R21,Y+
55 9149 LD R20,Y+
56 9508 RET
_Display:
sel --> R22
i --> R20
p --> R10
57 D0BC RCALL push_xgsetF00C
58 0158 MOVW R10,R16
(0017) }
(0018)
(0019) void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
(0020) {uchar i,sel=0x01;
59 E061 LDI R22,1
(0021) for(i=0;i<4;i++)
5A 2744 CLR R20
5B C012 RJMP 0x006E
(0022) {PORTC=sel; //选通最右边的数码管
5C BB65 OUT 0x15,R22
(0023) PORTA=Table[p[i]]; //送字型码
5D 2FE4 MOV R30,R20
5E 27FF CLR R31
5F 0DEA ADD R30,R10
60 1DFB ADC R31,R11
61 81E0 LDD R30,Z+0
62 27FF CLR R31
63 E080 LDI R24,0
64 E091 LDI R25,1
65 0FE8 ADD R30,R24
66 1FF9 ADC R31,R25
67 8020 LDD R2,Z+0
68 BA2B OUT 0x1B,R2
(0024) DelayMs(2); //显示延时
69 E002 LDI R16,2
6A E010 LDI R17,0
6B DFD8 RCALL _DelayMs
(0025) sel=sel<<1; //移位以显示前一位
6C 0F66 LSL R22
6D 9543 INC R20
6E 3044 CPI R20,4
6F F360 BCS 0x005C
70 C0AA RJMP pop_xgsetF00C
_Process:
p --> R20
i --> R10
71 D098 RCALL push_xgset300C
72 01A9 MOVW R20,R18
73 2EA0 MOV R10,R16
(0026) }
(0027) }
(0028)
(0029) //计数值处理函数。参数i:计数值;参数p:处理数据存放的数组名//
(0030) //功能:此函数用于将计数值拆分为BCD码的千,百,十,一数据,用于查表显示//
(0031) void Process(uchar i,uchar *p)
(0032) {p[0]=i/1000;
74 EE28 LDI R18,0xE8
75 E033 LDI R19,3
76 2D0A MOV R16,R10
77 2711 CLR R17
78 D044 RCALL div16s
79 01FA MOVW R30,R20
7A 8300 STD Z+0,R16
(0033) i=i%1000;
7B EE28 LDI R18,0xE8
7C E033 LDI R19,3
7D 2D0A MOV R16,R10
7E 2711 CLR R17
7F D039 RCALL mod16s
80 0158 MOVW R10,R16
(0034) p[1]=i/100;
81 E614 LDI R17,0x64
82 D071 RCALL div8u
83 01FA MOVW R30,R20
84 8301 STD Z+1,R16
(0035) i=i%100;
85 E614 LDI R17,0x64
86 2D0A MOV R16,R10
87 D06A RCALL mod8u
88 2EA0 MOV R10,R16
(0036) p[2]=i/10;
89 E01A LDI R17,0xA
8A D069 RCALL div8u
8B 01FA MOVW R30,R20
8C 8302 STD Z+2,R16
(0037) i=i%10;
8D E01A LDI R17,0xA
8E 2D0A MOV R16,R10
8F D062 RCALL mod8u
90 2EA0 MOV R10,R16
(0038) p[3]=i;
91 01FA MOVW R30,R20
92 82A3 STD Z+3,R10
93 C07B RJMP pop_xgset300C
(0039) }
(0040)
(0041) void Init_IO(void) //初始化I/O口
(0042) {DDRA=0xff; //设置A口为推挽1输出
_Init_IO:
94 EF8F LDI R24,0xFF
95 BB8A OUT 0x1A,R24
(0043) PORTA=0xff;
96 BB8B OUT 0x1B,R24
(0044) DDRB=0x00; //设置B口为不带上拉电阻输入
97 2422 CLR R2
98 BA27 OUT 0x17,R2
(0045) PORTB=0x00;
99 BA28 OUT 0x18,R2
(0046) DDRC=0xff; //设置C口为推挽1输出;
9A BB84 OUT 0x14,R24
(0047) PORTC=0xff;
9B BB85 OUT 0x15,R24
9C 9508 RET
(0048) }
(0049)
(0050) void main(void)
(0051) {uchar Load;
(0052) Init_IO(); //初始化I/O口
_main:
Load --> R10
9D DFF6 RCALL _Init_IO
(0053) PORTA=0xff; //点亮以测试所有的数码管
9E EF8F LDI R24,0xFF
9F BB8B OUT 0x1B,R24
(0054) PORTC=0x00;
A0 2422 CLR R2
A1 BA25 OUT 0x15,R2
(0055) DelayMs(3000); //延时
A2 EB08 LDI R16,0xB8
A3 E01B LDI R17,0xB
A4 DF9F RCALL _DelayMs
(0056) PORTC=0xff; //熄灭所有的数码管
A5 EF8F LDI R24,0xFF
A6 BB85 OUT 0x15,R24
(0057) TCCR0=0x06; //T/C0工作于计数方式,下降沿计数
A7 E086 LDI R24,6
A8 BF83 OUT 0x33,R24
(0058) TCNT0=CNT; //计数初始值0
A9 9020 010E LDS R2,CNT
AB 9030 010F LDS R3,CNT+1
AD BE22 OUT 0x32,R2
AE C008 RJMP 0x00B7
(0059) while(1)
(0060) {Load=TCNT0;
AF B6A2 IN R10,0x32
(0061) Process(Load,Data); //计数值处理
B0 E02A LDI R18,0xA
B1 E031 LDI R19,1
B2 2D0A MOV R16,R10
B3 DFBD RCALL _Process
(0062) Display(Data); //动态扫描显示
FILE: <library>
B4 E00A LDI R16,0xA
B5 E011 LDI R17,1
B6 DFA0 RCALL _Display
B7 CFF7 RJMP 0x00AF
B8 9508 RET
mod16s:
B9 9468 BSET 6
BA 92DA ST R13,-Y
BB 2ED1 MOV R13,R17
BC C004 RJMP 0x00C1
div16s:
BD 94E8 BCLR 6
BE 92DA ST R13,-Y
BF 2ED1 MOV R13,R17
C0 26D3 EOR R13,R19
C1 FF17 SBRS R17,7
C2 C004 RJMP 0x00C7
C3 9510 COM R17
C4 9500 COM R16
C5 5F0F SUBI R16,0xFF
C6 4F1F SBCI R17,0xFF
C7 FF37 SBRS R19,7
C8 C004 RJMP 0x00CD
C9 9530 COM R19
CA 9520 COM R18
CB 5F2F SUBI R18,0xFF
CC 4F3F SBCI R19,0xFF
CD D00B RCALL xdiv16u
CE FED7 SBRS R13,7
CF C004 RJMP 0x00D4
D0 9510 COM R17
D1 9500 COM R16
D2 5F0F SUBI R16,0xFF
D3 4F1F SBCI R17,0xFF
D4 90D9 LD R13,Y+
D5 9508 RET
mod16u:
D6 9468 BSET 6
D7 C001 RJMP xdiv16u
div16u:
D8 94E8 BCLR 6
xdiv16u:
D9 92EA ST R14,-Y
DA 92FA ST R15,-Y
DB 938A ST R24,-Y
DC 24EE CLR R14
DD 24FF CLR R15
DE E180 LDI R24,0x10
DF 0F00 LSL R16
E0 1F11 ROL R17
E1 1CEE ROL R14
E2 1CFF ROL R15
E3 16E2 CP R14,R18
E4 06F3 CPC R15,R19
E5 F018 BCS 0x00E9
E6 1AE2 SUB R14,R18
E7 0AF3 SBC R15,R19
E8 9503 INC R16
E9 958A DEC R24
EA F7A1 BNE 0x00DF
EB F416 BRTC 0x00EE
EC 2D0E MOV R16,R14
ED 2D1F MOV R17,R15
EE 9189 LD R24,Y+
EF 90F9 LD R15,Y+
F0 90E9 LD R14,Y+
F1 9508 RET
mod8u:
F2 9468 BSET 6
F3 C001 RJMP xdiv8u
div8u:
F4 94E8 BCLR 6
xdiv8u:
F5 932A ST R18,-Y
F6 92FA ST R15,-Y
F7 92EA ST R14,-Y
F8 24FF CLR R15
F9 24EE CLR R14
FA E120 LDI R18,0x10
FB 0F00 LSL R16
FC 1CFF ROL R15
FD 1CEE ROL R14
FE 16E1 CP R14,R17
FF F010 BCS 0x0102
100 1AE1 SUB R14,R17
101 9503 INC R16
102 952A DEC R18
103 F7B9 BNE 0x00FB
104 F40E BRTC 0x0106
105 2D0E MOV R16,R14
106 90E9 LD R14,Y+
107 90F9 LD R15,Y+
108 9129 LD R18,Y+
109 9508 RET
push_xgset300C:
10A 935A ST R21,-Y
10B 934A ST R20,-Y
10C 92BA ST R11,-Y
10D 92AA ST R10,-Y
10E 9508 RET
pop_xgset300C:
10F 90A9 LD R10,Y+
110 90B9 LD R11,Y+
111 9149 LD R20,Y+
112 9159 LD R21,Y+
113 9508 RET
push_xgsetF00C:
114 937A ST R23,-Y
115 936A ST R22,-Y
116 935A ST R21,-Y
117 934A ST R20,-Y
118 92BA ST R11,-Y
119 92AA ST R10,-Y
11A 9508 RET
pop_xgsetF00C:
11B 90A9 LD R10,Y+
11C 90B9 LD R11,Y+
11D 9149 LD R20,Y+
11E 9159 LD R21,Y+
11F 9169 LD R22,Y+
120 9179 LD R23,Y+
121 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -