📄 12864 万年历.lst
字号:
C51 COMPILER V7.06 12864_万年繽 03/11/2009 21:07:34 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 12864_万年繽
OBJECT MODULE PLACED IN 12864 万年历.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 12864 万年历.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*====================================
2 程序设计:王树茂
3 程序名称:12864万年历
4 设计日期:2008年10月 9日-10日
5 =====================================*/
6 #include <reg52.h>
7 #include<intrins.h>
8 #define uchar unsigned char
9 #define uint unsigned int
10 /*口定义*/
11 #define lcd P0
12 sbit lcdrs=P1^2;
13 sbit lcden=P1^4;
14 sbit lcdpsb=P1^1;
15 sbit lcdwr=P1^3;
16 sbit tem_in=P2^3;
17 /*按键定义*/
18 sbit K1 = P3^4; //设定
19 sbit K2 = P3^5; //加
20 sbit K3 = P3^6; //减
21 /*变量定义*/
22 uchar hour,min,sec,sec100,nian,yue,ri,xq,wendu;
23 uchar temp_h,temp_l; //温度值变量
24 uint a;
25 uchar keynum;
26
27 /*函数声明*/
28 void write_op(uchar instruction);
29 void write_dat(uchar indata);
30 void ini_dis();
31 void lcd_ini();
32 void inc_sec();
33 void inc_min();
34 void inc_hour();
35 void inc_nian();
36 void inc_yue();
37 void inc_ri();
38 void inc_xq();
39
40 void dec_min();
41 void dec_hour();
42 void dec_nian();
43 void dec_yue();
44 void dec_ri();
45 void dec_xq();
46 void showxq();
47
48 void key_scan();
49
50 /*字符表*/
51 uchar code dis_char[16]="电气信息工程学院";
52 uchar code dis_char1[16]="公元08年10月01日";
53 uchar code dis_char2[16]="下午12时00分00秒";
54 uchar code dis_char3[16]="星期三温度:+00度";
55 uchar code dis_code[10]={'0','1','2','3','4','5','6','7','8','9'};
C51 COMPILER V7.06 12864_万年繽 03/11/2009 21:07:34 PAGE 2
56 uchar code dis_code1[14]="一二三四五六日";
57 /*延时函数*/
58 void delayms(uint m)
59 {
60 1 uchar x,y;
61 1 for(x=m;x>0;x--)
62 1 for(y=110;y>0;y--);
63 1 }
64
65
66 /*====================================
67 以下是温度的函数模块
68 =====================================*/
69
70 void Delay_us(uchar n)
71 {
72 1 uchar i;
73 1 i=0;
74 1 while(i<n)
75 1 i++;
76 1 }
77
78 /*====================================
79 函数功能:DS18B20重设
80 =====================================*/
81
82 void dsreset(void)
83 {
84 1 uint i;
85 1 tem_in=0;
86 1 i=100;
87 1 while(i>0)i--;
88 1 tem_in=1;
89 1 i=4;
90 1 while(i>0)i--;
91 1 }
92
93 /*====================================
94 函数功能:直接读一字节程序
95 =====================================*/
96
97 uchar ReadByte(void)
98 {
99 1 uchar i,k;
100 1 i=8;
101 1 k=0;
102 1 while(i--)
103 1 {
104 2 tem_in=1;
105 2 Delay_us(2);
106 2 tem_in=0;
107 2 k=k>>1;
108 2 tem_in=1;
109 2 if(tem_in)
110 2 k |= 0x80;
111 2 Delay_us(2);
112 2
113 2 }
114 1 return(k);
115 1 }
116
117 /*====================================
C51 COMPILER V7.06 12864_万年繽 03/11/2009 21:07:34 PAGE 3
118 函数功能:向B20写一字节
119 =====================================*/
120
121 void tmpwrite(unsigned char dat)
122 {
123 1 uint i;
124 1 uchar j;
125 1 bit testb;
126 1 for(j=1;j<=8;j++)
127 1 { testb=dat&0x01;
128 2 dat=dat>>1;
129 2 if(testb)
130 2 { tem_in=0;
131 3 i++;
132 3 i++;
133 3 tem_in=1;
134 3 i=8;
135 3 while(i>0)
136 3 i--;
137 3 }
138 2 else
139 2 {
140 3 tem_in=0;
141 3 i=8;
142 3 while(i>0)
143 3 i--;
144 3 tem_in=1;
145 3 i++;
146 3 i++;
147 3 }
148 2 }
149 1 }
150
151 /*====================================
152 函数功能:启动温度转换
153 =====================================*/
154 void tmpchange(void)
155 {
156 1 dsreset(); /*复位*/
157 1 delayms(1);
158 1 tmpwrite(0xcc); //跳过序列号命令
159 1 tmpwrite(0x44); //转换命令
160 1 }
161
162 /*====================================
163 函数功能:将温度值读出来并转化为显示数组
164 =====================================*/
165
166 void tmp(void)
167 {
168 1 uint dis;
169 1 dsreset();
170 1
171 1 delayms(1);
172 1 tmpwrite(0xcc);
173 1 tmpwrite(0xbe);
174 1 temp_l=ReadByte();//低位在前
175 1 temp_h=ReadByte();//高位在后
176 1
177 1 if((temp_h&0xf8)==0)
178 1 {
179 2 dis=temp_h*16+temp_l/16;
C51 COMPILER V7.06 12864_万年繽 03/11/2009 21:07:34 PAGE 4
180 2 write_op(0x9d);
181 2 write_dat(':');
182 2 write_dat('+');
183 2 write_op(0x9e);
184 2 write_dat(dis_code[((dis)%100)/10]);
185 2 write_dat(dis_code[((dis)%100)%10]);
186 2 }
187 1 else
188 1 {
189 2 dis=temp_h*16+temp_l/16;
190 2 dis=~dis+1;
191 2 write_op(0x9d);
192 2 write_dat(':');
193 2 write_dat('-');
194 2 write_op(0x9e);
195 2 write_dat(dis_code[dis/10]);
196 2 write_dat(dis_code[dis%10]);
197 2 }
198 1 }
199
200 /*====================================
201 以下是液晶12864的模块函数
202 =====================================*/
203 /*====================================
204 函数功能:写控制字给12864
205 =====================================*/
206 void write_op(uchar instruction)
207 {
208 1 delayms(5);
209 1 lcdrs=0;
210 1 lcdwr=0;
211 1 lcd=instruction;
212 1 lcden=1;
213 1 _nop_();
214 1 lcden=0;
215 1 }
216 /*====================================
217 函数功能:写显示数据给12864
218 =====================================*/
219 void write_dat(uchar indata)
220 {
221 1 delayms(5);
222 1 lcdrs=1;
223 1 lcdwr=0;
224 1 lcd=indata;
225 1 lcden=1;
226 1 _nop_();
227 1 lcden=0;
228 1 }
229 /*====================================
230 函数功能:初始化12864
231 =====================================*/
232 void lcd_ini()
233 {
234 1 lcdpsb=1;
235 1 write_op(0x30);//功能设定
236 1 write_op(0x01);//清除显示
237 1 write_op(0x0c);//显示设定
238 1 write_op(0x06);
239 1 }
240 /*====================================
241 以下是和时间相关的函数模块
C51 COMPILER V7.06 12864_万年繽 03/11/2009 21:07:34 PAGE 5
242 =====================================*/
243 /*====================================
244 函数功能:秒加
245 =====================================*/
246 void inc_sec()
247 {
248 1 sec++;
249 1 tmpchange(); /*启动温度转换 每秒转换一次*/
250 1 delayms(2); /*等待转换结束,可不用,会对显示产生影响*/
251 1 tmp(); /*读取温度转换结果*/
252 1 if(sec==60)
253 1 {
254 2 sec = 0;
255 2 inc_min();
256 2 }
257 1 write_op(0x8e);
258 1 write_dat(dis_code[sec / 10]);
259 1 write_dat(dis_code[sec % 10]);
260 1 }
261 /*====================================
262 函数功能:分加
263 =====================================*/
264 void inc_min()
265 {
266 1 min++;
267 1 if(min ==60)
268 1 {
269 2 min = 0;
270 2 inc_hour();
271 2 }
272 1 write_op(0x8c);
273 1 write_dat(dis_code[min / 10]);
274 1 write_dat(dis_code[min % 10]);
275 1 }
276 /*====================================
277 函数功能:时加
278 =====================================*/
279 void inc_hour()
280 {
281 1 hour++;
282 1 if(hour == 24)
283 1 {
284 2 hour = 0;
285 2 inc_ri();
286 2 }
287 1 if(hour>=6&&hour<12)
288 1 {
289 2 write_op(0x88);
290 2 write_dat(0xc9);
291 2 write_dat(0xcf);
292 2 write_dat(0xce);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -