📄 tc01.lst
字号:
__text_start:
__start:
001B E5CF LDI R28,0x5F
001C E0D4 LDI R29,4
001D BFCD OUT 0x3D,R28
001E BFDE OUT 0x3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD Y+0,R16
0023 2400 CLR R0
0024 E7E0 LDI R30,0x70
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 37E0 CPI R30,0x70
0028 07F1 CPC R31,R17
0029 F011 BEQ 0x002C
002A 9201 ST R0,Z+
002B CFFB RJMP 0x0027
002C 8300 STD Z+0,R16
002D E2E6 LDI R30,0x26
002E E0F0 LDI R31,0
002F E6A0 LDI R26,0x60
0030 E0B0 LDI R27,0
0031 E010 LDI R17,0
0032 33E6 CPI R30,0x36
0033 07F1 CPC R31,R17
0034 F021 BEQ 0x0039
0035 95C8 LPM
0036 9631 ADIW R30,1
0037 920D ST R0,X+
0038 CFF9 RJMP 0x0032
0039 D05C RCALL _main
_exit:
003A CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
003B D0D3 RCALL push_gset1
FILE: F:\mega8\icc\TCO1\TCO1.C
(0001) //******************************FileName: Counter.C*************************//
(0002) //******************************ICCAVR V6.30编译***************************//
(0003)
(0004) #include <iom8v.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--)
003C C00A RJMP 0x0047
(0016) {for(j=800;j!=0;j--) {;}}
003D E240 LDI R20,0x20
003E E053 LDI R21,3
003F C002 RJMP 0x0042
0040 5041 SUBI R20,1
0041 4050 SBCI R21,0
0042 3040 CPI R20,0
0043 0745 CPC R20,R21
0044 F7D9 BNE 0x0040
0045 5001 SUBI R16,1
0046 4010 SBCI R17,0
0047 3000 CPI R16,0
0048 0701 CPC R16,R17
0049 F799 BNE 0x003D
004A D0C7 RCALL pop_gset1
004B 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
004C D0BE RCALL push_gset3
004D 0158 MOVW R10,R16
(0017) }
(0018)
(0019) void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
(0020) {uchar i,sel=0x01;
004E E041 LDI R20,1
(0021) for(i=0;i<4;i++)
004F 2766 CLR R22
0050 C014 RJMP 0x0065
(0022) {PORTC=~sel; //选通最右边的数码管
0051 2E24 MOV R2,R20
0052 9420 COM R2
0053 BA25 OUT 0x15,R2
(0023) PORTD=Table[p[i]]; //送字型码
0054 2FE6 MOV R30,R22
0055 27FF CLR R31
0056 0DEA ADD R30,R10
0057 1DFB ADC R31,R11
0058 81E0 LDD R30,Z+0
0059 27FF CLR R31
005A E680 LDI R24,0x60
005B E090 LDI R25,0
005C 0FE8 ADD R30,R24
005D 1FF9 ADC R31,R25
005E 8020 LDD R2,Z+0
005F BA22 OUT 0x12,R2
(0024) DelayMs(2); //显示延时
0060 E002 LDI R16,2
0061 E010 LDI R17,0
0062 DFD8 RCALL _DelayMs
(0025) sel=sel<<1; //移位以显示前一位
0063 0F44 LSL R20
0064 9563 INC R22
0065 3064 CPI R22,4
0066 F350 BCS 0x0051
0067 D09D RCALL pop_gset3
0068 9508 RET
_Process:
p --> R22
i --> R20
0069 D0A3 RCALL push_gset2
006A 01B9 MOVW R22,R18
006B 2F40 MOV R20,R16
(0026) }
(0027) }
(0028)
(0029) //计数值处理函数。参数i:计数值;参数p:处理数据存放的数组名//
(0030) //功能:此函数用于将计数值拆分为BCD码的千,百,十,一数据,用于查表显示//
(0031) void Process(uchar i,uchar *p)
(0032) {p[0]=i/1000;
006C EE28 LDI R18,0xE8
006D E033 LDI R19,3
006E 2F04 MOV R16,R20
006F 2711 CLR R17
0070 D045 RCALL div16s
0071 01FB MOVW R30,R22
0072 8300 STD Z+0,R16
(0033) i=i%1000;
0073 EE28 LDI R18,0xE8
0074 E033 LDI R19,3
0075 2F04 MOV R16,R20
0076 2711 CLR R17
0077 D03A RCALL mod16s
0078 2F40 MOV R20,R16
(0034) p[1]=i/100;
0079 E614 LDI R17,0x64
007A D072 RCALL div8u
007B 01FB MOVW R30,R22
007C 8301 STD Z+1,R16
(0035) i=i%100;
007D E614 LDI R17,0x64
007E 2F04 MOV R16,R20
007F D06B RCALL mod8u
0080 2F40 MOV R20,R16
(0036) p[2]=i/10;
0081 E01A LDI R17,0xA
0082 D06A RCALL div8u
0083 01FB MOVW R30,R22
0084 8302 STD Z+2,R16
(0037) i=i%10;
0085 E01A LDI R17,0xA
0086 2F04 MOV R16,R20
0087 D063 RCALL mod8u
0088 2F40 MOV R20,R16
(0038) p[3]=i;
0089 01FB MOVW R30,R22
008A 8343 STD Z+3,R20
008B D077 RCALL pop_gset2
008C 9508 RET
(0039) }
(0040)
(0041) void Init_IO(void) //初始化I/O口
(0042) {DDRD=0xff; //设置A口为推挽1输出
_Init_IO:
008D EF8F LDI R24,0xFF
008E BB81 OUT 0x11,R24
(0043) PORTD=0xff;
008F BB82 OUT 0x12,R24
(0044) DDRB=0x00; //设置B口为不带上拉电阻输入
0090 2422 CLR R2
0091 BA27 OUT 0x17,R2
(0045) PORTB=0x00;
0092 BA28 OUT 0x18,R2
(0046) DDRC=0xff; //设置C口为推挽1输出;
0093 BB84 OUT 0x14,R24
(0047) PORTC=0xff;
0094 BB85 OUT 0x15,R24
0095 9508 RET
(0048) }
(0049)
(0050) void main(void)
(0051) {uchar Load;
(0052) Init_IO(); //初始化I/O口
_main:
Load --> R20
0096 DFF6 RCALL _Init_IO
(0053) PORTD=0xff; //点亮以测试所有的数码管
0097 EF8F LDI R24,0xFF
0098 BB82 OUT 0x12,R24
(0054) PORTC=0x00;
0099 2422 CLR R2
009A BA25 OUT 0x15,R2
(0055) DelayMs(300); //延时
009B E20C LDI R16,0x2C
009C E011 LDI R17,1
009D DF9D RCALL _DelayMs
(0056) PORTC=0xff; //熄灭所有的数码管
009E EF8F LDI R24,0xFF
009F BB85 OUT 0x15,R24
(0057) TCCR0=0x05; //T/C0工作于计数方式,下降沿计数
00A0 E085 LDI R24,5
00A1 BF83 OUT 0x33,R24
(0058) TCNT0=CNT; //计数初始值0
00A2 9020006E LDS R2,CNT
00A4 9030006F LDS R3,CNT+1
00A6 BE22 OUT 0x32,R2
00A7 C008 RJMP 0x00B0
(0059) while(1)
(0060) {Load=TCNT0;
00A8 B742 IN R20,0x32
(0061) Process(Load,Data); //计数值处理
00A9 E62A LDI R18,0x6A
00AA E030 LDI R19,0
00AB 2F04 MOV R16,R20
00AC DFBC RCALL _Process
(0062) Display(Data); //动态扫描显示
FILE: <library>
00AD E60A LDI R16,0x6A
00AE E010 LDI R17,0
00AF DF9C RCALL _Display
00B0 CFF7 RJMP 0x00A8
00B1 9508 RET
mod16s:
00B2 9468 BSET 6
00B3 92DA ST R13,-Y
00B4 2ED1 MOV R13,R17
00B5 C004 RJMP 0x00BA
div16s:
00B6 94E8 BCLR 6
00B7 92DA ST R13,-Y
00B8 2ED1 MOV R13,R17
00B9 26D3 EOR R13,R19
00BA FF17 SBRS R17,7
00BB C004 RJMP 0x00C0
00BC 9510 COM R17
00BD 9500 COM R16
00BE 5F0F SUBI R16,0xFF
00BF 4F1F SBCI R17,0xFF
00C0 FF37 SBRS R19,7
00C1 C004 RJMP 0x00C6
00C2 9530 COM R19
00C3 9520 COM R18
00C4 5F2F SUBI R18,0xFF
00C5 4F3F SBCI R19,0xFF
00C6 D00B RCALL xdiv16u
00C7 FED7 SBRS R13,7
00C8 C004 RJMP 0x00CD
00C9 9510 COM R17
00CA 9500 COM R16
00CB 5F0F SUBI R16,0xFF
00CC 4F1F SBCI R17,0xFF
00CD 90D9 LD R13,Y+
00CE 9508 RET
mod16u:
00CF 9468 BSET 6
00D0 C001 RJMP xdiv16u
div16u:
00D1 94E8 BCLR 6
xdiv16u:
00D2 92EA ST R14,-Y
00D3 92FA ST R15,-Y
00D4 938A ST R24,-Y
00D5 24EE CLR R14
00D6 24FF CLR R15
00D7 E180 LDI R24,0x10
00D8 0F00 LSL R16
00D9 1F11 ROL R17
00DA 1CEE ROL R14
00DB 1CFF ROL R15
00DC 16E2 CP R14,R18
00DD 06F3 CPC R15,R19
00DE F018 BCS 0x00E2
00DF 1AE2 SUB R14,R18
00E0 0AF3 SBC R15,R19
00E1 9503 INC R16
00E2 958A DEC R24
00E3 F7A1 BNE 0x00D8
00E4 F416 BRTC 0x00E7
00E5 2D0E MOV R16,R14
00E6 2D1F MOV R17,R15
00E7 9189 LD R24,Y+
00E8 90F9 LD R15,Y+
00E9 90E9 LD R14,Y+
00EA 9508 RET
mod8u:
00EB 9468 BSET 6
00EC C001 RJMP xdiv8u
div8u:
00ED 94E8 BCLR 6
xdiv8u:
00EE 932A ST R18,-Y
00EF 92FA ST R15,-Y
00F0 92EA ST R14,-Y
00F1 24FF CLR R15
00F2 24EE CLR R14
00F3 E120 LDI R18,0x10
00F4 0F00 LSL R16
00F5 1CFF ROL R15
00F6 1CEE ROL R14
00F7 16E1 CP R14,R17
00F8 F010 BCS 0x00FB
00F9 1AE1 SUB R14,R17
00FA 9503 INC R16
00FB 952A DEC R18
00FC F7B9 BNE 0x00F4
00FD F40E BRTC 0x00FF
00FE 2D0E MOV R16,R14
00FF 90E9 LD R14,Y+
0100 90F9 LD R15,Y+
0101 9129 LD R18,Y+
0102 9508 RET
pop_gset2:
0103 E0E2 LDI R30,2
0104 C00E RJMP pop
pop_gset3:
0105 E0E4 LDI R30,4
0106 C00C RJMP pop
push_gset5:
0107 92FA ST R15,-Y
0108 92EA ST R14,-Y
push_gset4:
0109 92DA ST R13,-Y
010A 92CA ST R12,-Y
push_gset3:
010B 92BA ST R11,-Y
010C 92AA ST R10,-Y
push_gset2:
010D 937A ST R23,-Y
010E 936A ST R22,-Y
push_gset1:
010F 935A ST R21,-Y
0110 934A ST R20,-Y
0111 9508 RET
pop_gset1:
0112 E0E1 LDI R30,1
pop:
0113 9149 LD R20,Y+
0114 9159 LD R21,Y+
0115 FDE0 SBRC R30,0
0116 9508 RET
0117 9169 LD R22,Y+
0118 9179 LD R23,Y+
0119 FDE1 SBRC R30,1
011A 9508 RET
011B 90A9 LD R10,Y+
011C 90B9 LD R11,Y+
011D FDE2 SBRC R30,2
011E 9508 RET
011F 90C9 LD R12,Y+
0120 90D9 LD R13,Y+
0121 FDE3 SBRC R30,3
0122 9508 RET
0123 90E9 LD R14,Y+
0124 90F9 LD R15,Y+
0125 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -