📄 timer0.lst
字号:
00CF F031 BEQ 0x00D6
00D0 C008 RJMP 0x00D9
(0075) {
(0076) case 1:
(0077) TCNT0=0x06; //计数初始值6
00D1 E086 LDI R24,6
00D2 BF82 OUT 0x32,R24
(0078) TCCR0=0x03; //打开T/C0,系统时钟64分频
00D3 E083 LDI R24,3
00D4 BF83 OUT 0x33,R24
(0079) break;
00D5 C00C RJMP 0x00E2
(0080) case 2:
(0081) TCCR0=0x00; //关闭T/C0
00D6 2422 CLR R2
00D7 BE23 OUT 0x33,R2
(0082) break;
00D8 C009 RJMP 0x00E2
(0083) default:
(0084) TimeNum[0]=TimeNum[1]=TimeNum[2]=0;//计时清零
00D9 2422 CLR R2
00DA 92200062 STS 0x62,R2
00DC 92200061 STS 0x61,R2
00DE 92200060 STS 0x60,R2
(0085) KeyDown=0;
00E0 92200064 STS _KeyDown,R2
(0086) break;
(0087) }
(0088) }
00E2 9029 LD R2,Y+
00E3 BE2F OUT 0x3F,R2
00E4 91E9 LD R30,Y+
00E5 9199 LD R25,Y+
00E6 9189 LD R24,Y+
00E7 9119 LD R17,Y+
00E8 9109 LD R16,Y+
00E9 9029 LD R2,Y+
00EA 9518 RETI
_timer0_fun:
00EB 922A ST R2,-Y
00EC 938A ST R24,-Y
00ED 939A ST R25,-Y
00EE B62F IN R2,0x3F
00EF 922A ST R2,-Y
(0089)
(0090) //T/C0中断函数
(0091) #pragma interrupt_handler timer0_fun:iv_TIMER0_OVF
(0092) void timer0_fun(void)
(0093) {
(0094) TCNT0=0x06 ; //重装计数初始值6
00F0 E086 LDI R24,6
00F1 BF82 OUT 0x32,R24
(0095) if(++CountNum==5)
00F2 91800063 LDS R24,_CountNum
00F4 5F8F SUBI R24,0xFF
00F5 2E28 MOV R2,R24
00F6 92200063 STS _CountNum,R2
00F8 3085 CPI R24,5
00F9 F521 BNE 0x011E
(0096) {
(0097) CountNum=0; //计数到5次,计数值复位
00FA 2422 CLR R2
00FB 92200063 STS _CountNum,R2
(0098) TimeNum[2]++; //秒的百分位加1
00FD 91800062 LDS R24,0x62
00FF 5F8F SUBI R24,0xFF
0100 93800062 STS 0x62,R24
(0099) if(TimeNum[2]==100)
0102 3684 CPI R24,0x64
0103 F439 BNE 0x010B
(0100) {
(0101) TimeNum[2]=0;
0104 92200062 STS 0x62,R2
(0102) TimeNum[1]++; //秒进位
0106 91800061 LDS R24,0x61
0108 5F8F SUBI R24,0xFF
0109 93800061 STS 0x61,R24
(0103) }
(0104) if(TimeNum[1]==60)
010B 91800061 LDS R24,0x61
010D 338C CPI R24,0x3C
010E F441 BNE 0x0117
(0105) {
(0106) TimeNum[1]=0;
010F 2422 CLR R2
0110 92200061 STS 0x61,R2
(0107) TimeNum[0]++; //分进位
0112 91800060 LDS R24,0x60
0114 5F8F SUBI R24,0xFF
0115 93800060 STS 0x60,R24
(0108) }
(0109) if(TimeNum[0]==60)
0117 91800060 LDS R24,0x60
0119 338C CPI R24,0x3C
011A F419 BNE 0x011E
(0110) {
(0111) TimeNum[0]=0;
011B 2422 CLR R2
011C 92200060 STS 0x60,R2
(0112) }
(0113) }
(0114) }
011E 9029 LD R2,Y+
011F BE2F OUT 0x3F,R2
0120 9199 LD R25,Y+
0121 9189 LD R24,Y+
0122 9029 LD R2,Y+
0123 9518 RETI
_main:
timer --> Y+0
0124 9726 SBIW R28,6
(0115)
(0116) //主函数
(0117) void main()
(0118) {
(0119) unsigned char timer[6]={0, 0, 0, 0, 0, 0};
0125 E380 LDI R24,0x30
0126 E090 LDI R25,0
0127 01FE MOVW R30,R28
0128 E006 LDI R16,6
0129 E010 LDI R17,0
012A 93FA ST R31,-Y
012B 93EA ST R30,-Y
012C 939A ST R25,-Y
012D 938A ST R24,-Y
012E D06D RCALL asgncblk
(0120)
(0121) CLI(); //先关闭全局中断
012F 94F8 BCLR 7
(0122) Init_Port(); //初始化端口
0130 DF23 RCALL _Init_Port
(0123) Init_Int(); //初始化外部中断
0131 DF2E RCALL _Init_Int
(0124) Init_Timer0(); //初始化T/C0
0132 DF37 RCALL _Init_Timer0
(0125)
(0126) KeyDown=0; //初始化全局变量
0133 2422 CLR R2
0134 92200064 STS _KeyDown,R2
(0127) CountNum=0;
0136 92200063 STS _CountNum,R2
(0128) SEI(); //打开全局中断
0138 9478 BSET 7
0139 C020 RJMP 0x015A
(0129) while (1)
(0130) {
(0131) timer[0]=TimeNum[0]/10;
013A E01A LDI R17,0xA
013B 91000060 LDS R16,0x60
013D D021 RCALL div8u
013E 8308 STD Y+0,R16
(0132) timer[1]=TimeNum[0]%10;
013F E01A LDI R17,0xA
0140 91000060 LDS R16,0x60
0142 D01A RCALL mod8u
0143 8309 STD Y+1,R16
(0133) timer[2]=TimeNum[1]/10;
0144 E01A LDI R17,0xA
0145 91000061 LDS R16,0x61
0147 D017 RCALL div8u
0148 830A STD Y+2,R16
(0134) timer[3]=TimeNum[1]%10;
0149 E01A LDI R17,0xA
014A 91000061 LDS R16,0x61
014C D010 RCALL mod8u
014D 830B STD Y+3,R16
(0135) timer[4]=TimeNum[2]/10;
014E E01A LDI R17,0xA
014F 91000062 LDS R16,0x62
0151 D00D RCALL div8u
0152 830C STD Y+4,R16
(0136) timer[5]=TimeNum[2]%10;
0153 E01A LDI R17,0xA
0154 91000062 LDS R16,0x62
0156 D006 RCALL mod8u
0157 830D STD Y+5,R16
(0137) Display(timer); //显示时间
0158 018E MOVW R16,R28
0159 DF18 RCALL _Display
015A CFDF RJMP 0x013A
(0138) }
(0139) }
FILE: <library>
015B 9626 ADIW R28,6
015C 9508 RET
mod8u:
015D 9468 BSET 6
015E C001 RJMP xdiv8u
div8u:
015F 94E8 BCLR 6
xdiv8u:
0160 932A ST R18,-Y
0161 92FA ST R15,-Y
0162 92EA ST R14,-Y
0163 24FF CLR R15
0164 24EE CLR R14
0165 E120 LDI R18,0x10
0166 0F00 LSL R16
0167 1CFF ROL R15
0168 1CEE ROL R14
0169 16E1 CP R14,R17
016A F010 BCS 0x016D
016B 1AE1 SUB R14,R17
016C 9503 INC R16
016D 952A DEC R18
016E F7B9 BNE 0x0166
016F F40E BRTC 0x0171
0170 2D0E MOV R16,R14
0171 90E9 LD R14,Y+
0172 90F9 LD R15,Y+
0173 9129 LD R18,Y+
0174 9508 RET
pop_gset2:
0175 E0E2 LDI R30,2
0176 C006 RJMP pop
pop_gset3:
0177 E0E4 LDI R30,4
0178 C004 RJMP pop
push_gset1:
0179 935A ST R21,-Y
017A 934A ST R20,-Y
017B 9508 RET
pop_gset1:
017C E0E1 LDI R30,1
pop:
017D 9149 LD R20,Y+
017E 9159 LD R21,Y+
017F FDE0 SBRC R30,0
0180 9508 RET
0181 9169 LD R22,Y+
0182 9179 LD R23,Y+
0183 FDE1 SBRC R30,1
0184 9508 RET
0185 90A9 LD R10,Y+
0186 90B9 LD R11,Y+
0187 FDE2 SBRC R30,2
0188 9508 RET
0189 90C9 LD R12,Y+
018A 90D9 LD R13,Y+
018B FDE3 SBRC R30,3
018C 9508 RET
018D 90E9 LD R14,Y+
018E 90F9 LD R15,Y+
018F 9508 RET
push_gset2:
0190 937A ST R23,-Y
0191 936A ST R22,-Y
0192 CFE6 RJMP push_gset1
push_gset3:
0193 92BA ST R11,-Y
0194 92AA ST R10,-Y
0195 CFFA RJMP push_gset2
lsl8:
0196 2311 TST R17
0197 F019 BEQ 0x019B
0198 0F00 LSL R16
0199 951A DEC R17
019A CFFB RJMP lsl8
019B 9508 RET
asgncblk:
019C 93AA ST R26,-Y
019D 93BA ST R27,-Y
019E 93EA ST R30,-Y
019F 93FA ST R31,-Y
01A0 920A ST R0,-Y
01A1 81AF LDD R26,Y+7
01A2 85B8 LDD R27,Y+8
01A3 81ED LDD R30,Y+5
01A4 81FE LDD R31,Y+6
01A5 3000 CPI R16,0
01A6 0701 CPC R16,R17
01A7 F031 BEQ 0x01AE
01A8 95C8 LPM
01A9 920D ST R0,X+
01AA 9631 ADIW R30,1
01AB 5001 SUBI R16,1
01AC 4010 SBCI R17,0
01AD CFF7 RJMP 0x01A5
01AE 9009 LD R0,Y+
01AF 91F9 LD R31,Y+
01B0 91E9 LD R30,Y+
01B1 91B9 LD R27,Y+
01B2 91A9 LD R26,Y+
01B3 9624 ADIW R28,4
01B4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -