?? ds1302.lst
字號(hào):
C51 COMPILER V8.02 DS1302 07/12/2008 21:49:01 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: F:\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <REG51.H>
2 #include <intrins.h>
3 //#include "LCD1602.h"
4 //#include "DS1302.h"
5 #define uint unsigned int
6 #define uchar unsigned char
7 sbit DS1302_CLK = P1^7; //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳
8 sbit DS1302_IO = P1^6; //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳
9 sbit DS1302_RST = P1^5; //實(shí)時(shí)時(shí)鐘復(fù)位線引腳
10 //sbit wireless_1 = P3^0;
11 //sbit wireless_2 = P3^1;
12 //sbit wireless_3 = P3^2;
13 //sbit wireless_4 = P3^3;
14 sbit ACC0 = ACC^0;
15 sbit ACC7 = ACC^7;
16 char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)
17 sbit Set = P2^0; //模式切換鍵
18 sbit Up = P2^1; //加法按鈕
19 sbit Down = P2^2; //減法按鈕
20 sbit out = P2^3; //立刻跳出調(diào)整模式按鈕
21 sbit DQ = P1^0; //溫度傳送數(shù)據(jù)IO口
22 sbit SetTick=P2^4; //調(diào)整鬧鐘時(shí)間
23 char done,adjusttick,count,temp,flag,up_flag,down_flag;
24 uchar temp_value; //溫度值
25 uchar TempBuffer[5],week_value[2];
26
27
28 void show_time(); //液晶顯示程序
29 void show_tick_time();
30 /***********1602液晶顯示部分子程序****************/
31
32
33 //Port Definitions**********************************************************
34 sbit LcdRs = P2^5;
35 sbit LcdRw = P2^6;
36 sbit LcdEn = P2^7;
37 sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口
38
39 //內(nèi)部等待函數(shù)**************************************************************************
40 unsigned char LCD_Wait(void)
41 {
42 1 LcdRs=0;
43 1 LcdRw=1; _nop_();
44 1 LcdEn=1; _nop_();
45 1
46 1 LcdEn=0;
47 1 return DBPort;
48 1 }
49 //向LCD寫入命令或數(shù)據(jù)************************************************************
50 #define LCD_COMMAND 0 // Command
51 #define LCD_DATA 1 // Data
52 #define LCD_CLEAR_SCREEN 0x01 // 清屏
53 #define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn)
54 void LCD_Write(bit style, unsigned char input)
55 {
C51 COMPILER V8.02 DS1302 07/12/2008 21:49:01 PAGE 2
56 1 LcdEn=0;
57 1 LcdRs=style;
58 1 LcdRw=0; _nop_();
59 1 DBPort=input; _nop_();//注意順序
60 1 LcdEn=1; _nop_();//注意順序
61 1 LcdEn=0; _nop_();
62 1 LCD_Wait();
63 1 }
64
65 //設(shè)置顯示模式************************************************************
66 #define LCD_SHOW 0x04 //顯示開
67 #define LCD_HIDE 0x00 //顯示關(guān)
68
69 #define LCD_CURSOR 0x02 //顯示光標(biāo)
70 #define LCD_NO_CURSOR 0x00 //無光標(biāo)
71
72 #define LCD_FLASH 0x01 //光標(biāo)閃動(dòng)
73 #define LCD_NO_FLASH 0x00 //光標(biāo)不閃動(dòng)
74
75 void LCD_SetDisplay(unsigned char DisplayMode)
76 {
77 1 LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
78 1 }
79
80 //設(shè)置輸入模式************************************************************
81 #define LCD_AC_UP 0x02
82 #define LCD_AC_DOWN 0x00 // default
83
84 #define LCD_MOVE 0x01 // 畫面可平移
85 #define LCD_NO_MOVE 0x00 //default
86
87 void LCD_SetInput(unsigned char InputMode)
88 {
89 1 LCD_Write(LCD_COMMAND, 0x04|InputMode);
90 1 }
91
92 //初始化LCD************************************************************
93 void LCD_Initial()
94 {
95 1 LcdEn=0;
96 1 LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
97 1 LCD_Write(LCD_COMMAND,0x38);
98 1 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)
99 1 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
100 1 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動(dòng)
101 1 }
102
103 //液晶字符輸入的位置************************
104 void GotoXY(unsigned char x, unsigned char y)
105 {
106 1 if(y==0)
107 1 LCD_Write(LCD_COMMAND,0x80|x);
108 1 if(y==1)
109 1 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
110 1 }
111
112 //將字符輸出到液晶顯示
113 void Print(unsigned char *str)
114 {
115 1 while(*str!='\0')
116 1 {
117 2 LCD_Write(LCD_DATA,*str);
C51 COMPILER V8.02 DS1302 07/12/2008 21:49:01 PAGE 3
118 2 str++;
119 2 }
120 1 }
121
122
123
124
125
126
127 /***********DS1302時(shí)鐘部分子程序******************/
128 typedef struct __SYSTEMTIME__
129 {
130 unsigned char Second;
131 unsigned char Minute;
132 unsigned char Hour;
133 unsigned char Week;
134 unsigned char Day;
135 unsigned char Month;
136 unsigned char Year;
137 unsigned char DateString[11];
138 unsigned char TimeString[9];
139 }SYSTEMTIME; //定義的時(shí)間類型
140 SYSTEMTIME CurrentTime;
141 SYSTEMTIME TickTime;
142
143
144 #define AM(X) X
145 #define PM(X) (X+12) // 轉(zhuǎn)成24小時(shí)制
146 #define DS1302_SECOND 0x80 //時(shí)鐘芯片的寄存器位置,存放時(shí)間
147 #define DS1302_MINUTE 0x82
148 #define DS1302_HOUR 0x84
149 #define DS1302_WEEK 0x8A
150 #define DS1302_DAY 0x86
151 #define DS1302_MONTH 0x88
152 #define DS1302_YEAR 0x8C
153
154 void DS1302InputByte(unsigned char d) //實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù))
155 {
156 1 unsigned char i;
157 1 ACC = d;
158 1 for(i=8; i>0; i--)
159 1 {
160 2 DS1302_IO = ACC0; //相當(dāng)于匯編中的 RRC
161 2 DS1302_CLK = 1;
162 2 DS1302_CLK = 0;
163 2 ACC = ACC >> 1;
164 2 }
165 1 }
166
167 unsigned char DS1302OutputByte(void) //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))
168 {
169 1 unsigned char i;
170 1 for(i=8; i>0; i--)
171 1 {
172 2 ACC = ACC >>1; //相當(dāng)于匯編中的 RRC
173 2 ACC7 = DS1302_IO;
174 2 DS1302_CLK = 1;
175 2 DS1302_CLK = 0;
176 2 }
177 1 return(ACC);
178 1 }
179
C51 COMPILER V8.02 DS1302 07/12/2008 21:49:01 PAGE 4
180 void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)
181 {
182 1 DS1302_RST = 0;
183 1 DS1302_CLK = 0;
184 1 DS1302_RST = 1;
185 1 DS1302InputByte(ucAddr); // 地址,命令
186 1 DS1302InputByte(ucDa); // 寫1Byte數(shù)據(jù)
187 1 DS1302_CLK = 1;
188 1 DS1302_RST = 0;
189 1 }
190
191 unsigned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數(shù)據(jù)
192 {
193 1 unsigned char ucData;
194 1 DS1302_RST = 0;
195 1 DS1302_CLK = 0;
196 1 DS1302_RST = 1;
197 1 DS1302InputByte(ucAddr|0x01); // 地址,命令
198 1 ucData = DS1302OutputByte(); // 讀1Byte數(shù)據(jù)
199 1 DS1302_CLK = 1;
200 1 DS1302_RST = 0;
201 1 return(ucData);
202 1 }
203
204
205
206 void DS1302_GetTime(SYSTEMTIME *Time) //獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組
207 {
208 1 unsigned char ReadValue;
209 1 ReadValue = Read1302(DS1302_SECOND);
210 1 Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
211 1 ReadValue = Read1302(DS1302_MINUTE);
212 1 Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
213 1 ReadValue = Read1302(DS1302_HOUR);
214 1 Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
215 1 ReadValue = Read1302(DS1302_DAY);
216 1 Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
217 1 ReadValue = Read1302(DS1302_WEEK);
218 1 Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
219 1 ReadValue = Read1302(DS1302_MONTH);
220 1 Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
221 1 ReadValue = Read1302(DS1302_YEAR);
222 1 Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
223 1 }
224
225 void DateToStr(SYSTEMTIME *Time) //將時(shí)間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString[]
226 { if(hide_year<2) //這里的if,else語句都是判斷位閃爍,<2顯示數(shù)據(jù),>2就不顯示,輸出字符串為 2
-007/07/22
227 1 {
228 2 Time->DateString[0] = '2';
229 2 Time->DateString[1] = '0';
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -