📄 rtc.lst
字号:
__start:
__text_start:
001B E5CF LDI R28,0x5F
001C E0D2 LDI R29,2
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 E7E4 LDI R30,0x74
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 37E5 CPI R30,0x75
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 E2E2 LDI R30,0x22
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 D079 RCALL _main
_exit:
003A CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
003B D0A8 RCALL push_gset1
FILE: J:\AVRpractice\BOOK\定时器2\RTC.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[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0010) uchar Data[4]={0,0,0,0}; //定义初始时间:00:00
(0011) uchar CNT; //定义中断计数次数
(0012) void DelayMs(uint i) //Ms级延时,参数i为延时时间
(0013) {uint j;
(0014) for(;i!=0;i--)
003C C00A RJMP 0x0047
(0015) {for(j=8000;j!=0;j--) {;}}
003D E440 LDI R20,0x40
003E E15F LDI R21,0x1F
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
(0016) }
004A D09C RCALL pop_gset1
004B 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
004C D0B1 RCALL push_gset3
004D 2EA0 MOV R10,R16
004E 2EB1 MOV R11,R17
(0017)
(0018) void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
(0019) {uchar i,sel=0x01;
004F E041 LDI R20,1
(0020) for(i=0;i<4;i++)
0050 2766 CLR R22
0051 C017 RJMP 0x0069
(0021) {PORTA=sel; //选通最右边的数码管
0052 BB4B OUT 0x1B,R20
(0022) PORTC=0xff-Table[p[i]]; //送字型码
0053 2FE6 MOV R30,R22
0054 27FF CLR R31
0055 0DEA ADD R30,R10
0056 1DFB ADC R31,R11
0057 81E0 LDD R30,Z+0
0058 27FF CLR R31
0059 E680 LDI R24,0x60
005A E090 LDI R25,0
005B 0FE8 ADD R30,R24
005C 1FF9 ADC R31,R25
005D 8020 LDD R2,Z+0
005E 2433 CLR R3
005F EF8F LDI R24,0xFF
0060 E090 LDI R25,0
0061 1982 SUB R24,R2
0062 0993 SBC R25,R3
0063 BB85 OUT 0x15,R24
(0023) DelayMs(1); //显示延时
0064 E001 LDI R16,1
0065 E010 LDI R17,0
0066 DFD4 RCALL _DelayMs
(0024) sel=sel<<1; //移位以显示前一位
0067 0F44 LSL R20
0068 9563 INC R22
0069 3064 CPI R22,4
006A F338 BCS 0x0052
(0025) }
(0026) }
006B D076 RCALL pop_gset3
006C 9508 RET
(0027)
(0028) void Init_IO(void) //初始化I/O口
(0029) {DDRA=0xff; //设置A口为推挽1输出
_Init_IO:
006D EF8F LDI R24,0xFF
006E BB8A OUT 0x1A,R24
(0030) PORTA=0xff;
006F BB8B OUT 0x1B,R24
(0031) DDRC=0xff; //设置C口为推挽1输出
0070 BB84 OUT 0x14,R24
(0032) PORTC=0xff;
0071 BB85 OUT 0x15,R24
(0033) }
0072 9508 RET
(0034)
(0035) void Add_Second(uchar *p)
(0036) {p[3]++;
_Add_Second:
p --> R16
0073 2F80 MOV R24,R16
0074 2F91 MOV R25,R17
0075 9603 ADIW R24,3
0076 2FE8 MOV R30,R24
0077 2FF9 MOV R31,R25
0078 8180 LDD R24,Z+0
0079 5F8F SUBI R24,0xFF
007A 8380 STD Z+0,R24
(0037) if(p[3]==10) {p[3]=0;p[2]++;}
007B 2FE0 MOV R30,R16
007C 2FF1 MOV R31,R17
007D 8183 LDD R24,Z+3
007E 308A CPI R24,0xA
007F F461 BNE 0x008C
0080 2422 CLR R2
0081 2FE0 MOV R30,R16
0082 2FF1 MOV R31,R17
0083 8223 STD Z+3,R2
0084 2F80 MOV R24,R16
0085 2F91 MOV R25,R17
0086 9602 ADIW R24,2
0087 2FE8 MOV R30,R24
0088 2FF9 MOV R31,R25
0089 8180 LDD R24,Z+0
008A 5F8F SUBI R24,0xFF
008B 8380 STD Z+0,R24
(0038) if(p[2]==6) {p[2]=0;p[1]++;}
008C 2FE0 MOV R30,R16
008D 2FF1 MOV R31,R17
008E 8182 LDD R24,Z+2
008F 3086 CPI R24,6
0090 F461 BNE 0x009D
0091 2422 CLR R2
0092 2FE0 MOV R30,R16
0093 2FF1 MOV R31,R17
0094 8222 STD Z+2,R2
0095 2F80 MOV R24,R16
0096 2F91 MOV R25,R17
0097 9601 ADIW R24,1
0098 2FE8 MOV R30,R24
0099 2FF9 MOV R31,R25
009A 8180 LDD R24,Z+0
009B 5F8F SUBI R24,0xFF
009C 8380 STD Z+0,R24
(0039) if(p[1]==10) {p[1]=0;p[0]++;}
009D 2FE0 MOV R30,R16
009E 2FF1 MOV R31,R17
009F 8181 LDD R24,Z+1
00A0 308A CPI R24,0xA
00A1 F449 BNE 0x00AB
00A2 2422 CLR R2
00A3 2FE0 MOV R30,R16
00A4 2FF1 MOV R31,R17
00A5 8221 STD Z+1,R2
00A6 2FE0 MOV R30,R16
00A7 2FF1 MOV R31,R17
00A8 8180 LDD R24,Z+0
00A9 5F8F SUBI R24,0xFF
00AA 8380 STD Z+0,R24
(0040) if(p[0]==6) {p[0]=0;}
00AB 2FE0 MOV R30,R16
00AC 2FF1 MOV R31,R17
00AD 8180 LDD R24,Z+0
00AE 3086 CPI R24,6
00AF F411 BNE 0x00B2
00B0 2422 CLR R2
00B1 8220 STD Z+0,R2
(0041) }
00B2 9508 RET
(0042)
(0043) void main(void)
(0044) {uchar i;
(0045) Init_IO(); //初始化I/O口
_main:
i --> Y+1
00B3 DFB9 RCALL _Init_IO
(0046) PORTA=0xff; //点亮以测试所有的数码管
00B4 EF8F LDI R24,0xFF
00B5 BB8B OUT 0x1B,R24
(0047) PORTC=0x00;
00B6 2422 CLR R2
00B7 BA25 OUT 0x15,R2
(0048) DelayMs(300); //延时
00B8 E20C LDI R16,0x2C
00B9 E011 LDI R17,1
00BA DF80 RCALL _DelayMs
(0049) PORTC=0xff; //熄灭所有的数码管
00BB EF8F LDI R24,0xFF
00BC BB85 OUT 0x15,R24
(0050) ASSR=0x08; //异步时钟使能
00BD E088 LDI R24,0x8
00BE BD82 OUT 0x22,R24
(0051) TCCR2=0x07; //32768的晶振1024分频作为T/C2的时钟源
00BF E087 LDI R24,7
00C0 BD85 OUT 0x25,R24
(0052) TIMSK=0x40; //T/C2溢出中断使能
00C1 E480 LDI R24,0x40
00C2 BF89 OUT 0x39,R24
(0053) SREG=SREG|0x80; //全局中断使能
00C3 9478 BSET 7
00C4 C00D RJMP 0x00D2
(0054) while(1)
(0055) {Display(Data);
00C5 E700 LDI R16,0x70
00C6 E010 LDI R17,0
00C7 DF84 RCALL _Display
(0056) if(CNT==32)
00C8 91800074 LDS R24,_CNT
00CA 3280 CPI R24,0x20
00CB F431 BNE 0x00D2
(0057) {CNT=0;
00CC 2422 CLR R2
00CD 92200074 STS _CNT,R2
(0058) Add_Second(Data);}
00CF E700 LDI R16,0x70
00D0 E010 LDI R17,0
00D1 DFA1 RCALL _Add_Second
00D2 CFF2 RJMP 0x00C5
(0059) }
(0060) }
00D3 9508 RET
_Timer2:
00D4 938A ST R24,-Y
00D5 939A ST R25,-Y
00D6 B78F IN R24,0x3F
00D7 938A ST R24,-Y
(0061)
(0062) #pragma interrupt_handler Timer2:5
(0063) void Timer2(void)
(0064) {CNT=CNT+1;}
FILE: <library>
00D8 91800074 LDS R24,_CNT
00DA 5F8F SUBI R24,0xFF
00DB 93800074 STS _CNT,R24
00DD 9189 LD R24,Y+
00DE BF8F OUT 0x3F,R24
00DF 9199 LD R25,Y+
00E0 9189 LD R24,Y+
00E1 9518 RETI
pop_gset3:
00E2 E0E4 LDI R30,4
00E3 C004 RJMP pop
push_gset1:
00E4 935A ST R21,-Y
00E5 934A ST R20,-Y
00E6 9508 RET
pop_gset1:
00E7 E0E1 LDI R30,1
pop:
00E8 9149 LD R20,Y+
00E9 9159 LD R21,Y+
00EA FDE0 SBRC R30,0
00EB 9508 RET
00EC 9169 LD R22,Y+
00ED 9179 LD R23,Y+
00EE FDE1 SBRC R30,1
00EF 9508 RET
00F0 90A9 LD R10,Y+
00F1 90B9 LD R11,Y+
00F2 FDE2 SBRC R30,2
00F3 9508 RET
00F4 90C9 LD R12,Y+
00F5 90D9 LD R13,Y+
00F6 FDE3 SBRC R30,3
00F7 9508 RET
00F8 90E9 LD R14,Y+
00F9 90F9 LD R15,Y+
00FA 9508 RET
push_gset2:
00FB 937A ST R23,-Y
00FC 936A ST R22,-Y
00FD CFE6 RJMP push_gset1
push_gset3:
00FE 92BA ST R11,-Y
00FF 92AA ST R10,-Y
0100 CFFA RJMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -