📄 ds1307.lst
字号:
C51 COMPILER V7.50 DS1307 01/02/2009 14:29:38 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS1307
OBJECT MODULE PLACED IN ds1307.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1307.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 /*********************************LCD定义部分********************************/
4 //输入方式设置
5 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
6 #define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
7 #define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
8 #define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
9 #define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位
10 //设置显示、光标及闪烁开、关
11 #define LCD_DISPLAY_ON 0x0C //显示开
12 #define LCD_DISPLAY_OFF 0x08 //显示关
13 #define LCD_CURSOR_ON 0x0A //光标显示
14 #define LCD_CURSOR_OFF 0x08 //光标不显示
15 #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
16 #define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁
17 //光标、画面移动,不影响DDRAM
18 #define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
19 #define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
20 #define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
21 #define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位
22 //工作方式设置
23 #define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
24 #define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
25 #define LCD_CLEAR_SCREEN 0X01 //清屏
26 /***********************LCD1602地址相关******************************/
27 #define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
28 #define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
29 #define LINE1 0 //第一行
30 #define LINE2 1 //第二行
31 #define LINE_LENGTH 16 //每行的最大字符长度
32 /***********************LCD1602接线引脚定义**************************
33 **********************可根据实际电路改变*******************************/
34 #define LCDIO P2 //定义P2口与LCD1602的数据口相接
35 sbit LCD_RS=P1^4;
36 sbit LCD_RW=P1^3;
37 sbit LCD_EN=P1^2;
38 sbit LCD_BUSY=LCDIO^7;
39 /**********************另外相关的定义*********************************/
40 #define HIGH 1
41 #define LOW 0
42 #define TURE 1
43 #define FALSE 0
44 #define uchar unsigned char
45 #define uint unsigned int
46
47 /*************************以下是函数的申明部分*************************/
48 void LCD_init(void); //LCD1602初始化
49 void LCD_send_command(uchar command); //
50 void LCD_send_data(uchar dat);
51 void LCD_write_char(uchar x,uchar y,uchar dat);
52 void LCD_write_string(uchar x,uchar y,char *Data);
53 void delay_ms(uint n);
54 void LCD_check_busy(void);
55 /*********************结束***********************************************/
C51 COMPILER V7.50 DS1307 01/02/2009 14:29:38 PAGE 2
56 /***************************DS1307开始*****************************************************************/
57 #define Wait1us _nop_();
58 #define Wait2us {_nop_();_nop_();}
59 #define Wait4us {Wait2us;Wait2us;}
60 #define Wait8us {Wait4us;Wait4us;}
61 #define Wait10us {Wait8us;Wait2us;}
62 #define WRITEDS1307 0xD0
63 #define READDS1307 0xD1
64 #define WRITE2402 0xa0
65 #define READ2402 0xa1
66 sbit SDA=P1^4; //DS1307 Serial-Data Input pin 5
67 sbit SCL=P1^3; //DS1307 Serial-Clock Input pin 6
68 /************************************************************/
69 void I2C_start(void);//I2C start function
70 void I2C_stop(void);//I2C stop function
71 //void I2C_send_ack(void);//I2C send responsion function
72 void I2C_send_noack(void);
73 unsigned char I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function
74 unsigned char I2C_read_byte(void);//I2C bus read byte function
75 /***********************************************************************/
76 void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
77 unsigned char Read1307(unsigned char add);//read information from ds1307
78 void Read_RTC(void);//read RTC
79 void Set_RTC(void);//set RTC
80 /***********************************************************************/
81 unsigned char set_rtc_code[7];
82 code unsigned char rtc_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
83 code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
84 unsigned char read_rtc_code[7];
85 /***********************************************************************/
86 void Initial(void);//system initize function
87 void Display(void);//RTC display function
88 /***********************************************************************/
89 /***********************************************************************/
90
91 /***********************************************************************/
92 /*void Initial(void)
93 {
94 Set_RTC();
95 }*/
96 /***********************************************************************/
97 void I2C_start(void)
98 {
99 1 SDA=1;
100 1 SCL=1;
101 1 Wait8us;
102 1 SDA=0;
103 1 Wait8us;
104 1 SCL=0;
105 1
106 1 }
107 /***********************************************************************/
108 void I2C_stop(void)
109 {
110 1 SDA=0;
111 1 SCL=1;
112 1 Wait8us;
113 1 SDA=1;
114 1 Wait4us;
115 1 SCL=0;
116 1 }
117
C51 COMPILER V7.50 DS1307 01/02/2009 14:29:38 PAGE 3
118 void I2C_send_noack(void)
119 {
120 1 SDA=1;
121 1 SCL=1;
122 1 Wait4us;
123 1 SCL=0;
124 1 }
125 /***********************************************************************/
126 unsigned char I2C_write_byte(unsigned char IIC_data)
127 {
128 1 unsigned char i;
129 1 for(i=0;i<8;i++)
130 1 {
131 2 SCL=0;
132 2 if((IIC_data<<i) & 0x80)
133 2 SDA=1; //判断发送位
134 2 else
135 2 SDA=0;
136 2 Wait2us;
137 2 SCL=1;
138 2 Wait4us;
139 2 SCL=0;
140 2 }
141 1 Wait4us;
142 1 SDA=1; //发送完8bit,释放总线准备接收应答位
143 1 Wait2us;
144 1 SCL=1;
145 1 Wait4us; //sda上数据即是从应答位
146 1 if (SDA==1)
147 1 {
148 2 SCL=0; //不考虑从应答位 但要控制好时序
149 2 return 1;
150 2 }
151 1 else
152 1 {
153 2 SCL=0; //不考虑从应答位 但要控制好时序
154 2 return 0;
155 2 }
156 1 }
157 /***********************************************************************/
158 unsigned char I2C_read_byte(void)
159 {
160 1 unsigned char i,dat;
161 1 dat=0;
162 1 SDA=1;
163 1 for (i=0;i<8;i++)
164 1 {
165 2 dat=dat<<1;
166 2 SCL=1;
167 2 Wait2us;
168 2 if(SDA==1)
169 2 {
170 3 dat++;
171 3 }
172 2
173 2 SCL=0;
174 2 }
175 1 return (dat);
176 1 }
177 /***********************************************************************/
178 /******************************** DS1307 PART START ****************/
179 void Write1307(unsigned char add,unsigned char dat)
C51 COMPILER V7.50 DS1307 01/02/2009 14:29:38 PAGE 4
180 {
181 1 I2C_start();
182 1 I2C_write_byte(WRITEDS1307);
183 1 I2C_write_byte(add);
184 1 I2C_write_byte(dat);
185 1 I2C_stop();
186 1 }
187
188 /***********************************************************************/
189 unsigned char Read1307(unsigned char add)
190 {
191 1
192 1 unsigned char dat;
193 1 I2C_start();
194 1 I2C_write_byte(WRITEDS1307);
195 1 I2C_write_byte(add);
196 1 I2C_start();
197 1 I2C_write_byte(READDS1307);
198 1 dat=I2C_read_byte();
199 1 I2C_send_noack();
200 1 I2C_stop();
201 1 return (dat);
202 1 }
203 /****************************读DS1307的寄存器*******************************************/
204 void Read_RTC(void)
205 {
206 1 unsigned char i,*p;
207 1 p=rtc_address;
208 1 for(i=0;i<7;i++)
209 1 {
210 2 read_rtc_code[i]=Read1307(*p);
211 2 p++;
212 2 }
213 1 }
214 /***************************DS1307的初始化********************************************/
215 void Set_RTC(void)
216 {
217 1 unsigned char i;
218 1 // p=rtc_address;
219 1 Write1307(0,0x81);
220 1
221 1 for(i=8;i>1;i--)
222 1 {
223 2 Write1307((i-2),set_rtc_code[i-2]);
224 2 }
225 1 }
226
227
228
229 void Write2402(unsigned char add,unsigned char dat)
230 {
231 1 I2C_start();
232 1 I2C_write_byte(WRITE2402);
233 1 I2C_write_byte(add);
234 1 I2C_write_byte(dat);
235 1 I2C_stop();
236 1 }
237
238 /***********************************************************************/
239 unsigned char Read2402(unsigned char add)
240 {
241 1
C51 COMPILER V7.50 DS1307 01/02/2009 14:29:38 PAGE 5
242 1 unsigned char dat;
243 1 I2C_start();
244 1 I2C_write_byte(WRITE2402);
245 1 I2C_write_byte(add);
246 1 I2C_start();
247 1 I2C_write_byte(READ2402);
248 1 dat=I2C_read_byte();
249 1 I2C_send_noack();
250 1 I2C_stop();
251 1 return (dat);
252 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 304 ----
CONSTANT SIZE = 56 ----
XDATA SIZE = 14 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
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 + -