📄 ds1302+lcd1602-c51.lst
字号:
C51 COMPILER V7.50 DS1302_LCD1602_C51 11/26/2007 14:43:04 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS1302_LCD1602_C51
OBJECT MODULE PLACED IN DS1302+LCD1602-C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS1302+LCD1602-C51.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* */
3 /* AOKE210E单片机开发系统演示程序 - DS1302时钟显示 */
4 /* */
5 /* 数码管显示 */
6 /* */
7 /* 版本: V2.0 (2007/11/20) */
8 /* 作者: 高山流水 */
9 /* 网站: www.aokemcu.cn(奥科电子) */
10 /* 邮箱: aoke999@sohu.com */
11 /* */
12 /*******************************************************************/
13 #include<reg51.h>
14 #include<intrins.h>
15
16 #define uchar unsigned char
17 #define uint unsigned int
18
19 sbit K1 = P3^4;
20 sbit K2 = P3^5;
21 sbit K3 = P3^6;
22 sbit K4 = P3^7;
23
24 sbit reset = P1^2;
25 sbit sclk = P1^0;
26 sbit io = P1^1;
27
28 sbit BEEP = P1^6;
29
30 sbit dula=P2^7;
31 sbit wela=P2^6;
32
33 bit flag=1,hour=0,min=0,sec=0;
34 bit year=0,month=0,day=0,week=0;
35 bit alarm_flag=0;
36 uchar timecount=0,count=0;
37
38 uchar str1[]=" - - Week: ";
39 uchar str2[]="Time: ";
40 uchar str3[]="Alarm: ";
41
42 uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //
43 uchar init1[] ={0x00,0x00};
44 uchar init2[] ={0x00,0x00,0x00,0x26,0x11,0x01,0x07}; //
45 //秒, 分, 时, 日, 月,星期,年
46 uchar bj_time[] ={0x00,0x00,0x00};
47 //秒, 分, 时
48 uchar code mytab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭
49
50 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码
51 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
52
53 /******************************************************************/
54
55 /******************************************************************/
C51 COMPILER V7.50 DS1302_LCD1602_C51 11/26/2007 14:43:04 PAGE 2
56 void delay1(int ms)
57 {
58 1 unsigned char y;
59 1 while(ms--)
60 1 {
61 2 for(y = 0; y<250; y++)
62 2 {
63 3 _nop_();
64 3 _nop_();
65 3 _nop_();
66 3 _nop_();
67 3 }
68 2 }
69 1 }
70
71
72 /*********************************************************/
73 //
74 /*********************************************************/
75 void delay()
76 {
77 1 uchar j;
78 1 for(j=250;j>0;j--);
79 1 }
80
81
82 /**********************************************************/
83 //
84 /**********************************************************/
85 void write_byte(uchar inbyte)
86 {
87 1 uchar i;
88 1 for(i=0;i<8;i++)
89 1 {
90 2 sclk=0; //写的时候低电平改变数据
91 2 if(inbyte&0x01)
92 2 io=1;
93 2 else
94 2 io=0;
95 2 sclk=1; //写的时候高电平,把数据写入ds1302
96 2 _nop_();
97 2 inbyte=inbyte>>1;
98 2 }
99 1 }
100
101 /**********************************************************/
102
103 /**********************************************************/
104 uchar read_byte() //sclk的下跳沿读数据
105 {
106 1 uchar i,temp=0;
107 1 io=1; //设置为输入口
108 1 for(i=0;i<7;i++)
109 1 {
110 2 sclk=0;
111 2 if(io==1)
112 2 temp=temp|0x80;
113 2 else
114 2 temp=temp&0x7f;
115 2 sclk=1; //产生下跳沿
116 2
117 2 temp=temp>>1;
C51 COMPILER V7.50 DS1302_LCD1602_C51 11/26/2007 14:43:04 PAGE 3
118 2 }
119 1 return (temp);
120 1 }
121
122 /**********************************************************/
123 // 往ds1302的某个地址写入数据
124 /**********************************************************/
125 void write_ds1302(uchar cmd,uchar indata)
126 {
127 1 sclk=0;
128 1 reset=1;
129 1 write_byte(cmd);
130 1 write_byte(indata);
131 1
132 1 sclk=0;
133 1 reset=0;
134 1 }
135
136 /**********************************************************/
137 // 读ds1302某地址的的数据
138 /**********************************************************/
139 uchar read_ds1302(uchar addr)
140 {
141 1 uchar backdata;
142 1 sclk=0;
143 1 reset=1;
144 1
145 1 write_byte(addr); //先写地址
146 1 backdata=read_byte(); //然后读数据
147 1
148 1 sclk=0;
149 1 reset=0;
150 1 return (backdata);
151 1 }
152
153 /**********************************************************/
154 // 设置初始时间
155 /**********************************************************/
156 void set_ds1302(uchar addr,uchar *p,uchar n) //写入n个数据
157 {
158 1 write_ds1302(0x8e,0x00); //写控制字,允许写操作
159 1 for(;n>0;n--)
160 1 {
161 2 write_ds1302(addr,*p);
162 2 p++;
163 2 addr=addr+2;
164 2 }
165 1 write_ds1302(0x8e,0x80); //写保护,不允许写
166 1 }
167
168 /**********************************************************/
169 // 读取当前时间
170 /**********************************************************/
171 void read_nowtime(uchar addr,uchar *p,uchar n)
172 {
173 1 for(;n>0;n--)
174 1 {
175 2 *p=read_ds1302(addr);
176 2 p++;
177 2 addr=addr+2;
178 2 }
179 1 }
C51 COMPILER V7.50 DS1302_LCD1602_C51 11/26/2007 14:43:04 PAGE 4
180
181 /**********************************************************/
182 // 初始化DS1302
183 /**********************************************************/
184 void init_ds1302()
185 {
186 1 reset=0;
187 1 sclk=0;
188 1 write_ds1302(0x80,0x00);
189 1 write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电
190 1 write_ds1302(0x8e,0x80); //写保护控制字,禁止写
191 1 }
192
193 /**********************************************************/
194 /* */
195 /* 蜂鸣器响一声 */
196 /* */
197 /**********************************************************/
198 void beep()
199 {
200 1 unsigned char y;
201 1 for (y=0;y<100;y++)
202 1 {
203 2 delay();
204 2 BEEP=!BEEP; //BEEP取反
205 2 }
206 1 BEEP=1; //关闭蜂鸣器
207 1 delay1(50);
208 1 }
209
210
211
212 /**********************************************************/
213 // Time0中断函数
214 /**********************************************************/
215 void Time0(void) interrupt 1 using 0
216 {
217 1 TH0=0x4c; //50ms定时
218 1 TL0=0x00;
219 1 timecount++;
220 1 if(timecount>9)
221 1 {
222 2 timecount=0;
223 2 flag=~flag;
224 2 }
225 1 }
226
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -