📄 timer0.lst
字号:
__start:
__text_start:
2C E5CF LDI R28,0x5F
2D E0D4 LDI R29,4
2E BFCD OUT 0x3D,R28
2F BFDE OUT 0x3E,R29
30 51C0 SUBI R28,0x10
31 40D0 SBCI R29,0
32 EA0A LDI R16,0xAA
33 8308 STD Y+0,R16
34 2400 CLR R0
35 E6E4 LDI R30,0x64
36 E0F0 LDI R31,0
37 E010 LDI R17,0
38 36E4 CPI R30,0x64
39 07F1 CPC R31,R17
3A F011 BEQ 0x003D
3B 9201 ST R0,Z+
3C CFFB RJMP 0x0038
3D 8300 STD Z+0,R16
3E E5E4 LDI R30,0x54
3F E0F0 LDI R31,0
40 E6A0 LDI R26,0x60
41 E0B0 LDI R27,0
42 E010 LDI R17,0
43 E000 LDI R16,0
44 BF0B OUT 0x3B,R16
45 35E8 CPI R30,0x58
46 07F1 CPC R31,R17
47 F021 BEQ 0x004C
48 95C8 LPM
49 9631 ADIW R30,1
4A 920D ST R0,X+
4B CFF9 RJMP 0x0045
4C 940E 0109 CALL _main
_exit:
4E CFFF RJMP _exit
_send_byte:
i --> R20
out_byte --> R10
4F 92AA ST R10,-Y
50 934A ST R20,-Y
51 2EA0 MOV R10,R16
FILE: F:\WORKS\AVRSIM~1\TIMER0~1\timer0.c
(0001) //ICC-AVR application builder : 2007-12-14 下午 03:35:52
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include<slavr.h>
(0008) unsigned char hour=0;
(0009) unsigned char minute=0;
(0010) unsigned char second=0;
(0011) unsigned char counter=0;
(0012) //*******************发送字节*******************
(0013) void send_byte( unsigned char out_byte)
(0014) {
(0015) unsigned char i;
(0016) for (i=0;i<8;i++)
52 2744 CLR R20
53 C011 RJMP 0x0065
(0017) {
(0018) if (out_byte&0x80)
54 FEA7 SBRS R10,7
55 C002 RJMP 0x0058
(0019) {
(0020) PORTB|=BIT(PB1); //置1data
56 9AC1 SBI 0x18,1
(0021) }
57 C001 RJMP 0x0059
(0022) else
(0023) {
(0024) PORTB&=~BIT(PB1);//清零
58 98C1 CBI 0x18,1
(0025) }
(0026) PORTB|=BIT(PB2);//置1
59 9AC2 SBI 0x18,2
(0027) out_byte<<=1;
5A 0CAA LSL R10
(0028) delay_us(30);//20//32//30
5B E10E LDI R16,0x1E
5C E010 LDI R17,0
5D 940E 010D CALL _delay_us
(0029) PORTB&=~BIT(PB2); //清零
5F 98C2 CBI 0x18,2
(0030) delay_us(30);//32//30
60 E10E LDI R16,0x1E
61 E010 LDI R17,0
62 940E 010D CALL _delay_us
64 9543 INC R20
65 3048 CPI R20,0x8
66 F368 BCS 0x0054
(0031) }
(0032) PORTB&=~BIT(PB1);//清零
67 98C1 CBI 0x18,1
68 9149 LD R20,Y+
69 90A9 LD R10,Y+
6A 9508 RET
_write7279:
dta --> R10
cmd --> R12
6B 92AA ST R10,-Y
6C 92CA ST R12,-Y
6D 2EA2 MOV R10,R18
6E 2EC0 MOV R12,R16
(0033) //delay_us(50);
(0034) //PORTB|=BIT(PB3);//清零cs1
(0035)
(0036) }
(0037) //*******************写入7279*******************
(0038)
(0039)
(0040) //**********************************************
(0041) void write7279(unsigned char cmd, char dta ) //写入7279
(0042) {
(0043) CLI();
6F 94F8 BCLR 7
(0044) delay_us(62);//50//55//62
70 E30E LDI R16,0x3E
71 E010 LDI R17,0
72 940E 010D CALL _delay_us
(0045) send_byte (cmd);
74 2D0C MOV R16,R12
75 DFD9 RCALL _send_byte
(0046) delay_us(33);//20//28//33
76 E201 LDI R16,0x21
77 E010 LDI R17,0
78 940E 010D CALL _delay_us
(0047) send_byte (dta);
7A 2D0A MOV R16,R10
7B DFD3 RCALL _send_byte
(0048) SEI();
7C 9478 BSET 7
7D 90C9 LD R12,Y+
7E 90A9 LD R10,Y+
7F 9508 RET
(0049) }
(0050) void display(void)
(0051) {
(0052) write7279(0x83,second%10);//
_display:
80 E01A LDI R17,0xA
81 9100 0062 LDS R16,second
83 940E 0115 CALL mod8u
85 2F20 MOV R18,R16
86 E803 LDI R16,0x83
87 DFE3 RCALL _write7279
(0053) write7279(0x82,second/10);
88 E01A LDI R17,0xA
89 9100 0062 LDS R16,second
8B 940E 0117 CALL div8u
8D 2F20 MOV R18,R16
8E E802 LDI R16,0x82
8F DFDB RCALL _write7279
(0054) write7279(0x81,minute%10);
90 E01A LDI R17,0xA
91 9100 0061 LDS R16,minute
93 940E 0115 CALL mod8u
95 2F20 MOV R18,R16
96 E801 LDI R16,0x81
97 DFD3 RCALL _write7279
(0055) write7279(0x80,minute/10);
98 E01A LDI R17,0xA
99 9100 0061 LDS R16,minute
9B 940E 0117 CALL div8u
9D 2F20 MOV R18,R16
9E E800 LDI R16,0x80
9F DFCB RCALL _write7279
(0056) write7279(0x85,hour%10);
A0 E01A LDI R17,0xA
A1 9100 0060 LDS R16,hour
A3 940E 0115 CALL mod8u
A5 2F20 MOV R18,R16
A6 E805 LDI R16,0x85
A7 DFC3 RCALL _write7279
(0057) write7279(0x84,hour/10);
A8 E01A LDI R17,0xA
A9 9100 0060 LDS R16,hour
AB 940E 0117 CALL div8u
AD 2F20 MOV R18,R16
AE E804 LDI R16,0x84
AF DFBB RCALL _write7279
B0 9508 RET
(0058) }
(0059) void port_init(void)
(0060) {
(0061) PORTA = 0x00;
_port_init:
B1 2422 CLR R2
B2 BA2B OUT 0x1B,R2
(0062) DDRA = 0x00;
B3 BA2A OUT 0x1A,R2
(0063) PORTB = 0x06;
B4 E086 LDI R24,6
B5 BB88 OUT 0x18,R24
(0064) DDRB = 0x0E;
B6 E08E LDI R24,0xE
B7 BB87 OUT 0x17,R24
(0065) PORTC = 0x00; //m103 output only
B8 BA25 OUT 0x15,R2
(0066) DDRC = 0x00;
B9 BA24 OUT 0x14,R2
(0067) PORTD = 0x00;
BA BA22 OUT 0x12,R2
(0068) DDRD = 0x00;
BB BA21 OUT 0x11,R2
BC 9508 RET
(0069) }
(0070)
(0071) //TIMER0 initialize - prescale:1024
(0072) // WGM: Normal
(0073) // desired value: 10mSec
(0074) // actual value: 9.984mSec (0.2%)
(0075) void timer0_init(void)
(0076) {
(0077) TCCR0 = 0x00; //stop
_timer0_init:
BD 2422 CLR R2
BE BE23 OUT 0x33,R2
(0078) TCNT0 = 0xB2; //set count
BF EB82 LDI R24,0xB2
C0 BF82 OUT 0x32,R24
(0079) OCR0 = 0x4E; //set compare
C1 E48E LDI R24,0x4E
C2 BF8C OUT 0x3C,R24
(0080) TCCR0 = 0x05; //start timer
C3 E085 LDI R24,5
C4 BF83 OUT 0x33,R24
C5 9508 RET
_timer0_ovf_isr:
C6 922A ST R2,-Y
C7 938A ST R24,-Y
C8 939A ST R25,-Y
C9 B62F IN R2,0x3F
CA 922A ST R2,-Y
(0081) }
(0082)
(0083) #pragma interrupt_handler timer0_ovf_isr:10
(0084) void timer0_ovf_isr(void)
(0085) {
(0086) TCNT0 = 0xB2; //reload counter value
CB EB82 LDI R24,0xB2
CC BF82 OUT 0x32,R24
(0087) if (counter<10) counter++;
CD 9180 0063 LDS R24,counter
CF 308A CPI R24,0xA
D0 F420 BCC 0x00D5
D1 5F8F SUBI R24,0xFF
D2 9380 0063 STS counter,R24
D4 C024 RJMP 0x00F9
(0088) else {counter=0 ;
D5 2422 CLR R2
D6 9220 0063 STS counter,R2
(0089) if (second<60) second++;
D8 9180 0062 LDS R24,second
DA 338C CPI R24,0x3C
DB F420 BCC 0x00E0
DC 5F8F SUBI R24,0xFF
DD 9380 0062 STS second,R24
DF C019 RJMP 0x00F9
(0090) else {second=0 ;
E0 2422 CLR R2
E1 9220 0062 STS second,R2
(0091) if (minute<60) minute++;
E3 9180 0061 LDS R24,minute
E5 338C CPI R24,0x3C
E6 F420 BCC 0x00EB
E7 5F8F SUBI R24,0xFF
E8 9380 0061 STS minute,R24
EA C00E RJMP 0x00F9
(0092) else {minute=0;
EB 2422 CLR R2
EC 9220 0061 STS minute,R2
(0093) if (hour<24) hour++;
EE 9180 0060 LDS R24,hour
F0 3188 CPI R24,0x18
F1 F420 BCC 0x00F6
F2 5F8F SUBI R24,0xFF
F3 9380 0060 STS hour,R24
F5 C003 RJMP 0x00F9
(0094) else hour=0;
F6 2422 CLR R2
F7 9220 0060 STS hour,R2
(0095) }
(0096) }
(0097) }
F9 9029 LD R2,Y+
FA BE2F OUT 0x3F,R2
FB 9199 LD R25,Y+
FC 9189 LD R24,Y+
FD 9029 LD R2,Y+
FE 9518 RETI
(0098) }
(0099)
(0100) //call this routine to initialize all peripherals
(0101) void init_devices(void)
(0102) {
(0103) //stop errant interrupts until set up
(0104) CLI(); //disable all interrupts
_init_devices:
FF 94F8 BCLR 7
(0105) port_init();
100 DFB0 RCALL _port_init
(0106) timer0_init();
101 DFBB RCALL _timer0_init
(0107)
(0108) MCUCR = 0x00;
102 2422 CLR R2
103 BE25 OUT 0x35,R2
(0109) GICR = 0x00;
104 BE2B OUT 0x3B,R2
(0110) TIMSK = 0x01; //timer interrupt sources
105 E081 LDI R24,1
106 BF89 OUT 0x39,R24
(0111) SEI(); //re-enable interrupts
107 9478 BSET 7
108 9508 RET
(0112) //all peripherals are now initialized
(0113) }
(0114) void main(void)
(0115) {
(0116) init_devices();
_main:
109 DFF5 RCALL _init_devices
(0117) for(;;)
(0118) display();
FILE: <library>
10A DF75 RCALL _display
10B CFFE RJMP 0x010A
10C 9508 RET
_delay_us:
10D 5001 SUBI R16,1
10E 4010 SBCI R17,0
10F E081 LDI R24,1
110 E090 LDI R25,0
111 1780 CP R24,R16
112 0791 CPC R25,R17
113 F3CC BLT 0x010D
114 9508 RET
mod8u:
115 9468 BSET 6
116 C001 RJMP xdiv8u
div8u:
117 94E8 BCLR 6
xdiv8u:
118 932A ST R18,-Y
119 92FA ST R15,-Y
11A 92EA ST R14,-Y
11B 24FF CLR R15
11C 24EE CLR R14
11D E120 LDI R18,0x10
11E 0F00 LSL R16
11F 1CFF ROL R15
120 1CEE ROL R14
121 16E1 CP R14,R17
122 F010 BCS 0x0125
123 1AE1 SUB R14,R17
124 9503 INC R16
125 952A DEC R18
126 F7B9 BNE 0x011E
127 F40E BRTC 0x0129
128 2D0E MOV R16,R14
129 90E9 LD R14,Y+
12A 90F9 LD R15,Y+
12B 9129 LD R18,Y+
12C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -