📄 text1.lst
字号:
C51 COMPILER V6.12 TEXT1 06/09/2000 21:38:35 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN .\Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\Text1.c DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************************
2 16字LED点阵屏+DS1302电子钟 C 程序
3 ******************************************************
4 声明:
5 本程序中DS1302读写部分是直接引用网上网友提供的共享程序,
6 本程序供大家学习之用,用勿用于商业用途。尊重作者版权。
7
8 编写:邓椿薪
9 时间:2006年2月6日 晚
10 邮箱:love2151@xinhuanet.com
11 *******************************************************
12
13 DS1302 接线图
14
15 Vcc2 CLK I/O /RST
16
17 | | | |
18 -------------------
19 | 8 7 6 5 |
20 | DS1302 |
21 | |
22 | 1 2 3 4 |
23 -------------------
24 | | | |
25 VCC1 GND
26
27 1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P00
28 8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
29 电压在2.5V以上即可维持
30
31
32 595连级输出数据,138行驱动。*/
33
34
35
36 #include <AT89x51.H>
37 #define uchar unsigned char
38 #define uint unsigned int
39
40 uchar code hanzi[18][32];
41 uchar code hanzi2[];
42 uchar code timer[12][16];
43 uchar code sw[];
44
45 void xs_out(); /*输出显示*/
46 void out_rxd(unsigned char *d); /*串口发送一行*/
47
48
49
50 /******************************************/
51 sbit resget=P1^3; //时钟复位
52 sbit key_moda=P1^0; //模式转换
53 sbit key_up=P1^1; //时钟加
54 sbit key_Down=P1^2; //时钟减
55
C51 COMPILER V6.12 TEXT1 06/09/2000 21:38:35 PAGE 2
56 sbit T_CLK=P1^7; //DS1302引脚连接
57 sbit T_IO =P1^6;
58 sbit T_RST=P1^5;
59
60 sbit ACC0=ACC^0; //1bit数据存储位
61 sbit ACC7=ACC^7;
62
63 uchar inittime[7]={0x00,0x10,0x22,0x13,0x01,0x05,0x06}; //初始化后设置
64 uchar yid,i,e,id,miao,fen,shi,nian,yue,ri,xinqi; //时间变量
65 uint zimuo,ss;
66 uchar BUFF[10]; // 缓存
67
68 void RTInputByte(uchar); /* 输入 1Byte */
69 uchar RTOutputByte(void); /* 输出 1Byte */
70 void W1302(uchar, uchar); // 向DS1302写入一个字节
71 uchar R1302(uchar); // 从DS1302读出一个字节
72 void Set1302(uchar *); // 写DS1302时间
73 void du1302(); // 读时间
74 void DelayMs(void); // 延时
75 void Set(uchar,uchar ); // 变量调整
76 void in_data(); // 调整移动数据
77 void rxd_data(); // 串口发送移动数据
78
79 /*主函数*/
80 void main()
81 {
82 1 yid=0;
83 1 zimuo=0;
84 1 SCON=0; //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)
85 1 while(1) //重复循环显示
86 1 {
87 2 while(yid<16) //数据移位。
88 2 {
89 3 for(e=0;e<8;e++) //移动速度
90 3 {
91 4 if(resget==0)
92 4 {DelayMs();
93 5 if(resget==0)
94 5 Set1302(inittime); //初始化
95 5 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
96 5 W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
97 5 }
98 4 du1302(); //读取 秒 分 时 日 月 星期 年
99 4 if (key_moda==0) // 设置和选择项目键
100 4 {DelayMs();
101 5 if(key_moda==0)
102 5 {
103 6 id++;if(id==8) {id=0;yid=0;zimuo=0;}
104 6 while(key_moda==0){ xs_out();}
105 6 }
106 5 }
107 4
108 4
109 4 if (key_up==0) //增加
110 4 {
111 5 DelayMs();
112 5 if(key_up==0)
113 5 {
114 6 while(key_up==0)
115 6 {xs_out();}
116 6 ss=0;
117 6 Set(id,0);
C51 COMPILER V6.12 TEXT1 06/09/2000 21:38:35 PAGE 3
118 6 }
119 5 }
120 4
121 4 if (key_Down==0) //减少
122 4 {
123 5 DelayMs();
124 5 if(key_Down==0)
125 5 {
126 6 while(key_Down==0)
127 6 {xs_out();}
128 6 ss=0;
129 6 Set(id,1);
130 6 }
131 5 }
132 4 xs_out(); /******调用显示****/
133 4 }
134 3 yid++; //移动一步
135 3
136 3 }
137 2 yid=0;
138 2 zimuo=zimuo+32; //后移一个字,
139 2 if(zimuo>=960) //总数减2个字。
140 2 zimuo=0;
141 2 }
142 1 }
143
144 /************************************************/
145 void xs_out() //串行输出显示
146 {
147 1 for(i=0;i<16;i++)
148 1 {
149 2
150 2 ss++; //ss为闪烁延时计数器
151 2 if (ss==1500) //定义SS的大小决定调整时闪烁的快慢,小于750时为亮,大于750时为黑
152 2 {ss=0;}
153 2 if(id==0) //当ID为零时显示移动的汉字。在时间设置时ID不为零
154 2 { //显示年。
155 3 in_data(); //调整移动数据
156 3 rxd_data(); //串口发送移动数据
157 3 }
158 2 else //id不为零时,显示年。只有在时钟设置时ID才不为零。
159 2 {
160 3 out_rxd(&timer[11][i]); //不显示
161 3 if(id==1&&ss>750) //当ID为1和SS大于1000时年不显示。
162 3 {
163 4 out_rxd(&timer[11][i]); //不显示
164 4 out_rxd(&timer[11][i]); //不显示
165 4 out_rxd(&timer[11][i]); //不显示
166 4 out_rxd(&timer[11][i]); //不显示
167 4 }
168 3 else
169 3 { out_rxd(&timer[2][i]); //20年
170 4 out_rxd(&timer[0][i]);
171 4 out_rxd(&timer[nian/16][i]); //年
172 4 out_rxd(&timer[nian%16][i]);
173 4 }
174 3
175 3 out_rxd(&timer[11][i]); //不显示
176 3
177 3 out_rxd(&hanzi[0][i*2+1]); //年字符
178 3 out_rxd(&hanzi[0][i*2]);
179 3 }
C51 COMPILER V6.12 TEXT1 06/09/2000 21:38:35 PAGE 4
180 2 if(id==2&&ss>750) //当ID为2和SS大于1000时月不显示。
181 2 {out_rxd(&timer[11][i]); //不显示
182 3 out_rxd(&timer[11][i]);} //不显示
183 2 else
184 2 {if(yue/16==0)
185 3 out_rxd(&timer[11][i]); //当月十位为零时不显示
186 3 else
187 3 out_rxd(&timer[yue/16][i]);
188 3 out_rxd(&timer[yue%16][i]); //月
189 3 }
190 2
191 2 out_rxd(&hanzi[1][i*2+1]); //月字符
192 2 out_rxd(&hanzi[1][i*2]);
193 2
194 2 if(id==3&&ss>750) //当ID为3和SS大于1000时日不显示。
195 2 {out_rxd(&timer[11][i]); //不显示
196 3 out_rxd(&timer[11][i]);} //不显示
197 2 else
198 2 {out_rxd(&timer[ri/16][i]);
199 3 out_rxd(&timer[ri%16][i]);} //日
200 2
201 2 out_rxd(&hanzi[17][i*2+1]); //日字符
202 2 out_rxd(&hanzi[17][i*2]);
203 2
204 2 out_rxd(&hanzi[2][i*2+1]); //星字符
205 2 out_rxd(&hanzi[2][i*2]);
206 2 out_rxd(&hanzi[3][i*2+1]); //期字符
207 2 out_rxd(&hanzi[3][i*2]);
208 2
209 2 out_rxd(&timer[11][i]); //不显示
210 2
211 2 if(id==4&&ss>750) //当ID为3和SS大于1000时星期不显示。
212 2 {out_rxd(&timer[11][i]); //不显示
213 3 out_rxd(&timer[11][i]);} //不显示
214 2 else
215 2 {out_rxd(&hanzi[xinqi+10][i*2+1]);//星期值字符
216 3 out_rxd(&hanzi[xinqi+10][i*2]);}
217 2
218 2 out_rxd(&timer[11][i]); //不显示
219 2
220 2 if(id==5&&ss>750) //当ID为4和SS大于1000时时不显示。
221 2 {out_rxd(&timer[11][i]); //不显示
222 3 out_rxd(&timer[11][i]);} //不显示
223 2 else
224 2 {
225 3 if(shi/16==0)
226 3 out_rxd(&timer[11][i]); //当时十位为零时不显示
227 3 else
228 3 out_rxd(&timer[shi/16][i]); //从串口输出时十位。
229 3 out_rxd(&timer[shi%16][i]); //从串口输出时个位。
230 3 }
231 2
232 2 out_rxd(&timer[10][i]); //从串口输出两点。
233 2
234 2 if(id==6&&ss>750) //当ID为6和SS大于1000时分不显示。
235 2 {out_rxd(&timer[11][i]); //不显示
236 3 out_rxd(&timer[11][i]);} //不显示
237 2
238 2 else
239 2 {out_rxd(&timer[fen/16][i]); //输出分值
240 3 out_rxd(&timer[fen%16][i]);}
241 2
C51 COMPILER V6.12 TEXT1 06/09/2000 21:38:35 PAGE 5
242 2 out_rxd(&timer[10][i]); //从串口输出两点。
243 2
244 2 if(id==7&&ss>750) //当ID为6和SS大于1000时秒不显示。
245 2 {out_rxd(&timer[11][i]); //不显示
246 3 out_rxd(&timer[11][i]);} //不显示
247 2 else
248 2 {out_rxd(&timer[miao/16][i]); //输出秒值
249 3 out_rxd(&timer[miao%16][i]);}
250 2
251 2
252 2 /*****************************************************************/
253 2
254 2 P2_7=1; //锁存为高,595锁存信号
255 2 P2=sw[i]; //输出行信号
256 2 DelayMs(); //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
257 2 P2=0x7f; //关闭显示。
258 2 }
259 1
260 1 }
261
262
263 void in_data(void) //调整数据
264 {
265 1 char s;
266 1 for(s=4;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
267 1 {
268 2 BUFF[2*s+1]=hanzi2[zimuo+32*s+2*i]; // 把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -