📄 wds12887lcd.lst
字号:
C51 COMPILER V7.05 WDS12887LCD 02/14/2006 08:52:31 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE WDS12887LCD
OBJECT MODULE PLACED IN WDS12887LCD.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe WDS12887LCD.c DB OE
stmt level source
1 //参考程序C :WDS12887LCD.c 此程序读取时钟值,并年,月,日,时,分,秒.
2 //分别显示在LCD屏上。可实现时钟初始化(授时)
3 #include <c8051f020.h> // SFR declarations
4 #include <intrins.h>
5 #define CS12887 0x8300 /*DS12887时间寄存器首地址*/
6 #define CS12887A 0x830A /*DS12887内部寄存器A地址*/
7 #define CS12887B 0x830B /*DS12887内部寄存器B地址*/
8 #define CS12887C 0x830C /*DS12887内部寄存器C地址*/
9 unsigned long x;
10 unsigned char *lcdpoint; /*指向 lcddata数组的指针*/
11 unsigned char lcd_data_count; /*要显示的数据个数 */
12 void PORT_Init (void);
13 void sleep_ms(unsigned int count)
14 {
15 1 unsigned int ii,jj;
16 1 for(ii=0;ii<count;ii++)
17 1 {
18 2 for(jj=0;jj<250;jj++)
19 2 _nop_();
20 2 }
21 1 }
22 void SYSCLK_Init (void)
23 {
24 1 OSCICN = 0x05; /*系统时钟初始化为片内的4MHz*/
25 1
26 1 }
27 void DS12887INIT(void)
28 {
29 1 unsigned char i;
30 1 unsigned char xdata *idata Point1;
31 1 Point1=CS12887B;
32 1 *Point1=0x80; /*设置SET=1,禁止时间更新*/
33 1 Point1=CS12887;
34 1 *Point1=0x00; /*写入当前秒值:"30"秒*/
35 1 Point1++;
36 1 *Point1=0xff; /*秒不报警(不闹秒)*/
37 1 Point1++;
38 1 *Point1=0x0; /*写入当前分值:"58"分*/
39 1 Point1++;
40 1 *Point1=0xff; /*分不报警(不闹分)*/
41 1 Point1++;
42 1 *Point1=0x21; /*写入当前时值:"16" 时*/
43 1 Point1++;
44 1 *Point1=0xff; /*时不报警(不闹时)*/
45 1 Point1++;
46 1 *Point1=0x05; /*写入当前周日:"5"*/
47 1 Point1++;
48 1 *Point1=0x6; /*写入当前日期:"05"日*/
49 1 Point1++;
50 1 *Point1=0x10; /*写入当前月份:"08"月*/
51 1 Point1++;
52 1 *Point1=0x05; /*写入当前年份:"05"年*/
53 1 Point1=CS12887C;
54 1 i=*Point1; /*CLEAR C*/
55 1 Point1++;
C51 COMPILER V7.05 WDS12887LCD 02/14/2006 08:52:31 PAGE 2
56 1 i=*Point1; /*CLEAR D*/
57 1 Point1=CS12887B; /*更新周期正常运行,禁止中断,采用BCD码格式,24[小]时制*/
58 1 *Point1=0x02; /*不用复时制*/
59 1 }
60 void PORT_Init (void)
61 {
62 1 //XBR2 = 0x40; /*时能交叉开关,弱上拉*/
63 1 P74OUT = 0xff; /*推挽输出*/
64 1 EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
65 1 EMI0TC |= 0x6c; /*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
66 1 }
67 void LCD_Init(void)
68 {
69 1 P6 = 0x01;
70 1 for(x=0;x<50000;x++);
71 1 //P7 = 0x30; /*一行显示*/
72 1 P7 = 0x38; /*两行显示*/
73 1 P6 = 0x0;
74 1 P6 = 0x1;
75 1 for(x=0;x<1000;x++);
76 1 P7 = 0x0e; /*显示开,光标显示,光标不闪烁*/
77 1 P6 = 0x0;
78 1 P6 = 0x1;
79 1 for(x=0;x<1000;x++);
80 1 P7= 0x06; /*显示增加,不平移*/
81 1 P6 = 0x0;
82 1 P6 = 0x1;
83 1 for(x=0;x<5000;x++);
84 1 P7 = 0x01; /*清屏*/
85 1 P6 = 0x0;
86 1 P6 = 0x1;
87 1 for(x=0;x<5000;x++);
88 1 }
89 void main (void) {
90 1 unsigned char temp,data1;
91 1 unsigned char TimeVal[10];
92 1 unsigned char xdata *idata Pointm;
93 1 unsigned char HMS[10]={0x70,0x70},YMD[10]={0x02,0x00};
94 1 WDTCN = 0xde; /*无效看门狗*/
95 1 WDTCN = 0xad;
96 1 SYSCLK_Init (); /*初始化系统时钟*/
97 1 PORT_Init (); /*初始化端口*/
98 1 //DS12887INIT(); /*时钟芯片授时*/
99 1 LCD_Init(); /*LCD初始化*/
100 1 //sleep_ms(4000);
101 1 do{
102 2 temp=temp&0x7f; /*UIP=0*/
103 2 Pointm=CS12887A;/*判断更新周期结束否?查询UIP位*/
104 2 temp=*Pointm;
105 2 temp=temp&0x80; /*UIP=0,时钟更新已经完成,可以读取时钟值*/
106 2 }while(temp==0x80);/*UIP=1,时钟更新周期正在进行,不能读取时钟值,需继续等待*/
107 1 while(1)
108 1 {
109 2 P7 = 0x02; /*回到起始位置*/
110 2 P6 = 0x0;
111 2 P6 = 0x01;
112 2 Pointm=CS12887;
113 2 for(temp=0;temp<10;temp++) /*读时间寄存器*/
114 2 {
115 3 TimeVal[temp]=*Pointm;
116 3 Pointm++;
117 3 switch(temp){ /*准备待显示的时间数据*/
C51 COMPILER V7.05 WDS12887LCD 02/14/2006 08:52:31 PAGE 3
118 4 case 0x00:
119 4 HMS[7]=0x0a;
120 4 HMS[8]=(TimeVal[temp]>>4);
121 4 HMS[9]=TimeVal[temp]&0x0f;
122 4 break;
123 4 case 0x02:
124 4 HMS[4]=0x0a;
125 4 HMS[5]=(TimeVal[temp]>>4);
126 4 HMS[6]=TimeVal[temp]&0x0f;
127 4 break;
128 4 case 0x04:
129 4 HMS[2]=(TimeVal[temp]>>4);
130 4 HMS[3]=TimeVal[temp]&0x0f;
131 4 break;
132 4 case 0x07:
133 4 YMD[7]=0x0a;
134 4 YMD[8]=(TimeVal[temp]>>4);
135 4 YMD[9]=TimeVal[temp]&0x0f;
136 4 break;
137 4 case 0x08:
138 4 YMD[4]=0x0a;
139 4 YMD[5]=(TimeVal[temp]>>4);
140 4 YMD[6]=TimeVal[temp]&0x0f;
141 4 break;
142 4 case 0x09:
143 4 YMD[2]=(TimeVal[temp]>>4);
144 4 YMD[3]=TimeVal[temp]&0x0f;
145 4 break;
146 4 default:
147 4 _nop_();
148 4 }
149 3 }
150 2 Pointm=CS12887C;
151 2 temp=*Pointm; /*CLEAR C*/
152 2 Pointm++;
153 2 temp=*Pointm; /*CLEAR D*/
154 2 Pointm=CS12887B; /*更新周期正常运行,禁止中断,采用BCD码格式,24[小]时制*/
155 2 *Pointm=0x02; /*不用复时制*/
156 2 _nop_();
157 2 P6 = 0x05; //准备送数据
158 2 for(x=0;x<5000;x++);
159 2 lcdpoint=&YMD;
160 2 for(lcd_data_count=10;lcd_data_count>0;lcd_data_count--) //显示第一行字符
161 2 {
162 3 data1=*lcdpoint;
163 3 data1 += 0x30; /*转化成字符码*/
164 3 P7 = data1; /*送字符数据*/
165 3 P6 = 0x04;
166 3 P6 = 0x05;
167 3 lcdpoint++;
168 3 for(x=0;x<100;x++);
169 3 }
170 2 P6 = 0x01;
171 2 P7 = 0xc0; /*切换到第二行*/
172 2 P6 = 0x00;
173 2 P6 = 0x01;
174 2 for(x=0;x<1000;x++);
175 2 lcdpoint=&HMS;
176 2 for(lcd_data_count=10;lcd_data_count>0;lcd_data_count--) //显示第二行字符
177 2 {
178 3 data1=*lcdpoint;
179 3 data1 += 0x30; /*转化成字符码*/
C51 COMPILER V7.05 WDS12887LCD 02/14/2006 08:52:31 PAGE 4
180 3 P7 = data1; /*送字符数据*/
181 3 P6 = 0x04;
182 3 P6 = 0x05;
183 3 lcdpoint++;
184 3 for(x=0;x<100;x++);
185 3 }
186 2 }
187 1 }
188
189
190
191
192
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1287 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 32
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 + -