📄 rtc.lst
字号:
__start:
__text_start:
3B EFCF LDI R28,0xFF
3C E0D4 LDI R29,4
3D BFCD OUT 0x3D,R28
3E BFDE OUT 0x3E,R29
3F 51C0 SUBI R28,0x10
40 40D0 SBCI R29,0
41 EA0A LDI R16,0xAA
42 8308 STD Y+0,R16
43 2400 CLR R0
44 E0EA LDI R30,0xA
45 E0F1 LDI R31,1
46 E011 LDI R17,1
47 30EE CPI R30,0xE
48 07F1 CPC R31,R17
49 F011 BEQ 0x004C
4A 9201 ST R0,Z+
4B CFFB RJMP 0x0047
4C 8300 STD Z+0,R16
4D E6EC LDI R30,0x6C
4E E0F0 LDI R31,0
4F E0A0 LDI R26,0
50 E0B1 LDI R27,1
51 E010 LDI R17,0
52 37E6 CPI R30,0x76
53 07F1 CPC R31,R17
54 F021 BEQ 0x0059
55 95C8 LPM
56 9631 ADIW R30,1
57 920D ST R0,X+
58 CFF9 RJMP 0x0052
59 940E 04B8 CALL _main
_exit:
5B CFFF RJMP _exit
FILE: C:\TDdownload\zxy\169demo\169RTC\led.c
(0001) #include<iom169v.h>
(0002) const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
(0003) 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0004) unsigned char led_buff[4]={0,0,0,0};
(0005) /* 微秒级延时程序 */
(0006) void delay_us(int time)
(0007) {
(0008) do
(0009) {
(0010) time--;
_delay_us:
time --> R16
5C 5001 SUBI R16,1
5D 4010 SBCI R17,0
(0011) }
(0012) while (time>1);
5E E081 LDI R24,1
5F E090 LDI R25,0
60 1780 CP R24,R16
61 0791 CPC R25,R17
62 F3CC BLT 0x005C
63 9508 RET
_delay_ms:
time --> R20
64 934A ST R20,-Y
65 935A ST R21,-Y
66 01A8 MOVW R20,R16
(0013) }
(0014) /* 毫秒级延时程序 */
(0015) void delay_ms(unsigned int time)
(0016) {
67 C005 RJMP 0x006D
(0017) while(time!=0)
(0018) {
(0019) delay_us(1000);
68 EE08 LDI R16,0xE8
69 E013 LDI R17,3
6A DFF1 RCALL _delay_us
(0020) time--;
6B 5041 SUBI R20,1
6C 4050 SBCI R21,0
6D 3040 CPI R20,0
6E 0745 CPC R20,R21
6F F7C1 BNE 0x0068
70 9159 LD R21,Y+
71 9149 LD R20,Y+
72 9508 RET
_display:
n --> R20
73 934A ST R20,-Y
74 935A ST R21,-Y
(0021) }
(0022) }
(0023) void display(void)
(0024) {
(0025) unsigned char n;
(0026) DDRE=0xff;
75 EF8F LDI R24,0xFF
76 B98D OUT 0x0D,R24
(0027) PORTE=0xff;
77 B98E OUT 0x0E,R24
(0028) DDRB|=0xf0;
78 B184 IN R24,0x04
79 6F80 ORI R24,0xF0
7A B984 OUT 0x04,R24
(0029) PORTB|=0xf0;
7B B185 IN R24,0x05
7C 6F80 ORI R24,0xF0
7D B985 OUT 0x05,R24
(0030) for(n=0;n<3;n++)
7E 2744 CLR R20
7F C01C RJMP 0x009C
(0031) {
(0032)
(0033) PORTE=led_buff[n];
80 E080 LDI R24,0
81 E091 LDI R25,1
82 2FE4 MOV R30,R20
83 27FF CLR R31
84 0FE8 ADD R30,R24
85 1FF9 ADC R31,R25
86 8020 LDD R2,Z+0
87 B82E OUT 0x0E,R2
(0034) PORTB&=~(1<<(n+4));
88 2F14 MOV R17,R20
89 5F1C SUBI R17,0xFC
8A E001 LDI R16,1
8B 940E 04F7 CALL lsl8
8D 2E20 MOV R2,R16
8E 9420 COM R2
8F B035 IN R3,0x05
90 2032 AND R3,R2
91 B835 OUT 0x05,R3
(0035) delay_ms(1);
92 E001 LDI R16,1
93 E010 LDI R17,0
94 DFCF RCALL _delay_ms
(0036) PORTB|=0xf0;
95 B185 IN R24,0x05
96 6F80 ORI R24,0xF0
97 B985 OUT 0x05,R24
(0037) delay_us(100);
98 E604 LDI R16,0x64
99 E010 LDI R17,0
9A DFC1 RCALL _delay_us
9B 9543 INC R20
9C 3043 CPI R20,3
9D F310 BCS 0x0080
9E 9159 LD R21,Y+
9F 9149 LD R20,Y+
A0 9508 RET
FILE: C:\TDdownload\zxy\169demo\169RTC\rtc.c
(0001) // **************************************************************
(0002) // *** 广 州 天 河 双 龙 电 子 公 司 ***
(0003) // *** http://www.sl.com.cn ***
(0004) // *** 实验: RTC ***
(0005) // *** 作者:zxy@sl.com.cn ***
(0006) // *** 2006年3月28日 ***
(0007) // *** 目标MCU:MEGA169 晶振:内部(INT)8MHZ ***
(0008) // **************************************************************
(0009) //此实验需具备AD转换知识
(0010) //通过按键修改时钟值,S1为选位键,S2为增1,S4为减1
(0011) #include <iom169v.h>
(0012) #include <macros.h>
(0013) //键值定义,以目标实验板际测取键值范围为准
(0014) #define s1 (adc_old<0x03)
(0015) //200h
(0016) #define s2 ((adc_old>0x180)&&(adc_old<0x220))
(0017) //2a6h
(0018) #define s3 ((adc_old>0x290)&&(adc_old<0x2CF))
(0019) //2fbh
(0020) #define s4 ((adc_old>0x2D0)&&(adc_old<0x310))
(0021) //326h
(0022) #define s5 ((adc_old>0x310)&&(adc_old<0x345))
(0023) extern const unsigned char seg_table[16];
(0024) extern unsigned char led_buff[3];
(0025) extern void delay_ms(unsigned int time);
(0026) extern void display(void);
(0027) unsigned int adc_rel;//AD转换结果
(0028) unsigned int i=0,j=0,k=0;
(0029) //E、B口初始化
(0030) void portE_B(void)
(0031) {
(0032) DDRE=0xff;//E、B口初始化
_portE_B:
A1 EF8F LDI R24,0xFF
A2 B98D OUT 0x0D,R24
(0033) PORTE=0xff;
A3 B98E OUT 0x0E,R24
(0034) DDRB|=0xf0;
A4 B184 IN R24,0x04
A5 6F80 ORI R24,0xF0
A6 B984 OUT 0x04,R24
(0035) PORTD|=0xf0;
A7 B18B IN R24,0x0B
A8 6F80 ORI R24,0xF0
A9 B98B OUT 0x0B,R24
AA 9508 RET
(0036) }
(0037) //ADC初始化
(0038) void adc_init(void)
(0039) {
(0040) ADCSRA = 0x00; //设置前,先关闭ADC
_adc_init:
AB 2422 CLR R2
AC 9220 007A STS 0x007A,R2
(0041) ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC0
AE E481 LDI R24,0x41
AF 9380 007C STS 0x007C,R24
(0042) ACSR =(1<<ACD);//关闭模拟比较器,禁止位P148
B1 E880 LDI R24,0x80
B2 BF80 OUT 0x30,R24
(0043) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
B3 EC8E LDI R24,0xCE
B4 9380 007A STS 0x007A,R24
B6 9508 RET
(0044) }
(0045) //定时器初始化
(0046) void timer2_init(void)
(0047) {
(0048) TIMSK2 = 0x00;
_timer2_init:
B7 2422 CLR R2
B8 9220 0070 STS 0x0070,R2
(0049) ASSR = 1<<AS2; //异步时钟
BA E088 LDI R24,0x8
BB 9380 00B6 STS 0x00B6,R24
(0050) TCNT2 = 0xE0; //定时时间1秒
BD EE80 LDI R24,0xE0
BE 9380 00B2 STS 0x00B2,R24
(0051) TCCR2A = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
C0 E087 LDI R24,7
C1 9380 00B0 STS 0x00B0,R24
(0052) SEI();
C3 9478 BSET 7
C4 9508 RET
_adc_isr:
C5 938A ST R24,-Y
C6 939A ST R25,-Y
C7 B78F IN R24,0x3F
C8 938A ST R24,-Y
(0053) }
(0054)
(0055) #pragma interrupt_handler adc_isr:20 int_isr:6
(0056) //ADC完成中断
(0057) void adc_isr(void)
(0058) {
(0059) adc_rel=ADC&0x3ff;
C9 9180 0078 LDS R24,0x0078
CB 9190 0079 LDS R25,0x0079
CD 7093 ANDI R25,3
CE 9390 010D STS adc_rel+1,R25
D0 9380 010C STS adc_rel,R24
(0060) ADMUX=(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准
D2 E481 LDI R24,0x41
D3 9380 007C STS 0x007C,R24
(0061) ADCSRA|=(1<<ADSC);//启动AD转换
D5 9180 007A LDS R24,0x007A
D7 6480 ORI R24,0x40
D8 9380 007A STS 0x007A,R24
DA 9189 LD R24,Y+
DB BF8F OUT 0x3F,R24
DC 9199 LD R25,Y+
DD 9189 LD R24,Y+
DE 9518 RETI
_int_isr:
n --> Y,+1
DF 922A ST R2,-Y
E0 923A ST R3,-Y
E1 938A ST R24,-Y
E2 939A ST R25,-Y
E3 93EA ST R30,-Y
E4 93FA ST R31,-Y
E5 B62F IN R2,0x3F
E6 922A ST R2,-Y
(0062) }
(0063) //定时器中断
(0064) void int_isr(void)
(0065) { int n;
(0066) TCNT2 = 0xE0;
E7 EE80 LDI R24,0xE0
E8 9380 00B2 STS 0x00B2,R24
(0067) led_buff[0]=seg_table[i]; //个位
EA E58C LDI R24,0x5C
EB E090 LDI R25,0
EC 91E0 0104 LDS R30,i
EE 91F0 0105 LDS R31,i+1
F0 0FE8 ADD R30,R24
F1 1FF9 ADC R31,R25
F2 9024 LPM R2,261(Z)
F3 9220 0100 STS led_buff,R2
(0068) led_buff[1]=seg_table[j]; //十位
F5 91E0 0106 LDS R30,j
F7 91F0 0107 LDS R31,j+1
F9 0FE8 ADD R30,R24
FA 1FF9 ADC R31,R25
FB 9024 LPM R2,263(Z)
FC 9220 0101 STS led_buff+1,R2
(0069) led_buff[2]=seg_table[k]; //百位
FE 91E0 0108 LDS R30,k
100 91F0 0109 LDS R31,k+1
102 0FE8 ADD R30,R24
103 1FF9 ADC R31,R25
104 9024 LPM R2,265(Z)
105 9220 0102 STS led_buff+2,R2
(0070) i++;
107 9180 0104 LDS R24,i
109 9190 0105 LDS R25,i+1
10B 9601 ADIW R24,1
10C 9390 0105 STS i+1,R25
10E 9380 0104 STS i,R24
(0071) if(i==10) //十进位
110 308A CPI R24,0xA
111 E0E0 LDI R30,0
112 079E CPC R25,R30
113 F581 BNE 0x0144
(0072) {
(0073) i=0;
114 2422 CLR R2
115 2433 CLR R3
116 9230 0105 STS i+1,R3
118 9220 0104 STS i,R2
(0074) j++;
11A 9180 0106 LDS R24,j
11C 9190 0107 LDS R25,j+1
11E 9601 ADIW R24,1
11F 9390 0107 STS j+1,R25
121 9380 0106 STS j,R24
(0075) if(j==6) //六进位
123 3086 CPI R24,6
124 E0E0 LDI R30,0
125 079E CPC R25,R30
126 F4E9 BNE 0x0144
(0076) {
(0077) j=0;
127 9230 0107 STS j+1,R3
129 9220 0106 STS j,R2
(0078) k++;
12B 9180 0108 LDS R24,k
12D 9190 0109 LDS R25,k+1
12F 9601 ADIW R24,1
130 9390 0109 STS k+1,R25
132 9380 0108 STS k,R24
(0079) if(k==10) //十进位
134 308A CPI R24,0xA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -