📄 1302.lst
字号:
C51 COMPILER V8.02 1302 05/19/2008 20:25:32 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 1302
OBJECT MODULE PLACED IN 1302.OBJ
COMPILER INVOKED BY: G:\Keilc51v802\C51\BIN\C51.EXE 1302.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***********************************************************
2 文件名称:电子数码万年历
3 作 者:
4 版 本:0.1
5 说 明:共有两个功能,时间的调整,1个闹钟
6 修改记录:2005.2.28
7 ***********************************************************/
8 //此程式是从以前的万年历上移植过来的,可以用里面的一些模块函数
9 #include<regx51.h>
10
11 #define uchar unsigned char
12 sbit RSTB=P3^7;
13 sbit IO=P3^6;
14 sbit SCLK=P3^5;
15 sbit k1=P1^3; //设定
16 sbit k2=P1^2; //加1
17 sbit k3=P1^1; //减1
18 sbit k4=P1^0; //闹钟设定
19 sbit k5=P1^4; //闹钟开/关
20 sbit clock_switch=P2^6; //闹钟开关批示
21 sbit clock_bell=P2^7; //闹钟定时时间到指示()闹铃开/关
22 uchar flag; //定义闪动标志位
23 uchar bit_count; //闪动位
24 uchar clock_flag; //闹钟开/关标志位
25
26 /***********************************/
27 uchar code display_data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0x0F8,0x80,0x90,0xFF};
28 uchar display_seg[15]={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
29 uchar data_seg[8]={0x40,0x59,0x23,0x12,0x03,0x1,0x06,0};/*初始化数据年月日数据
30 2006年星期13月23日23点55分*/
31 uchar clock_seg[4]; //闹钟数据REM
-
32
33 /***************Display pragma*************/
34 void dealy(void) //显示延时
35 {
36 1 uchar i;
37 1 for(i=0;i<150;i++);
38 1
39 1 }
40
41
42 void display(void) //显示程序
43 {
44 1 uchar j,*p;
45 1
46 1 for(j=0;j<15;j++)
47 1 {
48 2 P2=P2|j;
49 2
50 2 p=display_data;
51 2 if(flag==0xff&&((bit_count-1)==j)) P0=0XFF;
52 2 else {p=p+display_seg[j];P0=*p;}
53 2
54 2 dealy();
C51 COMPILER V8.02 1302 05/19/2008 20:25:32 PAGE 2
55 2 P0=0XFF;
56 2 P2&=0Xf0;
57 2 }
58 1
59 1 }
60
61
62 /************************************************/
63 void reset_3w(void) //复位
64 {
65 1 SCLK=0;
66 1 RSTB=0;
67 1 RSTB=1;
68 1 }
69
70 void wbyte_3w(uchar number)//写一个字节
71 {
72 1 uchar i;
73 1 for(i=0;i<8;i++)
74 1 {
75 2 IO=0;
76 2 if(number&0x01) IO=1;
77 2 else IO=0;
78 2 SCLK=0;
79 2 SCLK=1;
80 2 number>>=1;
81 2 }
82 1 }
83
84 uchar rbyte_3w() //读一个字节
85 {
86 1 uchar i,k;
87 1 uchar tmpbyte;
88 1 k=0x01;
89 1 IO=1;
90 1 for(i=0;i<8;i++)
91 1 {
92 2 SCLK=1;
93 2 SCLK=0;
94 2 if(IO==1) tmpbyte|=k;
95 2 else tmpbyte&=(~k);
96 2 k<<=1;
97 2
98 2 }
99 1 return tmpbyte;
100 1 }
101
102
103
104
105 void write_1302(void)
106 {
107 1 uchar i,*p;
108 1 p=data_seg;
109 1 reset_3w();
110 1 wbyte_3w(0x8e); //写保护器开
111 1 wbyte_3w(0);
112 1 reset_3w();
113 1 wbyte_3w(0xbe); //以多字节突发方试写取时钟数据
114 1 for(i=0;i<8;i++) //秒,分,时,日期,月,星期,年,保护控制寄存器关
115 1 {
116 2 wbyte_3w(*p);
C51 COMPILER V8.02 1302 05/19/2008 20:25:32 PAGE 3
117 2 p++;
118 2 }
119 1 }
120
121 void read_1302(void)
122 {
123 1 uchar sec,min,hrs,dte,mon,day,yr;
124 1 reset_3w();
125 1 wbyte_3w(0xbf); //以多官节突发方试读取时钟数据
126 1 sec=rbyte_3w(); /*秒 */
127 1 min=rbyte_3w(); /*分 */
128 1 hrs=rbyte_3w(); /*时 */
129 1 dte=rbyte_3w(); /*日期 */
130 1 mon=rbyte_3w(); /*月 */
131 1 day=rbyte_3w(); /*星期 */
132 1 yr=rbyte_3w(); /*年 */
133 1 reset_3w();
134 1
135 1
136 1
137 1 /*********十六进制转BCD码子程序********/
138 1 display_seg[14]=sec%16;
139 1 display_seg[13]=sec/16;
140 1 display_seg[12]=min%16;
141 1 display_seg[11]=min/16;
142 1 display_seg[10]=hrs%16;
143 1 display_seg[9]=hrs/16;
144 1 display_seg[7]=dte%16;
145 1 display_seg[6]=dte/16;
146 1 display_seg[5]=mon%16;
147 1 display_seg[4]=mon/16;
148 1 display_seg[8]=day;
149 1 display_seg[3]=yr%16;
150 1 display_seg[2]=yr/16;
151 1
152 1
153 1 }
154
155 void t0(void) interrupt 1 using 0 //定时器T0,闪动定时中断
156 {
157 1 static uchar i=0;
158 1 TH0=0x3c; //定时100MS中断一次
159 1 TL0=0xb0; //重装计数值
160 1 i++;
161 1 if(i==4) {flag=~flag;i=0;}
162 1 }
163
164 void clock_write(void)
165 {
166 1 display_seg[9]=clock_seg[0];
167 1 display_seg[10]=clock_seg[1];
168 1 display_seg[11]=clock_seg[2];
169 1 display_seg[12]=clock_seg[3];
170 1 }
171
172 void clock_save(void) //闹钟数据保存
173 {
174 1 clock_seg[0]=display_seg[9];
175 1 clock_seg[1]=display_seg[10];
176 1 clock_seg[2]=display_seg[11];
177 1 clock_seg[3]=display_seg[12];
178 1
C51 COMPILER V8.02 1302 05/19/2008 20:25:32 PAGE 4
179 1 }
180
181 void clock_compare(void)
182 {
183 1 if(clock_seg[2]==display_seg[11]&&clock_seg[3]==display_seg[12])
184 1 {
185 2 if(clock_seg[1]==display_seg[10])
186 2 {
187 3 if(clock_seg[0]==display_seg[9])
188 3 clock_bell=0; //时间到闹铃开
189 3 }
190 2 }
191 1 else clock_bell=1; //时间没到闹铃关
192 1 if(clock_flag==0) clock_bell=1; //用闹钟开/关键控制闹铃的工作时间
193 1 }
194
195 void complex_data(void)
196 {
197 1 data_seg[0]=display_seg[13]*16+display_seg[14];
198 1 data_seg[1]=display_seg[11]*16+display_seg[12];
199 1 data_seg[2]=display_seg[9]*16+display_seg[10];
200 1 data_seg[3]=display_seg[6]*16+display_seg[7];
201 1 data_seg[4]=display_seg[4]*16+display_seg[5];
202 1 data_seg[5]=display_seg[8];
203 1 data_seg[6]=display_seg[2]*16+display_seg[3];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -