📄 main.lst
字号:
ARM COMPILER V2.50a, main 25/04/06 04:24:57 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE main
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe main.c ARM BROWSE DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 main.c file
3
4 ADuC7027的第九个实验——定时计数器
5
6 作者:Computer-lov
7 建立日期:2006-4-25
8 修改日期:2006-4-25
9 版本:V1.0
10 版权所有,盗版必究。
11 任何技术问题可到我的博客上留言: http://computer00.21ic.org
12 Copyright(C) Computer-lov 2006-2016
13 All rights reserved
14 **********************************************************************************************/
15
16
17 #include <ADuC7027.H>
18 #include <../my_type.h>
19 #include "LED.H"
20 #include "interrupt.h"
21 #include "Timer.h"
22 #include "UART.H"
23
24 /*********************************************************************************************/
25 void SysClkInit(void)
26 {
27 1 PLLKEY1=0xAA;
28 1 PLLCON=0x01; //PLL配置
29 1 PLLKEY2=0x55;
30 1 POWKEY1=0x01;
31 1 POWCON=0x00; //CPU时钟配置为41.78MHz
32 1 POWKEY2=0xF4;
33 1 // while(!(PLLSTA & 0x01));
34 1 }
35 ///////////////////////////////////////////////////////////////////////////////////////////////
36
37
38 /*********************************************************************************************/
39 void IRQ_Handler(void) __irq //IRQ中断服务程序
40 {
41 1
42 1 if(IRQSTA & TIMER1) //Timer0中断.每24小时中断一次
43 1 {
44 2 T1CLRI=0; //清中断
45 2 // RealDate.Day++;
46 2 return;
47 2 }
48 1
49 1
50 1 if(IRQSTA & TIMER2) //读取IRQ中断状态,判断IRQ中断源
51 1 { //Timer2中断
52 2 T2CLRI=0; //清中断
53 2 if(LED6STAT)
54 2 {
55 3 ON_LED6(); //如果LED6灭的,则点亮它
56 3 }
57 2 else
58 2 {
59 3 OFF_LED6(); //如果LED6亮的,则熄灭它
ARM COMPILER V2.50a, main 25/04/06 04:24:57 PAGE 2
60 3 }
61 2 return;
62 2 }
63 1
64 1
65 1 if(IRQSTA & TIMER3) //读取IRQ中断状态,判断IRQ中断源
66 1 { //Timer2中断
67 2 T3CLRI=0;
68 2 if(LED7STAT)
69 2 {
70 3 ON_LED7(); //如果LED7灭的,则点亮它
71 3 }
72 2 else
73 2 {
74 3 OFF_LED7(); //如果LED7亮的,则熄灭它
75 3 }
76 2 return;
77 2 }
78 1 }
79 ///////////////////////////////////////////////////////////////////////////////////////////////
80
81
82 /*********************************************************************************************/
83 void FIQ_Handler(void) __fiq //FIQ中断服务程序
84 {
85 1 if(FIQSTA & TIMER0) //读取FIQ中断状态,判断FIQ中断源
86 1 { //Timer0中断
87 2 GP0CLR=(1<<(6+16)); //在P0.6上产生一个上升沿,给Timer1提供1/128秒的时钟信号
88 2 GP0SET=(1<<(6+16));
89 2 T0CLRI=0; //清Timer0中断
90 2 if(LED4STAT)
91 2 {
92 3 ON_LED4(); //如果LED4灭的,则点亮它
93 3 }
94 2 else
95 2 {
96 3 OFF_LED4(); //如果LED4亮的,则熄灭它
97 3 }
98 2 return;
99 2 }
100 1 }
101 ///////////////////////////////////////////////////////////////////////////////////////////////
102
103
104 union
105 {
106 uint32 TimeData;
107 time_type Time;
108 }RealTime;
109
110 /*********************************************************************************************/
111 void DisplayTime(void)
112 {
113 1 static uint32 OldSecond; //用来判断是否需要更新显示
114 1
115 1 if(OldSecond==RealTime.Time.Second) //如果秒值没有变化,则不用刷新时间
116 1 {
117 2 return;
118 2 }
119 1
120 1 OldSecond=RealTime.Time.Second; //如果秒值发生了变化,则需要刷新,并保存当前秒值
121 1
122 1 if(LED5STAT) //控制LED5每秒闪烁一次
123 1 {
124 2 ON_LED5();
125 2 }
ARM COMPILER V2.50a, main 25/04/06 04:24:57 PAGE 3
126 1 else
127 1 {
128 2 OFF_LED5();
129 2 }
130 1
131 1 send_a_byte(RealTime.Time.Hour/10+'0'); //显示小时
132 1 send_a_byte(RealTime.Time.Hour%10+'0');
133 1 send_a_byte(':');
134 1 send_a_byte(RealTime.Time.Minute/10+'0'); //显示分
135 1 send_a_byte(RealTime.Time.Minute%10+'0');
136 1 send_a_byte(':');
137 1 send_a_byte(RealTime.Time.Second/10+'0'); //显示秒
138 1 send_a_byte(RealTime.Time.Second%10+'0');
139 1 // send_a_byte(':');
140 1 // send_a_byte(RealTime.Time.Hundredths/10+'0');
141 1 // send_a_byte(RealTime.Time.Hundredths%10+'0');
142 1 prints("",1);
143 1 }
144 ///////////////////////////////////////////////////////////////////////////////////////////////
145
146 /*********************************************************************************************/
147 void main(void)
148 {
149 1 SysClkInit();
150 1 UART_init();
151 1 cls();
152 1
153 1 EN_LED4();
154 1 EN_LED5();
155 1 EN_LED6();
156 1 EN_LED7();
157 1 OFF_LED4();
158 1 OFF_LED5();
159 1 OFF_LED6();
160 1 OFF_LED7();
161 1
162 1 Timer0Init();
163 1 Timer1Init();
164 1 Timer2Init();
165 1 Timer3Init();
166 1
167 1
168 1 prints("System Start......",1);
169 1
170 1 while(1)
171 1 {
172 2 RealTime.TimeData=T1VAL; //读回定时器1的值
173 2 DisplayTime(); //显示时间
174 2 }
175 1 }
176 ///////////////////////////////////////////////////////////////////////////////////////////////
ARM COMPILER V2.50a, main 25/04/06 04:24:57 PAGE 4
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE32 (Timer0Init?A)
EXTERN CODE32 (Timer1Init?A)
EXTERN CODE32 (Timer2Init?A)
EXTERN CODE32 (Timer3Init?A)
EXTERN CODE32 (UART_init?A)
EXTERN CODE32 (send_a_byte?A)
EXTERN CODE32 (prints?A)
EXTERN CODE32 (cls?A)
EXTERN CODE32 (?C?SDIV?A)
EXTERN NUMBER (__startup)
*** PUBLICS:
PUBLIC SysClkInit?A
PUBLIC IRQ_Handler?A
PUBLIC FIQ_Handler?A
PUBLIC DisplayTime?A
PUBLIC main
PUBLIC RealTime
*** DATA SEGMENT '?CON?main':
00000000 ??S_2:
00000000 DB 'System Start......',0x00
00000013 ??S_1:
00000013 DB 0x00
*** DATA SEGMENT '?DT0?main':
00000000 RealTime:
00000000 DS 8
00000008 OldSecond:
00000008 DS 4
*** CODE SEGMENT '?PR?SysClkInit?A?main':
27: PLLKEY1=0xAA;
00000000 E3A010AA MOV R1,#0xAA
00000004 E5100000 LDR R0,=0xFFFF0410
00000008 E5801000 STR R1,[R0,#0x0]
28: PLLCON=0x01; //PLL配置
0000000C E3A01001 MOV R1,#0x1
00000010 E5100000 LDR R0,=0xFFFF0414
00000014 E5801000 STR R1,[R0,#0x0]
29: PLLKEY2=0x55;
00000018 E3A02055 MOV R2,#0x55
0000001C E5100000 LDR R0,=0xFFFF0418
00000020 E5802000 STR R2,[R0,#0x0]
30: POWKEY1=0x01;
00000024 E5100000 LDR R0,=0xFFFF0404
00000028 E5801000 STR R1,[R0,#0x0]
31: POWCON=0x00; //CPU时钟配置为41.78MHz
0000002C E3A01000 MOV R1,#0x0
00000030 E5100000 LDR R0,=0xFFFF0408
00000034 E5801000 STR R1,[R0,#0x0]
32: POWKEY2=0xF4;
00000038 E3A010F4 MOV R1,#0xF4
0000003C E5100000 LDR R0,=0xFFFF040C
00000040 E5801000 STR R1,[R0,#0x0]
34: }
00000044 E12FFF1E BX R14
00000048 ENDP ; 'SysClkInit?A'
*** CODE SEGMENT '?PR?IRQ_Handler?A?main':
39: void IRQ_Handler(void) __irq //IRQ中断服务程序
00000000 E92D0003 STMDB R13!,{R0-R1}
42: if(IRQSTA & TIMER1) //Timer0中断.每24小时中断一次
00000004 E5100000 LDR R0,=0xFFFF0000
ARM COMPILER V2.50a, main 25/04/06 04:24:57 PAGE 5
00000008 E5900000 LDR R0,[R0,#0x0]
0000000C E3100008 TST R0,#0x0008
00000010 0A000003 BEQ L_1 ; Targ=0x24
44: T1CLRI=0; //清中断
00000014 E3A01000 MOV R1,#0x0
00000018 E5100000 LDR R0,=0xFFFF032C
0000001C E5801000 STR R1,[R0,#0x0]
46: return;
00000020 EA000024 B L_2 ; Targ=0xB8
47: }
00000024 L_1:
50: if(IRQSTA & TIMER2) //读取IRQ中断状态,判断IRQ中断源
00000024 E5100000 LDR R0,=0xFFFF0000
00000028 E5900000 LDR R0,[R0,#0x0]
0000002C E3100010 TST R0,#0x0010
00000030 0A00000E BEQ L_3 ; Targ=0x70
52: T2CLRI=0; //清中断
00000034 E3A01000 MOV R1,#0x0
00000038 E5100000 LDR R0,=0xFFFF034C
0000003C E5801000 STR R1,[R0,#0x0]
53: if(LED6STAT)
00000040 E5100000 LDR R0,=0xFFFFF450
00000044 E5900000 LDR R0,[R0,#0x0]
00000048 E3100701 TST R0,#0x40000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -