📄 clock.lst
字号:
C51 COMPILER V8.08 CLOCK 10/11/2007 17:28:37 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN CLOCK.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CLOCK.C ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 单片机教学打铃控制器
3 芯 片:AT89S52
4 晶 振:频率12MHz
5 按键说明:
6 Ring_Set P1^0//时间设置
7 Time_Set P1^1//闹铃设置
8 Left_Move P1^2//向左移动
9 Add P1^3//数据增加
10 Sub P1^4//数据减小
11 Right_Move P1^5//向右移动
12 ESC P1^6//取消
13 Enter P1^7//确定
14
15 */
16 #include "AT89X52.H"
17 #include "intrins.h"
18
19 #define uchar unsigned char
20 #define AddressWrite24C02 0xa0//24C02写地址
21 #define AddressRead24C02 0xa1//24C02读地址
22
23 uchar ClockData[]={0,0,12};//时钟数据
24 uchar RingDataH[40];//40个闹铃数据(时)
25 uchar RingDataL[40];//40个闹铃数据(分)
26 uchar RingCount=0;//闹铃总数
27 uchar counter=0;
28 uchar I2cStartByte=0xaa;//I2c开始标志字
29 uchar I2cEndByte=0x55;//I2c结束标志字
30 uchar S_Ray_Flag=0;//秒闪标志1
31 sbit S_Ray=P3^1;//秒闪
32 sbit s_ray=P3^0;//秒闪标志2
33 sbit Alarm=P3^4;//闹铃信号
34 sbit SDA=P3^2;//I2C BUS数据
35 sbit SCL=P3^3;//I2C BUS时钟
36
37 //---------------------T1中断,产生时钟-------------------------------
38 void Timer1(void)interrupt 3 using 1
39 {
40 1 TH1=0x3c;
41 1 TL1=0xb0;
42 1 if(counter%10==0)
43 1 {
44 2 s_ray=~s_ray;
45 2 if(S_Ray_Flag)S_Ray=0;
46 2 else S_Ray=~S_Ray;
47 2 }
48 1 if(counter==20)
49 1 {
50 2 counter=1;
51 2 if(ClockData[0]==59)
52 2 {
53 3 ClockData[0]=0;
54 3 if(ClockData[1]==59)
55 3 {
C51 COMPILER V8.08 CLOCK 10/11/2007 17:28:37 PAGE 2
56 4 ClockData[1]=0;
57 4 if(ClockData[2]==23)
58 4 {
59 5 ClockData[2]=0;
60 5 }
61 4 else ClockData[2]++;//时
62 4 }
63 3 else ClockData[1]++;//分
64 3 }
65 2 else ClockData[0]++;//秒
66 2 }
67 1 else counter++;
68 1 }
69 //------------------BCD码转换成字形码的程序-----------------------------
70 uchar BCD_to_Grapheme(uchar Data)
71 {
72 1 switch(Data)
73 1 {
74 2 case 0:return 0x3f;
75 2 case 1:return 0x06;
76 2 case 2:return 0x5b;
77 2 case 3:return 0x4f;
78 2 case 4:return 0xe6;
79 2 case 5:return 0xed;
80 2 case 6:return 0xfd;
81 2 case 7:return 0x07;
82 2 case 8:return 0xff;
83 2 case 9:return 0xef;
84 2 }
85 1 }
86
87 //-----------------------------得到位地址的程序-------------------------
88 uchar GetClockBit(uchar ShowBit)
89 {
90 1 switch(ShowBit)
91 1 {
92 2 case 0:return 0xdf;
93 2 case 1:return 0xef;
94 2 case 2:return 0xf7;
95 2 case 3:return 0xfb;
96 2 case 4:return 0xfd;
97 2 case 5:return 0xfe;
98 2 }
99 1 }
100 //---------------------延时count个ms的程序-------------------------
101 void Delay(uchar count)
102 {
103 1 uchar i;
104 1 while(count--)
105 1 {
106 2 for(i=0;i<123;i++)
107 2 ;
108 2 }
109 1 }
110 //-----------------------动态扫描的程序-------------------------------
111 void Display(uchar *ShowAddress,uchar FlagBit)
112 {
113 1 uchar ShowBit;
114 1 uchar Show;
115 1 for(ShowBit=0;ShowBit<6;ShowBit++)
116 1 {
117 2 if(FlagBit!=5)
C51 COMPILER V8.08 CLOCK 10/11/2007 17:28:37 PAGE 3
118 2 {
119 3 switch(ShowBit)
120 3 {
121 4 case 0:Show=BCD_to_Grapheme((*ShowAddress)%10);break;
122 4 case 1:Show=BCD_to_Grapheme((*ShowAddress)/10);break;
123 4 case 2:Show=BCD_to_Grapheme((*(ShowAddress+1))%10);break;
124 4 case 3:Show=BCD_to_Grapheme((*(ShowAddress+1))/10);break;
125 4 case 4:Show=BCD_to_Grapheme((*(ShowAddress+2))%10);break;
126 4 case 5:Show=BCD_to_Grapheme((*(ShowAddress+2))/10);break;
127 4 }
128 3 }
129 2 P2=0xff;
130 2 switch(FlagBit)
131 2 {
132 3 case 0:P0=Show;break;
133 3 case 1://设秒闪动
134 3 if(s_ray && (ShowBit==0||ShowBit==1))P0=0x40;
135 3 else P0=Show;
136 3 break;
137 3 case 2://设分闪动
138 3 if(s_ray && (ShowBit==2||ShowBit==3))P0=0x40;
139 3 else P0=Show;
140 3 break;
141 3 case 3://设时闪动
142 3 if(s_ray && (ShowBit==4||ShowBit==5))P0=0x40;
143 3 else P0=Show;
144 3 break;
145 3 case 4://调闹铃时的闪动
146 3 if(s_ray)P0=0x40;
147 3 else P0=Show;
148 3 break;
149 3 case 5://调闹铃时的显示
150 3 P0=*(ShowAddress+ShowBit);
151 3 break;
152 3 }
153 2 P2=GetClockBit(ShowBit);
154 2 Delay(1);
155 2 }
156 1 }
157
158 //----------------得到键盘值的程序----------------------------------
159 uchar GetKey()
160 {
161 1 switch(P1)
162 1 {
163 2 case 0xff:return 0;
164 2 case 0xfe:return 1;
165 2 case 0xfd:return 2;
166 2 case 0xfb:return 3;
167 2 case 0xf7:return 4;
168 2 case 0xef:return 5;
169 2 case 0xdf:return 6;
170 2 case 0xbf:return 7;
171 2 case 0x7f:return 8;
172 2 }
173 1 }
174
175 //--------------------------定义I2C接口子程序-------------------------
176 /*
177 I2C特殊字节定义
178 */
179 void I2cWait()//等待
C51 COMPILER V8.08 CLOCK 10/11/2007 17:28:37 PAGE 4
180 {
181 1 _nop_();
182 1 _nop_();
183 1 }
184
185 void I2cStart()//开始
186 {
187 1 SDA=1;
188 1 SCL=1;
189 1 I2cWait();
190 1 SDA=0;
191 1 I2cWait();
192 1 SCL=0;
193 1 }
194
195 void I2cStop()//停止
196 {
197 1 SDA=0;
198 1 I2cWait();
199 1 SCL=1;
200 1 I2cWait();
201 1 SDA=1;
202 1 }
203 void I2cSendByte(uchar ByteData)//发送
204 {
205 1 uchar i;
206 1 for(i=0;i<8;i++)
207 1 {
208 2 if(ByteData&0x80)
209 2 SDA=1;
210 2 else
211 2 SDA=0;
212 2 ByteData<<=1;
213 2 I2cWait();
214 2 SCL=1;
215 2 I2cWait();
216 2 SCL=0;
217 2 I2cWait();
218 2 }
219 1 SDA=1;
220 1 I2cWait();
221 1 SCL=1;
222 1 I2cWait();
223 1 SCL=0;
224 1 I2cWait();
225 1 }
226
227 uchar I2cReceiveByte()//接收
228 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -