📄 t0时钟.lst
字号:
__text_start:
__start:
0030 E5CF LDI R28,0x5F
0031 E0D4 LDI R29,4
0032 BFCD OUT 0x3D,R28
0033 BFDE OUT 0x3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD Y+0,R16
0038 2400 CLR R0
0039 E6E0 LDI R30,0x60
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 36E4 CPI R30,0x64
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD Z+0,R16
0042 E5EF LDI R30,0x5F
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 35EF CPI R30,0x5F
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E 940E00CD CALL _main
_exit:
0050 CFFF RJMP _exit
FILE: D:\M16开发板实验教程\icc-avr\T0CTCT~1\delay.h
(0001) #include<iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) /*-----------------------------------------------------------*/
(0005) /*-----------------------------------------------------------------------
(0006) 延时函数
(0007) 系统时钟:8M
(0008) -----------------------------------------------------------------------*/
(0009) void delay_1us(void) //1us延时函数
(0010) {
(0011) asm("nop");
_delay_1us:
0051 0000 NOP
0052 9508 RET
_delay_nus:
i --> R20
n --> R22
0053 940E0147 CALL push_gset2
0055 01B8 MOVW R22,R16
(0012) }
(0013)
(0014) void delay_nus(unsigned int n) //N us延时函数
(0015) {
(0016) unsigned int i=0;
0056 2744 CLR R20
0057 2755 CLR R21
(0017) for (i=0;i<n;i++)
0058 C003 RJMP 0x005C
(0018) delay_1us();
0059 DFF7 RCALL _delay_1us
005A 5F4F SUBI R20,0xFF
005B 4F5F SBCI R21,0xFF
005C 1746 CP R20,R22
005D 0757 CPC R21,R23
005E F3D0 BCS 0x0059
005F 940E013E CALL pop_gset2
0061 9508 RET
(0019) }
(0020)
(0021) void delay_1ms(void) //1ms延时函数
(0022) {
(0023) unsigned int i;
(0024) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0062 2700 CLR R16
0063 2711 CLR R17
0064 C002 RJMP 0x0067
0065 5F0F SUBI R16,0xFF
0066 4F1F SBCI R17,0xFF
0067 3704 CPI R16,0x74
0068 E0E4 LDI R30,4
0069 071E CPC R17,R30
006A F3D0 BCS 0x0065
006B 9508 RET
_delay_nms:
i --> R20
n --> R22
006C 940E0147 CALL push_gset2
006E 01B8 MOVW R22,R16
(0025) }
(0026)
(0027) void delay_nms(unsigned int n) //N ms延时函数
(0028) {
(0029) unsigned int i=0;
006F 2744 CLR R20
0070 2755 CLR R21
(0030) for (i=0;i<n;i++)
0071 C003 RJMP 0x0075
(0031) delay_1ms();
0072 DFEF RCALL _delay_1ms
0073 5F4F SUBI R20,0xFF
0074 4F5F SBCI R21,0xFF
0075 1746 CP R20,R22
0076 0757 CPC R21,R23
0077 F3D0 BCS 0x0072
0078 940E013E CALL pop_gset2
007A 9508 RET
_display:
number --> R20
007B 940E0149 CALL push_gset1
007D 01A8 MOVW R20,R16
FILE: D:\M16开发板实验教程\icc-avr\T0CTCT~1\shumaguan.h
(0001) /*
(0002) this file is the head file
(0003) */
(0004)
(0005)
(0006) #include<iom16v.h>
(0007) #include<macros.h>
(0008) #include"delay.h"
(0009) //macros.h 中有BIT(x) (1 << (x))定义, 比如 BIT(5)相当于将第5位置1
(0010)
(0011) const unsigned char discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
(0012) 0x82,0xf8,0x80,0x90,0xff}; //共阳数码管
(0013) /*--------------------------------------------------------*/
(0014) //para number: the number to be displayed
(0015) /*--------------------------------------------------------*/
(0016) void display(unsigned int number)
(0017) {
(0018)
(0019)
(0020)
(0021) PORTB &=~BIT(PORTB0); //light the first bit of the shumaguan
007E 98C0 CBI 0x18,0
(0022) //PORTB0 was defined in iom16v.h
(0023) PORTA=discode[number/1000]; //display the thousand bit
007F EE28 LDI R18,0xE8
0080 E033 LDI R19,3
0081 018A MOVW R16,R20
0082 940E0124 CALL div16u
0084 01F8 MOVW R30,R16
0085 E584 LDI R24,0x54
0086 E090 LDI R25,0
0087 0FE8 ADD R30,R24
0088 1FF9 ADC R31,R25
0089 91E4 LPM R30,0(Z)
008A BBEB OUT 0x1B,R30
(0024) delay_nms(5);
008B E005 LDI R16,5
008C E010 LDI R17,0
008D DFDE RCALL _delay_nms
(0025) PORTB |=BIT(PORTB0); //turn off the first bit of the shumaguan
008E 9AC0 SBI 0x18,0
(0026)
(0027) PORTB &=~BIT(PORTB1);
008F 98C1 CBI 0x18,1
(0028) PORTA=discode[number/100%10];
0090 E624 LDI R18,0x64
0091 E030 LDI R19,0
0092 018A MOVW R16,R20
0093 940E0124 CALL div16u
0095 E02A LDI R18,0xA
0096 E030 LDI R19,0
0097 940E0122 CALL mod16u
0099 01F8 MOVW R30,R16
009A E584 LDI R24,0x54
009B E090 LDI R25,0
009C 0FE8 ADD R30,R24
009D 1FF9 ADC R31,R25
009E 91E4 LPM R30,0(Z)
009F BBEB OUT 0x1B,R30
(0029) delay_nms(5);
00A0 E005 LDI R16,5
00A1 E010 LDI R17,0
00A2 DFC9 RCALL _delay_nms
(0030) PORTB |=BIT(PORTB1);
00A3 9AC1 SBI 0x18,1
(0031)
(0032) PORTB &=~BIT(PORTB2);
00A4 98C2 CBI 0x18,2
(0033) PORTA=discode[number%100/10];
00A5 E624 LDI R18,0x64
00A6 E030 LDI R19,0
00A7 018A MOVW R16,R20
00A8 940E0122 CALL mod16u
00AA E02A LDI R18,0xA
00AB E030 LDI R19,0
00AC 940E0124 CALL div16u
00AE 01F8 MOVW R30,R16
00AF E584 LDI R24,0x54
00B0 E090 LDI R25,0
00B1 0FE8 ADD R30,R24
00B2 1FF9 ADC R31,R25
00B3 91E4 LPM R30,0(Z)
00B4 BBEB OUT 0x1B,R30
(0034) delay_nms(5);
00B5 E005 LDI R16,5
00B6 E010 LDI R17,0
00B7 DFB4 RCALL _delay_nms
(0035) PORTB |=BIT(PORTB2);
00B8 9AC2 SBI 0x18,2
(0036)
(0037) PORTB &=~BIT(PORTB3);
00B9 98C3 CBI 0x18,3
(0038) PORTA=discode[number%10];
00BA E02A LDI R18,0xA
00BB E030 LDI R19,0
00BC 018A MOVW R16,R20
00BD 940E0122 CALL mod16u
00BF 01F8 MOVW R30,R16
00C0 E584 LDI R24,0x54
00C1 E090 LDI R25,0
00C2 0FE8 ADD R30,R24
00C3 1FF9 ADC R31,R25
00C4 91E4 LPM R30,0(Z)
00C5 BBEB OUT 0x1B,R30
(0039) delay_nms(5);
00C6 E005 LDI R16,5
00C7 E010 LDI R17,0
00C8 DFA3 RCALL _delay_nms
(0040) PORTB |=BIT(PORTB3);
00C9 9AC3 SBI 0x18,3
00CA 940E014C CALL pop_gset1
00CC 9508 RET
FILE: D:\M16开发板实验教程\icc-avr\T0CTCT~1\T0时钟.c
(0001) /*
(0002) Title: icc-avr timer0 ctc timer
(0003) Author: dushibiao
(0004) Date: 2007 10 18
(0005) Purpose: use timer0 ctc mode to generate a timer
(0006) Frequency: Ext 8M
(0007) Software: icc-avr
(0008) Hardware: AVR mega16 BOARD
(0009) Connect: dushibiao@126.com
(0010) */
(0011) //内部8M晶振,T0 CTC方式 DUSHIBIAO 2007 7 7
(0012)
(0013) #include<iom16v.h>
(0014) #include<macros.h>
(0015) #include "shumaguan.h"
(0016) #define uint unsigned int
(0017) #define uchar unsigned char
(0018)
(0019) uint micsec; //毫秒
(0020) uchar second, minute;
(0021)
(0022) void initial(void);
(0023)
(0024) void main()
(0025) {
(0026) initial();
_main:
disvalue --> R20
00CD D00F RCALL _initial
00CE C00C RJMP 0x00DB
(0027)
(0028) while(1)
(0029) {
(0030) unsigned int disvalue;
(0031) disvalue=(unsigned int)minute*100+second;
00CF 90200060 LDS R2,minute
00D1 E684 LDI R24,0x64
00D2 9D82 MUL R24,R2
00D3 01A0 MOVW R20,R0
00D4 90200061 LDS R2,second
00D6 2433 CLR R3
00D7 0D42 ADD R20,R2
00D8 1D53 ADC R21,R3
(0032) display(disvalue);
00D9 018A MOVW R16,R20
00DA DFA0 RCALL _display
00DB CFF3 RJMP 0x00CF
00DC 9508 RET
(0033) }
(0034)
(0035) }
(0036) /*-------------------------------------------------------------
(0037) fuction: initialize ports and timer0 register
(0038) --------------------------------------------------------------*/
(0039) void initial(void)
(0040) {
(0041) PORTA=0XFF; //A口初始化
_initial:
00DD EF8F LDI R24,0xFF
00DE BB8B OUT 0x1B,R24
(0042) DDRA=0XFF; //out
00DF BB8A OUT 0x1A,R24
(0043) PORTB=0XFF; //B口初始化
00E0 BB88 OUT 0x18,R24
(0044) DDRB=0XFF;
00E1 BB87 OUT 0x17,R24
(0045) PORTC=0XFF; //其它口上拉电阻有效
00E2 BB85 OUT 0x15,R24
(0046) PORTD=0XFF;
00E3 BB82 OUT 0x12,R24
(0047) _SEI();
00E4 9478 BSET 7
(0048) OCR0=249; //定时250us ORC0+1
00E5 EF89 LDI R24,0xF9
00E6 BF8C OUT 0x3C,R24
(0049) TIMSK|=(1<<OCIE0); //比较匹配中断允许
00E7 B789 IN R24,0x39
00E8 6082 ORI R24,2
00E9 BF89 OUT 0x39,R24
(0050) TCCR0|=(1<<WGM01)|(1<<CS01); //CTC模式,8分频
00EA B783 IN R24,0x33
00EB 608A ORI R24,0xA
00EC BF83 OUT 0x33,R24
00ED 9508 RET
_T0INT:
00EE 922A ST R2,-Y
00EF 923A ST R3,-Y
00F0 938A ST R24,-Y
00F1 939A ST R25,-Y
00F2 93EA ST R30,-Y
00F3 B62F IN R2,0x3F
00F4 922A ST R2,-Y
(0051) /*---------------------------------------------------------
(0052) TCCR0
(0053) 7: FOC0--------Force Output Campare
(0054) 6,3 WGM01:0-----Waveform Generator Mode
(0055) 00----------Normal
(0056) 01----------PWM,Phase Correct
(0057) 10----------CTC
(0058) 11----------Fast PWM
(0059) 5,4 COM11:0-----Compare Match Output Mode
(0060) ----------------------------------------
(0061) Non PWM mode
(0062) ----------------------------------------
(0063) 00----------Normal Port Operation, OC0 disconnected
(0064) 01----------Toggle OC0 on compare match
(0065) 10----------Clear OC0 on compare match
(0066) 11----------Set OC0 on compare match
(0067) 2--0 CS02:0------Clock Select
(0068) 000---------None clock select
(0069) 001---------clk(io)
(0070) 010---------clk(io)/8
(0071) 011---------clk(io)/64
(0072) 100---------clk(io)/256
(0073) 101---------clk(io)/1024
(0074) 110---------T0 pin,falling edge
(0075) 111---------T0 pin,rising edge
(0076) ----------------------------------------------------------*/
(0077) }
(0078)
(0079) /*------------------------------------------------------------
(0080) function: interrupt service routine,it increases micsec,minute
(0081) second , and the main loop routine display the current
(0082) time
(0083) -------------------------------------------------------------*/
(0084)
(0085) #pragma interrupt_handler T0INT: iv_TIMER0_COMP
(0086) void T0INT(void)
(0087) {
(0088) micsec += 1;
00F5 91800062 LDS R24,micsec
00F7 91900063 LDS R25,micsec+1
00F9 9601 ADIW R24,1
00FA 93900063 STS micsec+1,R25
00FC 93800062 STS micsec,R24
(0089) if(micsec==4000)
00FE 3A80 CPI R24,0xA0
00FF E0EF LDI R30,0xF
0100 079E CPC R25,R30
0101 F4C1 BNE 0x011A
(0090) {
(0091) micsec=0;
0102 2422 CLR R2
0103 2433 CLR R3
0104 92300063 STS micsec+1,R3
0106 92200062 STS micsec,R2
(0092) second +=1 ;
0108 91800061 LDS R24,second
010A 5F8F SUBI R24,0xFF
010B 93800061 STS second,R24
(0093) if(second==60)
010D 338C CPI R24,0x3C
010E F459 BNE 0x011A
(0094) {
(0095) second = 0;
010F 92200061 STS second,R2
(0096) minute += 1 ;
0111 91800060 LDS R24,minute
0113 5F8F SUBI R24,0xFF
0114 93800060 STS minute,R24
(0097) if(minute==60)
0116 338C CPI R24,0x3C
0117 F411 BNE 0x011A
(0098) minute=0;
0118 92200060 STS minute,R2
(0099) }
(0100) }
FILE: <library>
011A 9029 LD R2,Y+
011B BE2F OUT 0x3F,R2
011C 91E9 LD R30,Y+
011D 9199 LD R25,Y+
011E 9189 LD R24,Y+
011F 9039 LD R3,Y+
0120 9029 LD R2,Y+
0121 9518 RETI
mod16u:
0122 9468 BSET 6
0123 C001 RJMP xdiv16u
div16u:
0124 94E8 BCLR 6
xdiv16u:
0125 92EA ST R14,-Y
0126 92FA ST R15,-Y
0127 938A ST R24,-Y
0128 24EE CLR R14
0129 24FF CLR R15
012A E180 LDI R24,0x10
012B 0F00 LSL R16
012C 1F11 ROL R17
012D 1CEE ROL R14
012E 1CFF ROL R15
012F 16E2 CP R14,R18
0130 06F3 CPC R15,R19
0131 F018 BCS 0x0135
0132 1AE2 SUB R14,R18
0133 0AF3 SBC R15,R19
0134 9503 INC R16
0135 958A DEC R24
0136 F7A1 BNE 0x012B
0137 F416 BRTC 0x013A
0138 2D0E MOV R16,R14
0139 2D1F MOV R17,R15
013A 9189 LD R24,Y+
013B 90F9 LD R15,Y+
013C 90E9 LD R14,Y+
013D 9508 RET
pop_gset2:
013E E0E2 LDI R30,2
013F 940C014D JMP pop
push_gset5:
0141 92FA ST R15,-Y
0142 92EA ST R14,-Y
push_gset4:
0143 92DA ST R13,-Y
0144 92CA ST R12,-Y
push_gset3:
0145 92BA ST R11,-Y
0146 92AA ST R10,-Y
push_gset2:
0147 937A ST R23,-Y
0148 936A ST R22,-Y
push_gset1:
0149 935A ST R21,-Y
014A 934A ST R20,-Y
014B 9508 RET
pop_gset1:
014C E0E1 LDI R30,1
pop:
014D 9149 LD R20,Y+
014E 9159 LD R21,Y+
014F FDE0 SBRC R30,0
0150 9508 RET
0151 9169 LD R22,Y+
0152 9179 LD R23,Y+
0153 FDE1 SBRC R30,1
0154 9508 RET
0155 90A9 LD R10,Y+
0156 90B9 LD R11,Y+
0157 FDE2 SBRC R30,2
0158 9508 RET
0159 90C9 LD R12,Y+
015A 90D9 LD R13,Y+
015B FDE3 SBRC R30,3
015C 9508 RET
015D 90E9 LD R14,Y+
015E 90F9 LD R15,Y+
015F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -