📄 _ds12c887
字号:
C51 COMPILER V7.50 DS12C887 09/03/2012 17:38:53 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
22 char code table[]=" 20 - - ";
23 uchar code table1[]=" 00:00:00"; // : :
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:38:53 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 //******************************************************************
111 void init()
112 {
113 1 uchar num;
114 1 EA=1;//开总中断
115 1 EX1=1;//开外部中断1
116 1 IT1=1;//外部中断下降沿触发
117 1 flag1=0; t0_num=0;s1num=0;week=1;
C51 COMPILER V7.50 DS12C887 09/03/2012 17:38:53 PAGE 3
118 1 write_ds(0x0A,0x20);//打开振荡器
119 1 write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式,开启闹铃中断
120 1 set_time();//设置上电默认时间,调试的时候用
121 1 lcdint();
122 1 write_cmd(0x80);
123 1 for(num=0;num<15;num++)
124 1 {
125 2 write_dat(table[num]);
126 2 }
127 1 write_cmd(0xc0);
128 1 for(num=0;num<11;num++)
129 1 {
130 2 write_dat(table1[num]);
131 2 }
132 1 }
133 //******************************************************************
134 //DS12C887程序
135 //******************************************************************
136 void write_ds(uchar add,uchar date)//写12c887函数
137 {
138 1 dscs=0;
139 1 dsas=1;
140 1 dsds=1;
141 1 dsrw=1;
142 1 P0=add; //写地址
143 1 dsas=0;
144 1 dsrw=0;
145 1 P0=date; //写数据
146 1 dsrw=1;
147 1 dsas=1;
148 1 dscs=1;
149 1 }
150 uchar read_ds(uchar add) //读12c887
151 {
152 1 uchar ds_date;
153 1 dsas=1;
154 1 dsds=1;
155 1 dsrw=1;
156 1 dscs=0;
157 1 P0=add;
158 1 dsas=0;
159 1 dsds=0;
160 1 P0=0xff;
161 1 ds_date=P0;
162 1 dsds=1;
163 1 dsas=1;
164 1 dscs=1;
165 1 return ds_date;
166 1 }
167 void set_time() //初始化
168 {
169 1 write_ds(0,10); //秒
170 1 write_ds(1,10); //秒闹铃
171 1 write_ds(2,10); //分钟
172 1 write_ds(3,34); //分钟闹铃
173 1 write_ds(4,10); //小时
174 1 write_ds(5,15); //小时闹铃
175 1 write_ds(6,2); //星期
176 1 write_ds(7,10); //日
177 1 write_ds(8,10); //月
178 1 write_ds(9,12); //年
179 1 }
C51 COMPILER V7.50 DS12C887 09/03/2012 17:38:53 PAGE 4
180 void read_alarm()
181 {amiao=read_ds(1);
182 1 afen=read_ds(3);
183 1 ashi=read_ds(5);
184 1 }
185
186 //******************************************************************
187 //按键程序
188 void keyscan()
189 { //**********************************************************
190 1 //按任意键取消闹钟报警
191 1 if(flag_ri==1)
192 1 {
193 2 if((s1==0)||(s2==0)||(s3==0)||(s4==0))//按任意键取消闹钟报警
194 2 { delayms(5);
195 3 if((s1==0)||(s2==0)||(s3==0)||(s4==0))
196 3 { while(!(s1&&s2&&s3&&s4));di();
197 4 flag_ri=0;
198 4 }
199 3 }
200 2 }
201 1 //**********************************************************
202 1 if(s1==0) //如果功能按键1按下
203 1 {
204 2 delayms(5); //去抖动
205 2 if(s1==0)
206 2 {
207 3 while(!s1); //等待松手
208 3 s1num++; //记下次数
209 3 di(); //蜂鸣器响
210 3 //********************************************************
211 3 if(flag1==1) //设置闹铃为1时才对s1num调整,只调秒,分,时
212 3 {
213 4 if(s1num>3)
214 4 { s1num=1;
215 5 }
216 4 }
217 3 //***************************************************************
218 3 flag=1; //在调整时间时标志位flag为1,不进行正常操作
219 3 switch(s1num)
220 3 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -