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