📄 tc0_counter.lst
字号:
__text_start:
__start:
0008 E5CF LDI R28,0x5F
0009 E0D2 LDI R29,2
000A BFCD OUT 0x3D,R28
000B BFDE OUT 0x3E,R29
000C 51C0 SUBI R28,0x10
000D 40D0 SBCI R29,0
000E EA0A LDI R16,0xAA
000F 8308 STD Y+0,R16
0010 2400 CLR R0
0011 E7E0 LDI R30,0x70
0012 E0F0 LDI R31,0
0013 E010 LDI R17,0
0014 37E0 CPI R30,0x70
0015 07F1 CPC R31,R17
0016 F011 BEQ 0x0019
0017 9201 ST R0,Z+
0018 CFFB RJMP 0x0014
0019 8300 STD Z+0,R16
001A E0E0 LDI R30,0
001B E0F0 LDI R31,0
001C E6A0 LDI R26,0x60
001D E0B0 LDI R27,0
001E E010 LDI R17,0
001F 31E0 CPI R30,0x10
0020 07F1 CPC R31,R17
0021 F021 BEQ 0x0026
0022 95C8 LPM
0023 9631 ADIW R30,1
0024 920D ST R0,X+
0025 CFF9 RJMP 0x001F
0026 D060 RCALL _main
_exit:
0027 CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
0028 D0CF RCALL push_gset1
FILE: C:\DOCUME~1\Administrator\桌面\张军\AVR\AVR单片机系统开发实例稿\第二章\第二章程序\定时计数器的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--)
0029 C00A RJMP 0x0034
(0016) {for(j=8000;j!=0;j--) {;}}
002A E440 LDI R20,0x40
002B E15F LDI R21,0x1F
002C C002 RJMP 0x002F
002D 5041 SUBI R20,1
002E 4050 SBCI R21,0
002F 3040 CPI R20,0
0030 0745 CPC R20,R21
0031 F7D9 BNE 0x002D
0032 5001 SUBI R16,1
0033 4010 SBCI R17,0
0034 3000 CPI R16,0
0035 0701 CPC R16,R17
0036 F799 BNE 0x002A
(0017) }
0037 D0C3 RCALL pop_gset1
0038 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
0039 D0D8 RCALL push_gset3
003A 2EA0 MOV R10,R16
003B 2EB1 MOV R11,R17
(0018)
(0019) void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
(0020) {uchar i,sel=0x01;
003C E041 LDI R20,1
(0021) for(i=0;i<4;i++)
003D 2766 CLR R22
003E C012 RJMP 0x0051
(0022) {PORTC=sel; //选通最右边的数码管
003F BB45 OUT 0x15,R20
(0023) PORTA=Table[p[i]]; //送字型码
0040 2FE6 MOV R30,R22
0041 27FF CLR R31
0042 0DEA ADD R30,R10
0043 1DFB ADC R31,R11
0044 81E0 LDD R30,Z+0
0045 27FF CLR R31
0046 E680 LDI R24,0x60
0047 E090 LDI R25,0
0048 0FE8 ADD R30,R24
0049 1FF9 ADC R31,R25
004A 8020 LDD R2,Z+0
004B BA2B OUT 0x1B,R2
(0024) DelayMs(2); //显示延时
004C E002 LDI R16,2
004D E010 LDI R17,0
004E DFD9 RCALL _DelayMs
(0025) sel=sel<<1; //移位以显示前一位
004F 0F44 LSL R20
0050 9563 INC R22
0051 3064 CPI R22,4
0052 F360 BCS 0x003F
(0026) }
(0027) }
0053 D0A2 RCALL pop_gset3
0054 9508 RET
_Process:
p --> R22
i --> R20
0055 D0B9 RCALL push_gset2
0056 2F62 MOV R22,R18
0057 2F73 MOV R23,R19
0058 2F40 MOV R20,R16
(0028)
(0029) //计数值处理函数。参数i:计数值;参数p:处理数据存放的数组名//
(0030) //功能:此函数用于将计数值拆分为BCD码的千,百,十,一数据,用于查表显示//
(0031) void Process(uchar i,uchar *p)
(0032) {p[0]=i/1000;
0059 EE28 LDI R18,0xE8
005A E033 LDI R19,3
005B 2F04 MOV R16,R20
005C 2711 CLR R17
005D D049 RCALL div16s
005E 2FE6 MOV R30,R22
005F 2FF7 MOV R31,R23
0060 8300 STD Z+0,R16
(0033) i=i%1000;
0061 EE28 LDI R18,0xE8
0062 E033 LDI R19,3
0063 2F04 MOV R16,R20
0064 2711 CLR R17
0065 D03D RCALL mod16s
0066 2F40 MOV R20,R16
(0034) p[1]=i/100;
0067 E614 LDI R17,0x64
0068 D075 RCALL div8u
0069 2FE6 MOV R30,R22
006A 2FF7 MOV R31,R23
006B 8301 STD Z+1,R16
(0035) i=i%100;
006C E614 LDI R17,0x64
006D 2F04 MOV R16,R20
006E D06D RCALL mod8u
006F 2F40 MOV R20,R16
(0036) p[2]=i/10;
0070 E01A LDI R17,0xA
0071 D06C RCALL div8u
0072 2FE6 MOV R30,R22
0073 2FF7 MOV R31,R23
0074 8302 STD Z+2,R16
(0037) i=i%10;
0075 E01A LDI R17,0xA
0076 2F04 MOV R16,R20
0077 D064 RCALL mod8u
0078 2F40 MOV R20,R16
(0038) p[3]=i;
0079 2FE6 MOV R30,R22
007A 2FF7 MOV R31,R23
007B 8343 STD Z+3,R20
(0039) }
007C D077 RCALL pop_gset2
007D 9508 RET
(0040)
(0041) void Init_IO(void) //初始化I/O口
(0042) {DDRA=0xff; //设置A口为推挽1输出
_Init_IO:
007E EF8F LDI R24,0xFF
007F BB8A OUT 0x1A,R24
(0043) PORTA=0xff;
0080 BB8B OUT 0x1B,R24
(0044) DDRB=0x00; //设置B口为不带上拉电阻输入
0081 2422 CLR R2
0082 BA27 OUT 0x17,R2
(0045) PORTB=0x00;
0083 BA28 OUT 0x18,R2
(0046) DDRC=0xff; //设置C口为推挽1输出;
0084 BB84 OUT 0x14,R24
(0047) PORTC=0xff;
0085 BB85 OUT 0x15,R24
(0048) }
0086 9508 RET
(0049)
(0050) void main(void)
(0051) {uchar Load;
(0052) Init_IO(); //初始化I/O口
_main:
Load --> R20
0087 DFF6 RCALL _Init_IO
(0053) PORTA=0xff; //点亮以测试所有的数码管
0088 EF8F LDI R24,0xFF
0089 BB8B OUT 0x1B,R24
(0054) PORTC=0x00;
008A 2422 CLR R2
008B BA25 OUT 0x15,R2
(0055) DelayMs(3000); //延时
008C EB08 LDI R16,0xB8
008D E01B LDI R17,0xB
008E DF99 RCALL _DelayMs
(0056) PORTC=0xff; //熄灭所有的数码管
008F EF8F LDI R24,0xFF
0090 BB85 OUT 0x15,R24
(0057) TCCR0=0x06; //T/C0工作于计数方式,下降沿计数
0091 E086 LDI R24,6
0092 BF83 OUT 0x33,R24
(0058) TCNT0=CNT; //计数初始值0
0093 9020006E LDS R2,0x6E
0095 9030006F LDS R3,0x6F
0097 BE22 OUT 0x32,R2
0098 C008 RJMP 0x00A1
(0059) while(1)
(0060) {Load=TCNT0;
0099 B742 IN R20,0x32
(0061) Process(Load,Data); //计数值处理
009A E62A LDI R18,0x6A
009B E030 LDI R19,0
009C 2F04 MOV R16,R20
009D DFB7 RCALL _Process
(0062) Display(Data); //动态扫描显示
009E E60A LDI R16,0x6A
009F E010 LDI R17,0
00A0 DF98 RCALL _Display
00A1 CFF7 RJMP 0x0099
(0063) }
(0064) }
FILE: <library>
00A2 9508 RET
mod16s:
00A3 9468 BSET 6
00A4 92DA ST R13,-Y
00A5 2ED1 MOV R13,R17
00A6 C004 RJMP 0x00AB
div16s:
00A7 94E8 BCLR 6
00A8 92DA ST R13,-Y
00A9 2ED1 MOV R13,R17
00AA 26D3 EOR R13,R19
00AB FF17 SBRS R17,7
00AC C004 RJMP 0x00B1
00AD 9510 COM R17
00AE 9500 COM R16
00AF 5F0F SUBI R16,0xFF
00B0 4F1F SBCI R17,0xFF
00B1 FF37 SBRS R19,7
00B2 C004 RJMP 0x00B7
00B3 9530 COM R19
00B4 9520 COM R18
00B5 5F2F SUBI R18,0xFF
00B6 4F3F SBCI R19,0xFF
00B7 D00B RCALL xdiv16u
00B8 FED7 SBRS R13,7
00B9 C004 RJMP 0x00BE
00BA 9510 COM R17
00BB 9500 COM R16
00BC 5F0F SUBI R16,0xFF
00BD 4F1F SBCI R17,0xFF
00BE 90D9 LD R13,Y+
00BF 9508 RET
mod16u:
00C0 9468 BSET 6
00C1 C001 RJMP xdiv16u
div16u:
00C2 94E8 BCLR 6
xdiv16u:
00C3 92EA ST R14,-Y
00C4 92FA ST R15,-Y
00C5 938A ST R24,-Y
00C6 24EE CLR R14
00C7 24FF CLR R15
00C8 E180 LDI R24,0x10
00C9 0F00 LSL R16
00CA 1F11 ROL R17
00CB 1CEE ROL R14
00CC 1CFF ROL R15
00CD 16E2 CP R14,R18
00CE 06F3 CPC R15,R19
00CF F018 BCS 0x00D3
00D0 1AE2 SUB R14,R18
00D1 0AF3 SBC R15,R19
00D2 9503 INC R16
00D3 958A DEC R24
00D4 F7A1 BNE 0x00C9
00D5 F416 BRTC 0x00D8
00D6 2D0E MOV R16,R14
00D7 2D1F MOV R17,R15
00D8 9189 LD R24,Y+
00D9 90F9 LD R15,Y+
00DA 90E9 LD R14,Y+
00DB 9508 RET
mod8u:
00DC 9468 BSET 6
00DD C001 RJMP xdiv8u
div8u:
00DE 94E8 BCLR 6
xdiv8u:
00DF 932A ST R18,-Y
00E0 92FA ST R15,-Y
00E1 92EA ST R14,-Y
00E2 24FF CLR R15
00E3 24EE CLR R14
00E4 E120 LDI R18,0x10
00E5 0F00 LSL R16
00E6 1CFF ROL R15
00E7 1CEE ROL R14
00E8 16E1 CP R14,R17
00E9 F010 BCS 0x00EC
00EA 1AE1 SUB R14,R17
00EB 9503 INC R16
00EC 952A DEC R18
00ED F7B9 BNE 0x00E5
00EE F40E BRTC 0x00F0
00EF 2D0E MOV R16,R14
00F0 90E9 LD R14,Y+
00F1 90F9 LD R15,Y+
00F2 9129 LD R18,Y+
00F3 9508 RET
pop_gset2:
00F4 E0E2 LDI R30,2
00F5 C006 RJMP pop
pop_gset3:
00F6 E0E4 LDI R30,4
00F7 C004 RJMP pop
push_gset1:
00F8 935A ST R21,-Y
00F9 934A ST R20,-Y
00FA 9508 RET
pop_gset1:
00FB E0E1 LDI R30,1
pop:
00FC 9149 LD R20,Y+
00FD 9159 LD R21,Y+
00FE FDE0 SBRC R30,0
00FF 9508 RET
0100 9169 LD R22,Y+
0101 9179 LD R23,Y+
0102 FDE1 SBRC R30,1
0103 9508 RET
0104 90A9 LD R10,Y+
0105 90B9 LD R11,Y+
0106 FDE2 SBRC R30,2
0107 9508 RET
0108 90C9 LD R12,Y+
0109 90D9 LD R13,Y+
010A FDE3 SBRC R30,3
010B 9508 RET
010C 90E9 LD R14,Y+
010D 90F9 LD R15,Y+
010E 9508 RET
push_gset2:
010F 937A ST R23,-Y
0110 936A ST R22,-Y
0111 CFE6 RJMP push_gset1
push_gset3:
0112 92BA ST R11,-Y
0113 92AA ST R10,-Y
0114 CFFA RJMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -