📄 _ds12c887
字号:
C51 COMPILER V7.50 ___DS12C887 09/03/2012 17:35:06 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE ___DS12C887
OBJECT MODULE PLACED IN ---DS12C887.OBJ
COMPILER INVOKED BY: F:\keil\keil2\英文版keil2\程序\C51\BIN\C51.EXE ---DS12C887.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 sbit lcdrs=P2^4;
6 sbit lcden=P2^6;
7 sbit s1=P3^0; //功能键
8 sbit s2=P3^1; //增大键
9 sbit s3=P3^2; //减小键
10 sbit s4=P3^6; //闹铃查看键
11 sbit beep=P2^3;//蜂鸣器
12 sbit dscs=P1^4;
13 sbit dsas=P1^5;
14 sbit dsrw=P1^6;
15 sbit dsds=P1^7;
16 sbit dsirq=P3^3; //中断
17
18 bit flag1,flag_ri;//定义标志位 flag1设置闹铃
19 uchar count,s1num,flag,t0_num;
20 char miao,shi,fen,year,month,day,week,amiao,afen,ashi;
21 char code table[]=" 20 - - "; // 20 - -
22
23 uchar code table1[]=" : : "; // : :
24 //******************************************************************
25 //函数声明
26 void write_ds(uchar,uchar); uchar read_ds(uchar);void set_time();
27 void read_alarm();void set_alarm(uchar,uchar,uchar);
28 //******************************************************************
29
30 void delayms(uint z) //延时毫秒的程序
31 {
32 1 uint x,y;
33 1 for(x=z;x>0;x--)
34 1 for(y=112;y>0;y--);
35 1 }
36 void di()
37 {
38 1 beep=0;
39 1 delayms(100);
40 1 beep=1;
41 1 }
42 //******************************************************************
43 //LCD1602程序
44 //******************************************************************
45 void write_cmd(uchar cmd)
46 {
47 1 lcden=0;
48 1 lcdrs=0;
49 1 P0=cmd;
50 1 _nop_();
51 1 lcden=1;
52 1 delayms(1);
53 1 lcden=0;
54 1 _nop_();
55 1 }
C51 COMPILER V7.50 ___DS12C887 09/03/2012 17:35:06 PAGE 2
56 void write_dat(uchar dat)
57 {
58 1 lcden=0;
59 1 lcdrs=1;
60 1 P0=dat;
61 1 _nop_();
62 1 lcden=1;
63 1 delayms(1);
64 1 lcden=0;
65 1 _nop_();
66 1 }
67 void lcdint()
68 {
69 1 lcden=0;
70 1 write_cmd(0x38); // 显示模式设置
71 1 write_cmd(0x0c); //开显示,不显示光标,不闪烁
72 1 write_cmd(0x06); //写一个字符后地址加1,屏幕不移
73 1 write_cmd(0x01); //清屏
74 1 delayms(1);
75 1 }
76 //lcd显示程序
77 //******************************************************************
78 void write_sfm(uchar add,char date) //写时间,2位一起写
79 {
80 1 char shi,ge;
81 1 shi=date/10;ge=date%10;
82 1 write_cmd(0xc0+add);
83 1 write_dat(0x30+shi);
84 1 write_dat(0x30+ge);
85 1 }
86 void write_nyr(uchar add,char date)//年月日
87 {
88 1 char shi,ge;
89 1 shi=date/10;ge=date%10;
90 1 write_cmd(0x80+add);
91 1 write_dat(0x30+shi);
92 1 write_dat(0x30+ge);
93 1 }
94 void write_week(char we)//星期
95 {
96 1 write_cmd(0x80+12);
97 1 switch(we)
98 1 {
99 2 case 1: write_dat('M');write_dat('O');write_dat('N');break;
100 2 case 2: write_dat('T');write_dat('U');write_dat('E');break;
101 2 case 3: write_dat('W');write_dat('E');write_dat('D');break;
102 2 case 4: write_dat('T');write_dat('H');write_dat('U');break;
103 2 case 5: write_dat('F');write_dat('R');write_dat('I');break;
104 2 case 6: write_dat('S');write_dat('A');write_dat('T');break;
105 2 case 7: write_dat('S');write_dat('U');write_dat('N');break;
106 2 }
107 1 }
108 //******************************************************************
109 //******************************************************************
110 void init()
111 {
112 1 uchar num;
113 1 EA=1;//开总中断
114 1 EX1=1;//开外部中断1
115 1 IT1=1;//外部中断下降沿触发
116 1 flag1=0; t0_num=0;s1num=0;week=1;
117 1 write_ds(0x0A,0x20);//打开振荡器
C51 COMPILER V7.50 ___DS12C887 09/03/2012 17:35:06 PAGE 3
118 1 write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式,开启闹铃中断
119 1 set_time();//设置上电默认时间,调试的时候用
120 1 lcdint();
121 1 write_cmd(0x80);
122 1 for(num=0;num<15;num++)
123 1 {
124 2 write_dat(table[num]);
125 2 }
126 1 write_cmd(0xc0);
127 1 for(num=0;num<11;num++)
128 1 {
129 2 write_dat(table1[num]);
130 2 }
131 1 }
132 //******************************************************************
133 //DS12C887程序
134 //******************************************************************
135 void write_ds(uchar add,uchar date)//写12c887函数
136 {
137 1 dscs=0;
138 1 dsas=1;
139 1 dsds=1;
140 1 dsrw=1;
141 1 P0=add; //写地址
142 1 dsas=0;
143 1 dsrw=0;
144 1 P0=date; //写数据
145 1 dsrw=1;
146 1 dsas=1;
147 1 dscs=1;
148 1 }
149 uchar read_ds(uchar add) //读12c887
150 {
151 1 uchar ds_date;
152 1 dsas=1;
153 1 dsds=1;
154 1 dsrw=1;
155 1 dscs=0;
156 1 P0=add;
157 1 dsas=0;
158 1 dsds=0;
159 1 P0=0xff;
160 1 ds_date=P0;
161 1 dsds=1;
162 1 dsas=1;
163 1 dscs=1;
164 1 return ds_date;
165 1 }
166 void set_time() //初始化
167 {
168 1 write_ds(0,0); //秒
169 1 write_ds(1,10); //秒闹铃
170 1 write_ds(2,34); //分钟
171 1 write_ds(3,34); //分钟闹铃
172 1 write_ds(4,15); //小时
173 1 write_ds(5,15); //小时闹铃
174 1 write_ds(6,5); //星期
175 1 write_ds(7,20); //日
176 1 write_ds(8,5); //月
177 1 write_ds(9,11); //年
178 1 }
179 void read_alarm()
C51 COMPILER V7.50 ___DS12C887 09/03/2012 17:35:06 PAGE 4
180 {
181 1 amiao=read_ds(1);
182 1 afen=read_ds(3);
183 1 ashi=read_ds(5);
184 1 }
185 //******************************************************************
186 //按键程序
187 void keyscan()
188 { //**********************************************************
189 1 //按任意键取消闹钟报警
190 1 if(flag_ri==1)
191 1 {
192 2 if((s1==0)||(s2==0)||(s3==0)||(s4==0))//按任意键取消闹钟报警
193 2 {
194 3 delayms(5);
195 3 if((s1==0)||(s2==0)||(s3==0)||(s4==0))
196 3 {
197 4 while(!(s1&&s2&&s3&&s4));di();
198 4 flag_ri=0;
199 4 }
200 3 }
201 2 }
202 1 //**********************************************************
203 1 if(s1==0) //如果功能按键1按下
204 1 {
205 2 delayms(5); //去抖动
206 2 if(s1==0)
207 2 {
208 3 while(!s1); //等待松手
209 3 s1num++; //记下次数
210 3 di(); //蜂鸣器响
211 3 //********************************************************
212 3 if(flag1==1) //设置闹铃为1时才对s1num调整,只调秒,分,时
213 3 {
214 4 if(s1num>3)
215 4 {
216 5 s1num=1;
217 5 }
218 4 }
219 3 //********************************************************
220 3 flag=1; //在调整时间时标志位flag为1,不进行正常操作
221 3 switch(s1num)
222 3 {
223 4 case 1:write_cmd(0xc0+10); write_cmd(0x0f);break; //按一下秒钟 指针显示闪烁
224 4 case 2:write_cmd(0xc0+7); break;
225 4 case 3:write_cmd(0xc0+4); break;
226 4 case 4:write_cmd(0x80+12); break;
227 4 case 5:write_cmd(0x80+9); break;
228 4 case 6:write_cmd(0x80+6); break;
229 4 case 7:write_cmd(0x80+3); break;
230 4 default: //用default可以解决s1num跑飞
231 4 s1num=0;
232 4 write_cmd(0x0c); //按了8次关闪烁,flag=0,退出调整,显示时间
233 4 flag=0;
234 4 write_ds(0,miao); //将调整后的时间写入ds12c887
235 4 write_ds(2,fen);
236 4 write_ds(4,shi);
237 4 write_ds(6,week);
238 4 write_ds(7,day);
239 4 write_ds(8,month);
240 4 write_ds(9,year);
241 4 break;
C51 COMPILER V7.50 ___DS12C887 09/03/2012 17:35:06 PAGE 5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -