📄 text3.lst
字号:
C51 COMPILER V7.07 TEXT3 01/30/2009 01:25:16 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE TEXT3
OBJECT MODULE PLACED IN Text3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text3.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>//加载头文件
2 #include <intrins.H>//装载
3 #define uchar unsigned char//变量类型的宏定义
4 #define uint unsigned int//变量类型的宏定义
5 #define SET 5
6 #define MON 4
7 #define DAY 3
8 #define HOU 2
9 #define MIN 1
10 #define PCF8583 0XA0
11 #define _Nop() _nop_() /*定义空指令*/
12 sbit SDA=P1^7; /*模拟I2C数据传送位*/
13 sbit SCL=P1^6; /*模拟I2C时钟控制位*/
14
15 /*状态标志*/
16 bit ack; /*应答标志位*/
17
18 uchar SEG7[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*0~9的数码管段码*/
19
20 uchar act[12]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x04,0x08,0x10,0x20};//12位数码管位码;
21
22 uchar MS,mon,day,hou,min,sec;
23 uchar key;
24 uchar discnt;
25 uint cnt,time_cnt;
26 sbit MSKEY=P0^5; /*功能键标志*/
27 sbit MONKEY=P0^4;//月按键
28 sbit DAYKEY=P0^3;//天按键
29 sbit HOUKEY=P0^2;//时按键
30 sbit MINKEY=P0^1;//分按键
31 //sbit CHECKKEY=P3^0;//查询按键
32 sbit CLK=P1^0;
33 sbit DATA=P1^1;
34
35 void TIMERIni(void);
36 void menu(void);
37 void delay(uint k);
38 void keyboard(void);
39 void send164(uchar m);
40 void dis_time(uchar m);
41 void dis_adjtime(uchar m);
42 uchar IRcvByte(uchar sla,uchar suba);
43 bit ISendByte(uchar sla,uchar suba,uchar c);
44 void Ack_I2c(bit a);
45 uchar RcvByte(void);
46 void SendByte(uchar c);
47 void Stop_I2c(void);
48 void Start_I2c(void);
49
50
51
52
53 uchar convert_BCD(uchar i)
54 {
55 1 uchar i1,i2;
C51 COMPILER V7.07 TEXT3 01/30/2009 01:25:16 PAGE 2
56 1 i1=i%10;
57 1 i2=i/10;
58 1 i2=i2<<4;
59 1 i=i2+i1;
60 1 return i;
61 1 }
62
63 void menu(void)//扫描按键子函数
64 {
65 1 uchar i;
66 1 if(key==SET)
67 1 {MS++;
68 2 if(MS==2)
69 2 {MS=0;
70 3 i=convert_BCD(min);
71 3 ISendByte(PCF8583, 0X03,i);
72 3 i=convert_BCD(hou);
73 3 ISendByte(PCF8583, 0X04, i);
74 3 i=convert_BCD(day);
75 3 ISendByte(PCF8583, 0x05, i);
76 3 i=convert_BCD(mon);
77 3 ISendByte(PCF8583, 0x06, i);
78 3 }
79 2 }// 调整模式
80 1 if(MS==1)
81 1 {
82 2 switch(key)
83 2 {
84 3 case (MIN):{min++;if(min>=60)min=0;;}break;
85 3 case (HOU):{hou++;if(hou>23)hou=0;;} break;
86 3 case(DAY):{day++;if(day>31)day=1;;}break;
87 3 case(MON):{mon++;if(mon>12)mon=1;;}break;
88 3 default:break;
89 3 }
90 2 }
91 1 key=0;
92 1
93 1 }
94
95 void delay(uint k)
96 {
97 1 uint i,j;
98 1 for(i=0;i<k;i++)
99 1 {
100 2 for(j=0;j<1000;j++) ;
101 2 }
102 1 }
103
104 void keyboard(void)
105 {
106 1 P0=0X3F;
107 1 if((P0&0x02)==0)
108 1 { delay(5);
109 2 while((P0&0x02)==0);
110 2 key=MIN;
111 2 }
112 1 else
113 1 if((P0&0x04)==0)
114 1 {
115 2 delay(5);
116 2 while((P0&0x04)==0);
117 2 key=HOU;
C51 COMPILER V7.07 TEXT3 01/30/2009 01:25:16 PAGE 3
118 2 }
119 1 else
120 1 if((P0&0x08)==0)
121 1 {
122 2 delay(5);
123 2 while((P0&0x08)==0);
124 2 key=DAY;
125 2 }
126 1 else
127 1 if((P0&0x10)==0)
128 1 {
129 2 delay(5);
130 2 while((P0&0x10)==0);
131 2 key=MON;
132 2 }
133 1 else
134 1 if((P0&0x20)==0)
135 1 {
136 2 delay(5);
137 2 while((P0&0x20)==0);
138 2 key=SET;
139 2 }
140 1 }
141
142
143
144
145 void time0(void) interrupt 1
146 {
147 1 TH0=0xF4;TL0=0x48;
148 1 if(discnt>11)discnt=0;// 显示为12位数码管
149 1 if(cnt>200)cnt=0;// 调整时的闪烁周期
150 1 switch(MS)
151 1 {
152 2 case 0:{dis_time(discnt);}break;// 显示走时
153 2 case 1:{dis_adjtime(discnt);}break;// 显示调时
154 2 default: break;
155 2 }
156 1 discnt++;cnt++;
157 1
158 1 }
159
160 void time1(void) interrupt 3 //50ms
161 {uchar temp1,temp2,temp;
162 1 TH1=0X3C;TL1=0XAF;
163 1 time_cnt++;
164 1 if(time_cnt>=20)// 1秒钟计时时间到,读PCF8583的各寄存器的值
165 1 { time_cnt=0;
166 2 temp=IRcvByte(PCF8583, 0X02);
167 2 temp1=temp>>4;temp2=temp*0x0f;
168 2 sec=temp1*10+temp2;
169 2 temp=IRcvByte(PCF8583, 0X03);
170 2 temp1=temp>>4;temp2=temp*0x0f;
171 2 min=temp1*10+temp2;
172 2 temp=IRcvByte(PCF8583, 0X04);
173 2 temp1=temp>>4;temp2=temp*0x0f;
174 2 hou=temp1*10+temp2;
175 2 temp=IRcvByte(PCF8583, 0X05);
176 2 temp1=temp>>4;temp2=temp*0x0f;
177 2 day=temp1*10+temp2;
178 2 temp=IRcvByte(PCF8583, 0X06);
179 2 temp1=temp>>4;temp2=temp*0x0f;
C51 COMPILER V7.07 TEXT3 01/30/2009 01:25:16 PAGE 4
180 2 mon=temp1*10+temp2;
181 2 }
182 1 }
183
184
185
186 void send164(uchar m)
187 {uchar k,i,b;
188 1 k=SEG7[m];
189 1 i=8;
190 1 CLK=0;
191 1 while (i--)
192 1 {b=k>>i;
193 2 if((b&0x01)==0x01)DATA=1;//判断b的最低位的值是多少
194 2 else DATA=0;
195 2 CLK=1; _nop_();
196 2 CLK=0;
197 2 }
198 1
199 1 }
200 //P2 KOU //P1kou
201 void dis_time(uchar m)
202 {
203 1 P1&=0XC3;/// 等价于 P1=P1&0xc3;;准备送段码 ,位码口全部清零
204 1 P2=0X00;////准备送段码,位码口全部清零
205 1 {switch(m)
206 2 {case 0:{send164(mon/10);P2|=act[m];P1&=0XC3;}break;
207 3 case 1:{send164(mon%10);P2|=act[m];P1&=0XC3;}break;
208 3 case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
209 3 case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
210 3 case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
211 3 case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
212 3 case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
213 3 case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
214 3 case 8:{send164(sec%10);P1|=act[m];P2=0X00;}break;
215 3 case 9:{send164(sec/10);P1|=act[m];P2=0X00;}break;
216 3 case 10:{send164(0);P1|=act[m];P2=0X00;}break;
217 3 case 11:{send164(0);P1|=act[m];P2=0X00;}break;
218 3 default:break;}
219 2 }
220 1
221 1 }
222
223
224 void dis_adjtime(uchar m)
225 {
226 1 if(cnt>100)
227 1 {
228 2 P1&=0XC3;
229 2 P2=0X00;
230 2 switch(m)
231 2 {case 0:{send164(mon/10);P2|=act[m];P1&=0XC3;}break;
232 3 case 1:{send164(mon%10);P2|=act[m];P1&=0XC3;}break;
233 3 case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
234 3 case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
235 3 case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
236 3 case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
237 3 case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
238 3 case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
239 3 case 8:{send164(0);P1&=act[m];P2=0X00;}break;
240 3 case 9:{send164(0);P1&=act[m];P2=0X00;}break;
241 3 case 10:{send164(0);P1&=act[m];P2=0X00;}break;
C51 COMPILER V7.07 TEXT3 01/30/2009 01:25:16 PAGE 5
242 3 case 11:{send164(0);P1&=act[m];P2=0X00;}break;
243 3 default:break;
244 3 }
245 2 }
246 1 else
247 1 {
248 2 P1&=0XC3;
249 2 P2=0X00;
250 2 }
251 1 }
252
253
254 void TIMERIni(void)
255 {
256 1 TMOD=0X11;
257 1 TH0=0xF4;TL0=0x48;TH1=0X3C;TL1=0XAF;
258 1 EA=1;
259 1 ET0=1;
260 1 ET1=1;
261 1 TR1=1;TR0=1;
262 1 }
263
264
265
266
267
268 /*******************************************************************
269 起动总线函数
270 函数原型: void Start_I2c();
271 功能: 启动I2C总线,即发送I2C起始条件.
272
273 ********************************************************************/
274 void Start_I2c(void)
275 {
276 1 SDA=1; /*发送起始条件的数据信号*/
277 1 _Nop();
278 1 _Nop();
279 1 SCL=1;
280 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
281 1 _Nop();
282 1 _Nop();
283 1 _Nop();
284 1 _Nop();
285 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
286 1 _Nop();
287 1 _Nop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -