📄 电子时钟扩展.lst
字号:
C51 COMPILER V7.08 电子时钟扩展 03/16/2009 13:49:27 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE 电子时钟扩展
OBJECT MODULE PLACED IN 电子时钟扩展.OBJ
COMPILER INVOKED BY: F:\keil\C51\BIN\C51.EXE 电子时钟扩展.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include"lcd1602.h"
3 #include"ds1302.h"
4 #include"ds18b20.h"
5
6 #define uint unsigned int
7 #define uchar unsigned char
8
9 uint b[6];
10 //年月日时分秒
11
12 uchar code row1[]={"2009-01-01"};
13 uchar code row2[]={"00:00:00"};
14 uchar year1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
15 uchar year2[12]={31,29,31,30,31,30,31,31,30,31,30,31};//润年
16 uchar j[6]={0x85,0x88,0x8b,0x84+0x40,0x87+0x40,0x8a+0x40};//LCD地址
17
18 uchar i,k,jj=0,w,clock=0,bigclock=0,c=0,num;
19 //i循环数 k温度缓存 jj地址位
20 uint temp;
21
22 sbit b1=P3^0;//设置
23 sbit b2=P3^1;//上调
24 sbit b3=P3^2;//下调
25 sbit b4=P3^3;//转换
26 sbit b5=P3^4;//闹钟
27 sbit speaker=P3^5;
28
29 lcdscan()
30 {
31 1 for(i=0;i<6;i++)
32 1 {
33 2 lcdwrite(j[i]);
34 2 lcdshuju(a[11-i*2]+0x30);
35 2 lcdwrite(j[i]+0x01);
36 2 lcdshuju(a[10-i*2]+0x30);
37 2 }
38 1 }
39
40 void key()
41 {
42 1 if(b1==0)
43 1 {
44 2 dsaddshuju(0x80,(a[1]<<4)+a[0]+0x80);
45 2 while(b1==0)
46 2 {
47 3 for(i=0;i<6;i++)
48 3 {
49 4 b[i]=a[11-i*2+clock]*10+a[10-i*2+clock];
50 4 }
51 3
52 3 if(b4==0)
53 3 {
54 4 delay(3);
55 4 jj++;
C51 COMPILER V7.08 电子时钟扩展 03/16/2009 13:49:27 PAGE 2
56 4 if(jj==6)
57 4 {
58 5 jj=0;
59 5 }
60 4 }
61 3 if(b2==0)
62 3 {
63 4 delay(3);
64 4 b[jj]++;
65 4 if(b[5]==60)b[5]=0;
66 4 if(b[4]==60)b[4]=0;
67 4 if(b[3]==24)b[3]=0;
68 4 if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]>year2[b[1]-1])b[2]=1;}
69 4 else {if(b[2]>year1[b[1]-1])b[2]=1;}
70 4 if(b[1]==13)b[1]=1;
71 4 if(b[0]==100)b[0]=0;
72 4
73 4 }
74 3 if(b3==0)
75 3 {
76 4 delay(3);
77 4 b[jj]--;
78 4 if(b[5]==-1)b[5]=59;
79 4 if(b[4]==-1)b[4]=59;
80 4 if(b[3]==-1)b[3]=23;
81 4 if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]<=0)b[2]=year2[b[1]-1];}
82 4 else {if(b[2]<=0)b[2]=year1[b[1]-1];}
83 4 if(b[1]==0)b[1]=12;
84 4 if(b[0]==-1)b[0]=99;
85 4 }
86 3
87 3 for(i=0;i<6;i++)
88 3 {
89 4 a[11-i*2+clock]=b[i]/10;
90 4 a[10-i*2+clock]=b[i]%10;
91 4 }
92 3
93 3 lcdwrite(j[jj]);
94 3 lcdshuju(0);
95 3 lcdwrite(j[jj]+1);
96 3 lcdshuju(0);
97 3 delay(200);
98 3 lcdwrite(j[jj]);
99 3 lcdshuju(a[11-2*jj+clock]+0x30);
100 3 lcdwrite(j[jj]+1);
101 3 lcdshuju(a[10-2*jj+clock]+0x30);
102 3 delay(200);
103 3
104 3 if(b1==1)
105 3 {
106 4 dsaddshuju(0x80,(a[1]<<4)+a[0]);
107 4 dson();
108 4 }
109 3 if(b5==0)clock=12;
110 3 }
111 2 }
112 1 }
113
114 void main()
115 {
116 1 speaker=0;
117 1 lcdrw=0;
C51 COMPILER V7.08 电子时钟扩展 03/16/2009 13:49:27 PAGE 3
118 1 dson();
119 1 lcdon();
120 1 lcdwrite(0x83);
121 1 for(i=0;i<10;i++)
122 1 {
123 2 lcdshuju(row1[i]);
124 2 delay(1);
125 2 }
126 1 lcdwrite(0x84+0x40);
127 1 for(i=0;i<8;i++)
128 1 {
129 2 lcdshuju(row2[i]);
130 2 delay(1);
131 2 }
132 1 dsrst=0;
133 1 dssclk=0;
134 1 while(1)
135 1 {
136 2 for(i=0;i<5;i++)
137 2 {
138 3 dsrst=1;
139 3 dswrite(0x81+i*2);
140 3 k=dsread();
141 3 dsrst=0;
142 3 a[i*2]=k&0x0f;
143 3 a[i*2+1]=(k>>4)&0x0f;
144 3 }
145 2 dsrst=1;
146 2 dswrite(0x8d);
147 2 k=dsread();
148 2 dsrst=0;
149 2 a[10]=k&0x0f;
150 2 a[11]=(k>>4)&0x0f;
151 2
152 2 delay(100);
153 2
154 2 lcdscan();
155 2 key();
156 2 if(b5==0)
157 2 {
158 3 for(i=0;i<12;i++)
159 3 {
160 4 if(a[i+12]==a[i])num++;
161 4 }
162 3 if(num==12)bigclock=1;
163 3 else num=0;
164 3 lcdwrite(0x8e);
165 3 lcdshuju('&');
166 3 }
167 2 else
168 2 {
169 3 lcdwrite(0x8e);
170 3 lcdshuju(0x00);
171 3 }
172 2 if(bigclock==1)
173 2 {
174 3 speaker=1;
175 3 c++;
176 3 if(c==100){bigclock=0;speaker=0;}
177 3 }
178 2 temp=readtemperature();//temp是uint型的。不然会出现温度到25后回00的现象。可能是由于十六进制与十进制的差
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -