?? wds12887led8.lst
字號:
C51 COMPILER V7.05 WDS12887LED8 02/14/2006 08:52:14 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE WDS12887LED8
OBJECT MODULE PLACED IN WDS12887LED8.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe WDS12887LED8.c DB OE
stmt level source
1 //參考程序B. WDS12887LED8.c程序功能:讀取時鐘值,并將時,分,秒顯示在數碼管上. 可以實現時鐘初始化(授時)
2 // Includes
3 #include <c8051f020.h> // SFR declarations
4 #include <intrins.h>
5 // Global CONSTANTS
6 #define CS12887 0x8300 /*DS12887時間寄存器首地址*/
7 #define CS12887A 0x830A /*DS12887內部寄存器A地址*/
8 #define CS12887B 0x830B /*DS12887內部寄存器B地址*/
9 #define CS12887C 0x830C /*DS12887內部寄存器C地址*/
10 #define PORTA 0x8000 /*8255的A口*/
11 #define PORTB 0x8001
12 #define PORTC 0x8002
13 #define PORTCON 0x8003
14 unsigned long x;
15 unsigned char *lcdpoint; //指向 lcddata數組的指針
16 unsigned char lcd_data_count; //要顯示的數據個數
17 // Function PROTOTYPES
18 void PORT_Init (void);
19 void sleep_ms(unsigned int count)// 延時
20 {
21 1 unsigned int ii,jj;
22 1 for(ii=0;ii<count;ii++)
23 1 {
24 2 for(jj=0;jj<250;jj++)
25 2 _nop_();
26 2 }
27 1 }
28 void SYSCLK_Init (void) //函數功能: 系統時鐘初始化
29 {
30 1 OSCICN = 0x05; // 系統時鐘初始化為片內的4MHz
31 1
32 1 }
33
34 void DS12887INIT(void)// 初始化時鐘芯片并寫入時間初值
35 {
36 1 unsigned char i;
37 1 unsigned char xdata *idata Point1;
38 1 Point1=CS12887B;
39 1 *Point1=0x80; /*設置SET=1,禁止時間更新*/
40 1 Point1=CS12887;
41 1 *Point1=0x00; /*寫入當前秒值:"30"秒*/
42 1 Point1++;
43 1 *Point1=0xff; /*秒不報警(不鬧秒)*/
44 1 Point1++;
45 1 *Point1=0x00; /*寫入當前分值:"58"分*/
46 1 Point1++;
47 1 *Point1=0xff; /*分不報警(不鬧分)*/
48 1 Point1++;
49 1 *Point1=0x12; /*寫入當前時值:"23" 時*/
50 1 Point1++;
51 1 *Point1=0xff; /*時不報警(不鬧時)*/
52 1 Point1++;
53 1 *Point1=0x04; /*寫入當前周日:"5"*/
54 1 Point1++;
55 1 *Point1=0x04; /*寫入當前日期:"01"日*/
C51 COMPILER V7.05 WDS12887LED8 02/14/2006 08:52:14 PAGE 2
56 1 Point1++;
57 1 *Point1=0x08; /*寫入當前月份:"07"月*/
58 1 Point1++;
59 1 *Point1=0x05; /*寫入當前年份:"05"年*/
60 1 Point1=CS12887C;
61 1 i=*Point1; /*CLEAR C*/
62 1 Point1++;
63 1 i=*Point1; /*CLEAR D*/
64 1 Point1=CS12887B;/*更新周期正常運行,禁止中斷,采用BCD碼格式,24[小]時制*/
65 1 *Point1=0x02; /*不用復時制*/
66 1 }
67 void PORT_Init (void)// 初始化I/O
68 {
69 1 XBR2 = 0x40; /*時能交叉開關,弱上拉*/
70 1 P74OUT = 0xc0; /*P7為推拉方式,P4,P5,P6漏極開路*/
71 1 EMI0CF |= 0x2c; /*EMIF工作在地址/數據復用方式,只用外部存儲器,ALE高/低脈寬占1個SYSCLK周期*/
72 1 EMI0TC |= 0x6d; /*地址建立/保持時間占1個SYSCLK周期,/WR和/RD占12個SYSCLK周期*/
73 1 }
74 // MAIN Routine
75 void main (void) {
76 1 unsigned char j,k,temp;
77 1 unsigned int i;
78 1 unsigned char TimeVal[10];
79 1 unsigned char xdata *idata Pointm;
80 1 unsigned char HMS[6],YMD[6];
81 1 /*無效看門狗*/
82 1 WDTCN = 0xde;
83 1 WDTCN = 0xad;
84 1 SYSCLK_Init ();
85 1 PORT_Init ();
86 1 //DS12887INIT();
87 1 Pointm=PORTCON;
88 1 *Pointm=0x80; //B口輸出,A口輸出
89 1 // sleep_ms(4000);
90 1 do{
91 2 temp=temp&0x7f; /*UIP=0*/
92 2 Pointm=CS12887A; /*判斷更新周期結束否?查詢UIP位*/
93 2 temp=*Pointm;
94 2 temp=temp&0x80; /*UIP=0,時鐘更新已經完成,可以讀取時鐘值*/
95 2 }while(temp==0x80); /*UIP=1,時鐘更新周期正在進行,需繼續等待*/
96 1 while(1)
97 1 {
98 2 Pointm=CS12887;
99 2 for(temp=0;temp<10;temp++) /*讀時間寄存器*/
100 2 {
101 3 TimeVal[temp]=*Pointm;
102 3 Pointm++;
103 3 switch(temp){ /*準備待顯示數據*/
104 4 case 0x00: /*秒*/
105 4 HMS[4]=(TimeVal[temp]>>4);
106 4 HMS[5]=TimeVal[temp]&0x0f;
107 4 break;
108 4 case 0x02: /*分*/
109 4 HMS[2]=(TimeVal[temp]>>4);
110 4 HMS[3]=TimeVal[temp]&0x0f;
111 4 break;
112 4 case 0x04: /*時*/
113 4 HMS[0]=(TimeVal[temp]>>4);
114 4 HMS[1]=TimeVal[temp]&0x0f;
115 4 break;
116 4 case 0x07: /*日*/
117 4 YMD[4]=(TimeVal[temp]>>4);
C51 COMPILER V7.05 WDS12887LED8 02/14/2006 08:52:14 PAGE 3
118 4 YMD[5]=TimeVal[temp]&0x0f;
119 4 break;
120 4 case 0x08: /*月*/
121 4 YMD[2]=(TimeVal[temp]>>4);
122 4 YMD[3]=TimeVal[temp]&0x0f;
123 4 break;
124 4 case 0x09: /*年*/
125 4 YMD[0]=(TimeVal[temp]>>4);
126 4 YMD[1]=TimeVal[temp]&0x0f;
127 4 break;
128 4 default:
129 4 _nop_();
130 4 }
131 3 }
132 2 for(j=0;j<6;j++)
133 2 {
134 3 switch(HMS[j]){ /*轉化成數碼管數字顯示碼*/
135 4 case 0x01:
136 4 k=0x06; // '1'
137 4 break;
138 4 case 0x02:
139 4 k=0x5b; // '2'
140 4 break;
141 4 case 0x03:
142 4 k=0x4f; // '3'
143 4 break;
144 4 case 0x04:
145 4 k=0x66; // '4'
146 4 break;
147 4 case 0x05:
148 4 k=0x6d; // '5'
149 4 break;
150 4 case 0x06:
151 4 k=0x7d; // '6'
152 4 break;
153 4 case 0x07:
154 4 k=0x07; // '7'
155 4 break;
156 4 case 0x08:
157 4 k=0x7f; // '8'
158 4 break;
159 4 case 0x09:
160 4 k=0x6f; // '9'
161 4 break;
162 4 case 0x00:
163 4 k=0x3f; // '0'
164 4 break;
165 4 default:
166 4 k=0x80; // 'dot'
167 4 }
168 3 switch(j) //動態驅動6數碼管
169 3 {
170 4 case 0x00:
171 4 Pointm=PORTB;
172 4 *Pointm=0x01;
173 4 break;
174 4 case 0x01:
175 4 Pointm=PORTB;
176 4 *Pointm=0x02;
177 4 break;
178 4 case 0x02:
179 4 Pointm=PORTB;
C51 COMPILER V7.05 WDS12887LED8 02/14/2006 08:52:14 PAGE 4
180 4 *Pointm=0x04;
181 4 break;
182 4 case 0x03:
183 4 Pointm=PORTB;
184 4 *Pointm=0x08;
185 4 break;
186 4 case 0x04:
187 4 Pointm=PORTB;
188 4 *Pointm=0x10;
189 4 break;
190 4 case 0x05:
191 4 Pointm=PORTB;
192 4 *Pointm=0x20;
193 4 break;
194 4 default:
195 4 _nop_();
196 4 }
197 3 Pointm=PORTC;
198 3 *Pointm=k; /*送顯示碼*/
199 3 for(i=0;i<=600;i++);
200 3 _nop_();
201 3 }
202 2 _nop_();
203 2 }
204 1 }
205
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 826 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 22
IDATA SIZE = ---- 4
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -