📄 compare.lst
字号:
__start:
__text_start:
0018 E5CF LDI R28,0x5F
0019 E0D2 LDI R29,2
001A BFCD OUT 0x3D,R28
001B BFDE OUT 0x3E,R29
001C 51C0 SUBI R28,0x10
001D 40D0 SBCI R29,0
001E EA0A LDI R16,0xAA
001F 8308 STD Y+0,R16
0020 2400 CLR R0
0021 E6EE LDI R30,0x6E
0022 E0F0 LDI R31,0
0023 E010 LDI R17,0
0024 37E1 CPI R30,0x71
0025 07F1 CPC R31,R17
0026 F011 BEQ 0x0029
0027 9201 ST R0,Z+
0028 CFFB RJMP 0x0024
0029 8300 STD Z+0,R16
002A E2E2 LDI R30,0x22
002B E0F0 LDI R31,0
002C E6A0 LDI R26,0x60
002D E0B0 LDI R27,0
002E E010 LDI R17,0
002F 33E0 CPI R30,0x30
0030 07F1 CPC R31,R17
0031 F021 BEQ 0x0036
0032 95C8 LPM
0033 9631 ADIW R30,1
0034 920D ST R0,X+
0035 CFF9 RJMP 0x002F
0036 D0E3 RCALL _main
_exit:
0037 CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
0038 D11E RCALL push_gset1
FILE: I:\AVRpractice\BOOK\定时器1\输出比较\Compare.c
(0001) //***************FileName:Capature.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,1}; //定义初始方波频率:1KHz
(0011) uchar Key1_Flag,Key2_Flag,Key3_Flag;
(0012)
(0013) void DelayMs(uint i) //Ms级延时,参数i为延时时间
(0014) {uint j;
(0015) for(;i!=0;i--)
0039 C00A RJMP 0x0044
(0016) {for(j=8000;j!=0;j--) {;}}
003A E440 LDI R20,0x40
003B E15F LDI R21,0x1F
003C C002 RJMP 0x003F
003D 5041 SUBI R20,1
003E 4050 SBCI R21,0
003F 3040 CPI R20,0
0040 0745 CPC R20,R21
0041 F7D9 BNE 0x003D
0042 5001 SUBI R16,1
0043 4010 SBCI R17,0
0044 3000 CPI R16,0
0045 0701 CPC R16,R17
0046 F799 BNE 0x003A
(0017) }
0047 D112 RCALL pop_gset1
0048 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
0049 D127 RCALL push_gset3
004A 2EA0 MOV R10,R16
004B 2EB1 MOV R11,R17
(0018)
(0019) void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
(0020) {uchar i,sel=0x01;
004C E041 LDI R20,1
(0021) for(i=0;i<4;i++)
004D 2766 CLR R22
004E C017 RJMP 0x0066
(0022) {PORTA=sel; //选通最右边的数码管
004F BB4B OUT 0x1B,R20
(0023) PORTC=0xff-Table[p[i]]; //送字型码
0050 2FE6 MOV R30,R22
0051 27FF CLR R31
0052 0DEA ADD R30,R10
0053 1DFB ADC R31,R11
0054 81E0 LDD R30,Z+0
0055 27FF CLR R31
0056 E680 LDI R24,0x60
0057 E090 LDI R25,0
0058 0FE8 ADD R30,R24
0059 1FF9 ADC R31,R25
005A 8020 LDD R2,Z+0
005B 2433 CLR R3
005C EF8F LDI R24,0xFF
005D E090 LDI R25,0
005E 1982 SUB R24,R2
005F 0993 SBC R25,R3
0060 BB85 OUT 0x15,R24
(0024) DelayMs(1); //显示延时
0061 E001 LDI R16,1
0062 E010 LDI R17,0
0063 DFD4 RCALL _DelayMs
(0025) sel=sel<<1; //移位以显示前一位
0064 0F44 LSL R20
0065 9563 INC R22
0066 3064 CPI R22,4
0067 F338 BCS 0x004F
(0026) }
(0027) }
0068 D0EC RCALL pop_gset3
0069 9508 RET
_Key_Process:
k --> Y+1
j --> Y+1
i --> Y+1
p --> R20
006A D0EC RCALL push_gset1
006B 2F40 MOV R20,R16
006C 2F51 MOV R21,R17
(0028)
(0029) void Key_Process(uchar *p)
(0030) {uchar i,j,k;
006D C006 RJMP 0x0074
(0031) while((PINB&0x01)==0) {Display(Data);Key1_Flag=1;} //处理频率百位,最高5
006E E60A LDI R16,0x6A
006F E010 LDI R17,0
0070 DFD8 RCALL _Display
0071 E081 LDI R24,1
0072 93800070 STS _Key1_Flag,R24
0074 9BB0 SBIS 0x16,0
0075 CFF8 RJMP 0x006E
0076 C006 RJMP 0x007D
(0032) while((PINB&0x02)==0) {Display(Data);Key2_Flag=1;}
0077 E60A LDI R16,0x6A
0078 E010 LDI R17,0
0079 DFCF RCALL _Display
007A E081 LDI R24,1
007B 9380006F STS _Key2_Flag,R24
007D 9BB1 SBIS 0x16,1
007E CFF8 RJMP 0x0077
007F C006 RJMP 0x0086
(0033) while((PINB&0x04)==0) {Display(Data);Key3_Flag=1;}
0080 E60A LDI R16,0x6A
0081 E010 LDI R17,0
0082 DFC6 RCALL _Display
0083 E081 LDI R24,1
0084 9380006E STS _Key3_Flag,R24
0086 9BB2 SBIS 0x16,2
0087 CFF8 RJMP 0x0080
(0034) if(Key1_Flag==1)
0088 91800070 LDS R24,_Key1_Flag
008A 3081 CPI R24,1
008B F4A1 BNE 0x00A0
(0035) {p[3]++;
008C 2F84 MOV R24,R20
008D 2F95 MOV R25,R21
008E 9603 ADIW R24,3
008F 2FE8 MOV R30,R24
0090 2FF9 MOV R31,R25
0091 8180 LDD R24,Z+0
0092 5F8F SUBI R24,0xFF
0093 8380 STD Z+0,R24
(0036) if(p[3]==10) p[3]=0;
0094 2FE4 MOV R30,R20
0095 2FF5 MOV R31,R21
0096 8183 LDD R24,Z+3
0097 308A CPI R24,0xA
0098 F421 BNE 0x009D
0099 2422 CLR R2
009A 2FE4 MOV R30,R20
009B 2FF5 MOV R31,R21
009C 8223 STD Z+3,R2
(0037) Key1_Flag=0;}
009D 2422 CLR R2
009E 92200070 STS _Key1_Flag,R2
(0038) if(Key2_Flag==1) //处理频率十位,最高9
00A0 9180006F LDS R24,_Key2_Flag
00A2 3081 CPI R24,1
00A3 F4A1 BNE 0x00B8
(0039) {p[2]++;
00A4 2F84 MOV R24,R20
00A5 2F95 MOV R25,R21
00A6 9602 ADIW R24,2
00A7 2FE8 MOV R30,R24
00A8 2FF9 MOV R31,R25
00A9 8180 LDD R24,Z+0
00AA 5F8F SUBI R24,0xFF
00AB 8380 STD Z+0,R24
(0040) if(p[2]==10) p[2]=0;
00AC 2FE4 MOV R30,R20
00AD 2FF5 MOV R31,R21
00AE 8182 LDD R24,Z+2
00AF 308A CPI R24,0xA
00B0 F421 BNE 0x00B5
00B1 2422 CLR R2
00B2 2FE4 MOV R30,R20
00B3 2FF5 MOV R31,R21
00B4 8222 STD Z+2,R2
(0041) Key2_Flag=0;}
00B5 2422 CLR R2
00B6 9220006F STS _Key2_Flag,R2
(0042) if(Key3_Flag==1) //处理频率各位,最高9
00B8 9180006E LDS R24,_Key3_Flag
00BA 3081 CPI R24,1
00BB F4A1 BNE 0x00D0
(0043) {p[1]++;
00BC 2F84 MOV R24,R20
00BD 2F95 MOV R25,R21
00BE 9601 ADIW R24,1
00BF 2FE8 MOV R30,R24
00C0 2FF9 MOV R31,R25
00C1 8180 LDD R24,Z+0
00C2 5F8F SUBI R24,0xFF
00C3 8380 STD Z+0,R24
(0044) if(p[1]==10) p[1]=0;
00C4 2FE4 MOV R30,R20
00C5 2FF5 MOV R31,R21
00C6 8181 LDD R24,Z+1
00C7 308A CPI R24,0xA
00C8 F421 BNE 0x00CD
00C9 2422 CLR R2
00CA 2FE4 MOV R30,R20
00CB 2FF5 MOV R31,R21
00CC 8221 STD Z+1,R2
(0045) Key3_Flag=0;}
00CD 2422 CLR R2
00CE 9220006E STS _Key3_Flag,R2
(0046) }
00D0 D089 RCALL pop_gset1
00D1 9508 RET
_Set_Process:
i --> R20
j --> R20
00D2 D084 RCALL push_gset1
(0047)
(0048) void Set_Process(void)
(0049) {uint i,j;
(0050) i=Data[0]*1000+Data[1]*100+Data[2]*10+Data[3];
00D3 9120006B LDS R18,0x6B
00D5 2733 CLR R19
00D6 E604 LDI R16,0x64
00D7 E010 LDI R17,0
00D8 D09B RCALL mpy16s
00D9 2E20 MOV R2,R16
00DA 2E31 MOV R3,R17
00DB 9120006A LDS R18,0x6A
00DD 2733 CLR R19
00DE EE08 LDI R16,0xE8
00DF E013 LDI R17,3
00E0 D093 RCALL mpy16s
00E1 2F40 MOV R20,R16
00E2 2F51 MOV R21,R17
00E3 0D42 ADD R20,R2
00E4 1D53 ADC R21,R3
00E5 9120006C LDS R18,0x6C
00E7 2733 CLR R19
00E8 E00A LDI R16,0xA
00E9 E010 LDI R17,0
00EA D089 RCALL mpy16s
00EB 0F40 ADD R20,R16
00EC 1F51 ADC R21,R17
00ED 9020006D LDS R2,0x6D
00EF 2433 CLR R3
00F0 0D42 ADD R20,R2
00F1 1D53 ADC R21,R3
(0051) j=500/i;
00F2 EF04 LDI R16,0xF4
00F3 E011 LDI R17,1
00F4 2F24 MOV R18,R20
00F5 2F35 MOV R19,R21
00F6 D044 RCALL div16u
00F7 2F40 MOV R20,R16
00F8 2F51 MOV R21,R17
(0052) OCR1AH=j>>8;
00F9 2E24 MOV R2,R20
00FA 2E35 MOV R3,R21
00FB 2C23 MOV R2,R3
00FC 2433 CLR R3
00FD BC2B OUT 0x2B,R2
(0053) OCR1AL=j&0x00ff;
00FE 2F84 MOV R24,R20
00FF 2F95 MOV R25,R21
0100 7090 ANDI R25,0
0101 BD8A OUT 0x2A,R24
(0054) }
0102 D057 RCALL pop_gset1
0103 9508 RET
(0055)
(0056) void Init_IO(void) //初始化I/O口
(0057) {DDRA=0xff; //设置A口为推挽1输出
_Init_IO:
0104 EF8F LDI R24,0xFF
0105 BB8A OUT 0x1A,R24
(0058) PORTA=0xff;
0106 BB8B OUT 0x1B,R24
(0059) DDRC=0xff; //设置C口为推挽1输出
0107 BB84 OUT 0x14,R24
(0060) PORTC=0xff;
0108 BB85 OUT 0x15,R24
(0061) DDRB=0x00; //设置B口为三态输入
0109 2422 CLR R2
010A BA27 OUT 0x17,R2
(0062) PORTB=0x00;
010B BA28 OUT 0x18,R2
(0063) DDRD=0xff; //设置D口为推挽1输出
010C BB81 OUT 0x11,R24
(0064) PORTD=0xff;
010D BB82 OUT 0x12,R24
(0065) }
010E 9508 RET
(0066)
(0067) void Init_Timer1(void) //初始化T/C1的输入捕获中断
(0068) {TIMSK=TIMSK|0x10; //输出比较使能
_Init_Timer1:
010F B789 IN R24,0x39
0110 6180 ORI R24,0x10
0111 BF89 OUT 0x39,R24
(0069) TCCR1B=0x0a; //时钟1 频,输出比较匹配清除定时器值
0112 E08A LDI R24,0xA
0113 BD8E OUT 0x2E,R24
(0070) TCNT1H=0x00; //清除定时器值
0114 2422 CLR R2
0115 BC2D OUT 0x2D,R2
(0071) TCNT1L=0x00;
0116 BC2C OUT 0x2C,R2
(0072) Set_Process(); //OCR1A,OCR1B置初值
0117 DFBA RCALL _Set_Process
(0073) SREG=SREG|0x80; //全局中断开
0118 9478 BSET 7
(0074) }
0119 9508 RET
(0075)
(0076) void main(void)
(0077) {Init_IO(); //初始化I/O口
_main:
011A DFE9 RCALL _Init_IO
(0078) PORTA=0xff; //点亮以测试所有的数码管
011B EF8F LDI R24,0xFF
011C BB8B OUT 0x1B,R24
(0079) PORTC=0x00;
011D 2422 CLR R2
011E BA25 OUT 0x15,R2
(0080) Init_Timer1();
011F DFEF RCALL _Init_Timer1
(0081) DelayMs(300); //延时
0120 E20C LDI R16,0x2C
0121 E011 LDI R17,1
0122 DF15 RCALL _DelayMs
(0082) PORTC=0xff; //熄灭所有的数码管
0123 EF8F LDI R24,0xFF
0124 BB85 OUT 0x15,R24
0125 C007 RJMP 0x012D
(0083) while(1)
(0084) {Key_Process(Data);
0126 E60A LDI R16,0x6A
0127 E010 LDI R17,0
0128 DF41 RCALL _Key_Process
(0085) Set_Process();
0129 DFA8 RCALL _Set_Process
(0086) Display(Data); //动态扫描显示
012A E60A LDI R16,0x6A
012B E010 LDI R17,0
012C DF1C RCALL _Display
012D CFF8 RJMP 0x0126
(0087) }
(0088) }
012E 9508 RET
_Compare:
012F 922A ST R2,-Y
0130 B62F IN R2,0x3F
0131 922A ST R2,-Y
(0089)
(0090) #pragma interrupt_handler Compare:7
(0091) void Compare(void)
(0092) {PORTD=~PORTD;}
FILE: <library>
0132 B222 IN R2,0x12
0133 9420 COM R2
0134 BA22 OUT 0x12,R2
0135 9029 LD R2,Y+
0136 BE2F OUT 0x3F,R2
0137 9029 LD R2,Y+
0138 9518 RETI
mod16u:
0139 9468 BSET 6
013A C001 RJMP xdiv16u
div16u:
013B 94E8 BCLR 6
xdiv16u:
013C 92EA ST R14,-Y
013D 92FA ST R15,-Y
013E 938A ST R24,-Y
013F 24EE CLR R14
0140 24FF CLR R15
0141 E180 LDI R24,0x10
0142 0F00 LSL R16
0143 1F11 ROL R17
0144 1CEE ROL R14
0145 1CFF ROL R15
0146 16E2 CP R14,R18
0147 06F3 CPC R15,R19
0148 F018 BCS 0x014C
0149 1AE2 SUB R14,R18
014A 0AF3 SBC R15,R19
014B 9503 INC R16
014C 958A DEC R24
014D F7A1 BNE 0x0142
014E F416 BRTC 0x0151
014F 2D0E MOV R16,R14
0150 2D1F MOV R17,R15
0151 9189 LD R24,Y+
0152 90F9 LD R15,Y+
0153 90E9 LD R14,Y+
0154 9508 RET
pop_gset3:
0155 E0E4 LDI R30,4
0156 C004 RJMP pop
push_gset1:
0157 935A ST R21,-Y
0158 934A ST R20,-Y
0159 9508 RET
pop_gset1:
015A E0E1 LDI R30,1
pop:
015B 9149 LD R20,Y+
015C 9159 LD R21,Y+
015D FDE0 SBRC R30,0
015E 9508 RET
015F 9169 LD R22,Y+
0160 9179 LD R23,Y+
0161 FDE1 SBRC R30,1
0162 9508 RET
0163 90A9 LD R10,Y+
0164 90B9 LD R11,Y+
0165 FDE2 SBRC R30,2
0166 9508 RET
0167 90C9 LD R12,Y+
0168 90D9 LD R13,Y+
0169 FDE3 SBRC R30,3
016A 9508 RET
016B 90E9 LD R14,Y+
016C 90F9 LD R15,Y+
016D 9508 RET
push_gset2:
016E 937A ST R23,-Y
016F 936A ST R22,-Y
0170 CFE6 RJMP push_gset1
push_gset3:
0171 92BA ST R11,-Y
0172 92AA ST R10,-Y
0173 CFFA RJMP push_gset2
mpy16s:
0174 920A ST R0,-Y
0175 921A ST R1,-Y
0176 2400 CLR R0
0177 2411 CLR R1
0178 3000 CPI R16,0
0179 0701 CPC R16,R17
017A F041 BEQ 0x0183
017B 9516 LSR R17
017C 9507 ROR R16
017D F410 BCC 0x0180
017E 0E02 ADD R0,R18
017F 1E13 ADC R1,R19
0180 0F22 LSL R18
0181 1F33 ROL R19
0182 CFF5 RJMP 0x0178
0183 2D00 MOV R16,R0
0184 2D11 MOV R17,R1
0185 9019 LD R1,Y+
0186 9009 LD R0,Y+
0187 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -