📄 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 + -