📄 12864
字号:
C51 COMPILER V8.02 12864万年繽 11/15/2007 20:52:01 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 12864万年繽
OBJECT MODULE PLACED IN 12864万年历.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 12864万年历.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************/
2 /* LCM128*64万年历 */
3 /* 硬件:LCM128*64 89s52 晶振:24M */
4 /* 制作:hyj */
5 /* 时间:2006.11.3 V0.1 */
6 /* 2006.12.4 V0.2(修正"三"显示) */
7 /* 2006.12.7 V0.3(增加闹钟功能) */
8 /*******************************************/
9
10
11
12
13 #include<reg51.h>
14 #include<stdio.h>
15 #include<intrins.h>
16 #define uchar unsigned char
17 #define DELTA 500
18
19 bit c_moon;
20 bit flash,id,alarm_controls,alarm;
21 unsigned char k,jieqi1,jieqi2;
22 data uchar year_moon,month_moon,day_moon;
23 unsigned char year,month,day,week,hour,min,sec;
24 unsigned char alarm_hour,alarm_min,sec_temp;
25
26 uchar mode=0,add=1,ir_data1,ir_data2,ir_data3,ir_data4,ir_enable,count,count2=0,en=0;
27
28
29 code unsigned char shuzi[]={"0123456789:."};
30 code unsigned char riqi[]= {"年月日农历星期室温 闹钟开关"};
31 code unsigned char xingqi[]={" 一二33四五六日"};
32 code unsigned char rongli[]={"初十廿卅"};
33 code unsigned char shuzi2[]={"十一二33四五六七八九"};
34 code unsigned char shuzi3[]={" 十"};
35 code unsigned char shuzi4[]={" 一二33四五六七八九"};
36 unsigned char code inittime[]={0x48,0x21,0x15,0x11,0x11,0x06,0x06}; //初始化参数
37 // 秒 分 时 日 月 星期 年
38 code uchar san[]={
39 /*-- 文字: 三 --*/
40 /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
41 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
42 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
43 };
44
45
46 code unsigned char jieqi[]=
47 {
48 " "
49 "小寒大寒"
50 "立春雨水"
51 "惊蛰春分"
52 "清明谷雨"
53 "立夏小满"
54 "芒种夏至"
55 "小暑大暑"
C51 COMPILER V8.02 12864万年繽 11/15/2007 20:52:01 PAGE 2
56 "立秋处暑"
57 "白露秋分"
58 "寒露霜降"
59 "立冬小雪"
60 "大雪冬至"
61 };
62
63
64 sbit T_CLK=P3^5;
65 sbit T_IO =P3^6;
66 sbit T_RST=P3^7; //引脚定义
67
68 sbit DQ =P1^4;
69 sbit ACC0=ACC^0;
70 sbit ACC7=ACC^7;
71 sbit rs = P2^1;
72 sbit rw = P2^2;
73 sbit e = P2^4;
74 sbit psb = P2^5;
75 sbit rst = P3^4;
76
77 sbit P07=P0^7;
78 sbit P15=P1^5;
79
80 void RTInputByte(uchar); // 输入 1Byte
81 uchar RTOutputByte(void); // 输出 1Byte
82 void W1302(uchar, uchar); // 向DS1302写入一个字节
83 uchar R1302(uchar); // 从DS1302读出一个字节
84 void Set1302(unsigned char* ); // 设置初始时间
85 ReadTemperature(void); //读取室温
86 void Conversion(bit c,char year,char month,char day); //计算农历日期
87 unsigned char calendar_calculate_solar_term_1(void); //计算当月第一个节气对应的公历日期
88 unsigned char calendar_calculate_solar_term_2(void); //计算当月第二个节气
89
90
91
92
93
94 mode_set()
95 {
96 1 switch(mode)
97 1 {
98 2 case 0:mode=1;
99 2 W1302(0x8e,0x00); //允许写操作
100 2 W1302(0x80,0x80); //写入DS1302 时间停止
101 2 W1302(0x8e,0x80); //写保护,禁止写操作
102 2 TR0=1;
103 2 break;
104 2 case 1:mode=2;
105 2 break;
106 2 case 2:mode=3;
107 2 break;
108 2 case 3:mode=4;
109 2 break;
110 2 case 4:mode=5;
111 2 break;
112 2 case 5:mode=6;
113 2 break;
114 2 case 6:mode=0;
115 2 W1302(0x8e,0x00); //允许写操作
116 2 W1302(0x80,0x00); //写入DS1302 时间运行
117 2 W1302(0x8e,0x80); //写保护,禁止写操作
C51 COMPILER V8.02 12864万年繽 11/15/2007 20:52:01 PAGE 3
118 2 TR0=0;
119 2 break;
120 2 }
121 1 if(id==1)
122 1 {
123 2 switch(mode)
124 2 {
125 3 case 7:mode=8;
126 3 break;
127 3 case 8:mode=7;
128 3 break;
129 3 }
130 2 }
131 1 }
132
133 add_set()
134 {
135 1 uchar address,item;
136 1 uchar max,min;
137 1 if(alarm==1) {alarm=0;return;}
138 1 if(mode==0) return;
139 1 if(mode==1) {address=0x8c; max=99;min=0;} //年
140 1 if(mode==2) {address=0x88; max=12;min=1;} //月
141 1 if(mode==3) {address=0x86; max=31;min=1;} //日
142 1 if(mode==4) {address=0x8a; max=7; min=1;} //星期
143 1 if(mode==5) {address=0x84; max=23;min=0;} //小时
144 1 if(mode==6) {address=0x82; max=59;min=0;} //分钟
145 1 if(mode==7) {address=0xc0; max=23;min=0;}
146 1 if(mode==8) {address=0xc2; max=59;min=0;}
147 1
148 1 item=R1302(address+1);
149 1 item=item/16*10+item%16;
150 1 if(add)
151 1 item++;
152 1 else
153 1 item--;
154 1 if(item<min||item==255) item=max;
155 1 if(item>max) item=min;
156 1 W1302(0x8e,0x00); //允许写操作
157 1 W1302(address,item/10*16+item%10); //写入DS1302 //转成BCD码
158 1 W1302(0x8e,0x80); //写保护,禁止写操作
159 1 }
160
161
162
163 ir_key()
164 {
165 1
166 1 switch(ir_data3)
167 1 {
168 2 case 0xe2: mode_set();
169 2 break;
170 2 case 0x52: add=1;
171 2 add_set();
172 2 break;
173 2 case 0x78: add=0;
174 2 add_set();
175 2 break;
176 2 case 0xb8: id=1;
177 2 mode=7;
178 2 TR0=1;
179 2 break;
C51 COMPILER V8.02 12864万年繽 11/15/2007 20:52:01 PAGE 4
180 2 case 0x42: id=0;
181 2 mode=0;
182 2 TR0=0;
183 2 break;
184 2 case 0xc8:if(id==1) //设置闹钟 开/关(必须在闹钟调整状态下)
185 2 {
186 3 alarm_controls=~alarm_controls;
187 3 }
188 2
189 2 }
190 1 }
191
192
193
194 /**********************************************
195 遥控外部中断程序
196
197 接收数据:ir_data1--ir_data4
198 倍数计数:count
199 DELTA :误差
200 /**********************************************/
201 void int0remoter() interrupt 2
202 {
203 1 TR1=0;
204 1 if((TL1+TH1*256)==0)
205 1 {
206 2 count=0;
207 2 TL1=0;
208 2 TH1=0;
209 2 TR1=1; //开定时器
210 2
211 2 return;//有遥控信号产生中断,退出中断
212 2 }
213 1 if(!count)
214 1 {
215 2 if(((TL1+TH1*256)>(27000-DELTA))&&((TL1+TH1*256)<(27000+DELTA)))
216 2 {
217 3 count++;
218 3 TH1=0;
219 3 TL1=0;
220 3 TR1=1;
221 3 return;//前导码正确,准备接收数据,退出中断
222 3 }
223 2 count=0;
224 2 TR1=0;
225 2 TH1=0;
226 2 TL1=0;
227 2 return;//前导码错误,非遥控信号,退出中断
228 2 }
229 1 if(count<33)
230 1 {
231 2 if(count<=8)
232 2 {
233 3 if(((TL1+TH1*256)>(2250-DELTA))&&((TL1+TH1*256)<(2250+DELTA)))
234 3 {
235 4 ir_data1<<=1;
236 4 count++;
237 4 TH1=0;
238 4 TL1=0;
239 4 TR1=1;
240 4 return; //数据为0,退出中断
241 4 }
C51 COMPILER V8.02 12864万年繽 11/15/2007 20:52:01 PAGE 5
242 3 if(((TL1+TH1*256)>(4500-DELTA))&&((TL1+TH1*256)<(4500+DELTA)))
243 3 {
244 4 ir_data1<<=1;
245 4 ir_data1|=0x01;
246 4 count++;
247 4 TH1=0;
248 4 TL1=0;
249 4 TR1=1;
250 4 return;//数据为1,退出中断
251 4 }
252 3 count=0;
253 3 TR1=0;
254 3 TH1=0;
255 3 TL1=0;
256 3 return; //错误,清零退出中断
257 3 }
258 2 if(count>8&&count<=16)
259 2 {
260 3 if(((TL1+TH1*256)>(2250-DELTA))&&((TL1+TH1*256)<(2250+DELTA)))
261 3 {
262 4 ir_data2<<=1;
263 4 count++;
264 4 TH1=0;
265 4 TL1=0;
266 4 TR1=1;
267 4 return; //数据为0,退出中断
268 4 }
269 3 if(((TL1+TH1*256)>(4500-DELTA))&&((TL1+TH1*256)<(4500+DELTA)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -