📄 万年历.lst
字号:
C51 COMPILER V7.50 万年繽 03/10/2009 19:04:18 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 万年繽
OBJECT MODULE PLACED IN 万年历.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE 万年历.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /************************************
2 *程序名:万年历.c
3 *功 能:万年历
4 *
5 *作 者:张小现
6 *单 位:湖南理工物电系
7 *
8 *
9 *开始时间:2009.03.10
10 *结束时间:2009.03.10
11 *版本信息:
12 *
13 *注 备:keys 10 11 12 13 14 15 0-9
14 * 年 月/日 时/分 秒 设置 星期 数据输入
15 *
16 *************************************/
17 #include<reg52.h>
18 #define N 4
19 typedef unsigned char uchar ;
20 typedef unsigned int uint ;
21 void Delay(uchar); //函数申明
22 uchar jpdata();
23 void xsq(void);
24 void fz(uchar a[],uchar cod[],uchar b);
25 void xianshi(uchar a[],uchar);
26 void RTInputByte(uchar);
27 uchar RTOutputByte(void) ;
28 uchar R1302(uchar);
29 void W1302(uchar ucAddr, uchar ucDa);
30 sbit SCLK = P1^6; //实时时钟时钟线引脚
31 sbit IO = P3^2; //实时时钟数据线引脚
32 sbit RST = P3^7; //实时时钟复位线引脚
33 sbit clk=P0^2;
34 sbit Data=P0^3;
35 sbit D6=P0^6;
36 sbit D7=P0^7;
37 sbit ACC0 = ACC^0;
38 sbit ACC7 = ACC^7;
39
40 uchar cod[N];
41 uchar qq;
42 uchar i,c=0,keys=17,da;
43 uchar a[N];
44 void nian();//显示和设置年
45 void yue_ri();//显示和设置月/日
46 void shi_fen();//显示和设置时/分
47 void miao();//显示和设置秒
48 void xingqi();//显示和设置星期
49
50 /*************************************主函数**************************************/
51 void main(void)
52 {
53 1
54 1 W1302( 0x8f, 0x00);
55 1 W1302( 0x8e, 0x00);
C51 COMPILER V7.50 万年繽 03/10/2009 19:04:18 PAGE 2
56 1 W1302( 0x80, 0x00);
57 1 while (1) //进入循环
58 1 {
59 2 if(jpdata()!=keys) //判断是否有按键
60 2 {
61 3 keys=jpdata(); //将键值记录
62 3 nian();//显示和设置年
63 3 yue_ri();//显示和设置月/日
64 3 shi_fen();//显示和设置时/分
65 3 miao();//显示和设置秒
66 3 xingqi();//显示和设置星期
67 3 }
68 2 xianshi(a,i); //显示a数组
69 2 }
70 1 }
71 /***************************************************************************************************
72 *函数名: void Delay(uchar time)
73 *功能: 延时
74 ***************************************************************************************************/
75 void Delay(uchar time)
76 {
77 1 uchar i,j;
78 1 for(i=time;i>0;i--)
79 1 for(j=25;j>0;j--);
80 1 }
81
82 /**************************************************************************************************
83 *函数名: uchar jpdata()
84 *功能: 键盘扫描
85 ****************************************************************************************************/
86 uchar jpdata()
87 {
88 1 uchar u1,u2,ch;
89 1 P2 = 0xf0;
90 1 Delay(1);
91 1 if( (P2&0xf0)!= 0xf0 )
92 1 {
93 2 Delay(1);
94 2 if( (P2&0xf0)!= 0xf0)
95 2 {
96 3 u1=P2;
97 3 P2=0x0f;
98 3 u2=P2;
99 3 ch=u1|u2;
100 3
101 3 }
102 2 }
103 1 switch(ch) //返回相应代码
104 1 {
105 2 case 0x77: return 3;
106 2 case 0x7b: return 2;
107 2 case 0x7d: return 1;
108 2 case 0x7e: return 0;
109 2 case 0xb7: return 7;
110 2 case 0xbb: return 6;
111 2 case 0xbd: return 5;
112 2 case 0xbe: return 4;
113 2 case 0xd7: return 11;
114 2 case 0xdb: return 10;
115 2 case 0xdd: return 9;
116 2 case 0xde: return 8;
117 2 case 0xe7: return 15;
C51 COMPILER V7.50 万年繽 03/10/2009 19:04:18 PAGE 3
118 2 case 0xeb: return 14;
119 2 case 0xed: return 13;
120 2 case 0xee: return 12;
121 2 default: return 16; //无键按下返回16
122 2 }
123 1 }
124 /******************************************
125 *函数名称:xianshi(显示)函数
126 *函数功能: 显示一个字符串
127 *函数参数: 字符串头地址
128 *函数返回值:无
129 *说明: 只能输入长度为四位的字符串
130 ********************************************/
131 void xsq(void) //显示器函数
132 {
133 1 uchar a,b,c,d;
134 1 for(d=20;d;d--)
135 1 {
136 2 c=0xe0; //c赋初值
137 2 for(a=0;a<4;a++)
138 2 {
139 3 P0 = 0x00;
140 3 qq = cod[a]; //送入寄存器的值
141 3 for(b=8;b>0;b--) //将八个数送入寄存器
142 3 {
143 4 Data=qq&0x80;
144 4 clk=0; //制造一个脉冲,一共八个
145 4 clk=1;
146 4 qq=qq<<1; //qq移位
147 4 }
148 3 P0 = ~c; //控制数码管亮
149 3 Delay(1); //延时
150 3 c=(c<<1)|0x10; //移位控制数码管
151 3
152 3 }
153 2
154 2 }
155 1 }
156 void fz(uchar a[],uchar cod[],uchar b) //赋值函数将a的值给cod
157 {
158 1 uchar i,c=b-1; //c=3
159 1 for(i=0;i<b;i++,c--) //i<43. //将a前几位赋給cod
160 1 {
161 2 cod[3-i]=a[c];
162 2 }
163 1 for(;i<N;i++)
164 1 {
165 2 cod[3-i]=0x00; //cod前几个值为不显示
166 2 }
167 1 xsq();
168 1 }
169 /******************************************
170 *函数群名称:xszh(显示转换)函数
171 *函数功能: 将一个uchar字符转换为一个可以输出无符号数
172 *函数参数: 字符数
173 *函数返回值:无符号字符数
174 *说明: 只能输入0到9的字符
175 ********************************************/
176 uchar xszh(uchar a) //显示转换函数,将一个uchar型数组转换为显示用的uchar型数组
177 {
178 1 switch (a)
179 1 {
C51 COMPILER V7.50 万年繽 03/10/2009 19:04:18 PAGE 4
180 2 case 0: return 0xb7;
181 2 case 1: return 0x90;
182 2 case 2: return 0x3d;
183 2 case 3: return 0xb9;
184 2 case 4: return 0x9a;
185 2 case 5: return 0xab;
186 2 case 6: return 0xaf;
187 2 case 7: return 0xb0;
188 2 case 8: return 0xbf;
189 2 case 9: return 0xbb;
190 2 case 10:return 0x00;//不显示
191 2 }
192 1 }
193 /******************************************
194 //函数群名称:xianshi(显示)函数
195 //函数功能: 将一个uchar字符串转换为一个可以输出无符号字符串
196 //函数参数: 字符串头地址,字符串有效位数
197 //函数返回值:无
198 //说明: 只能输入长度为四位的字符串
199 ********************************************/
200 void xianshi(uchar a[],uchar i) //将要显示的数转换赋予cod数组,需要输入赋予数组和数的个数
201 {
202 1 uchar b,c[N];
203 1 for(b=0;b<i;b++)
204 1 {
205 2 c[b]=xszh(a[b]); //将a数组的值转换为可以输出的值给c函数
206 2 }
207 1 fz(c,cod,i);
208 1 }
209 void RTInputByte(uchar d)
210 {
211 1 uchar i;
212 1 ACC = d;
213 1 for(i=8; i>0; i--)
214 1 {
215 2 IO = ACC0; /*相当于汇编中的 RRC */
216 2 SCLK = 0;
217 2 SCLK = 1;
218 2 ACC = ACC >> 1;
219 2 }
220 1 }
221 uchar RTOutputByte(void)
222 {
223 1 uchar i;
224 1 for(i=0; i<8; i++)
225 1 {
226 2 /*相当于汇编中的 RRC */
227 2 ACC7 = IO;
228 2 SCLK = 1;
229 2 SCLK = 0;
230 2 ACC = ACC >>1;
231 2 }
232 1 SCLK = 1;
233 1 return(ACC);
234 1 }
235
236 void W1302(uchar ucAddr, uchar ucDa)
237 {
238 1 RST = 0;
239 1 SCLK = 0;
240 1 RST = 1;
241 1 RTInputByte(ucAddr); /* 地址,命令 */
C51 COMPILER V7.50 万年繽 03/10/2009 19:04:18 PAGE 5
242 1 RTInputByte(ucDa); /* 写1Byte数据*/
243 1 SCLK = 1;
244 1 RST = 0;
245 1 }
246 uchar R1302(uchar ucAddr)
247 {
248 1 uchar ucData;
249 1 RST = 0;
250 1 SCLK = 0;
251 1 RST = 1;
252 1 RTInputByte(ucAddr); /* 地址,命令 */
253 1 ucData = RTOutputByte(); /* 读1Byte数据 */
254 1 SCLK = 1;
255 1 RST = 0;
256 1 return(ucData);
257 1 }
258
259
260 /********************************************************************************************
261 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -