📄 ht1380_time3.lst
字号:
C51 COMPILER V7.01 HT1380_TIME3 07/11/2007 21:15:43 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE HT1380_TIME3
OBJECT MODULE PLACED IN ht1380_time3.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ht1380_time3.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2
3 /*****定义ht1380芯片接口********/
4 // ht1380 ht1380_sclk --->P1.0
5 // ht1380 I/O --->P1.1
6 // ht1380 ht1380_rest --->P1.2
7 sbit ht1380_sclk=P1^0;
8 sbit ht1380_data=P1^1;
9 sbit ht1380_rest=P1^2;
10 sbit beep=P1^7;
11 bit flag2=0;
12
13 /**********定义两个全局变量*********/
14 //定义数组变量用于存放四个数码管的显示数据
15 //定义number存放动态显示是第几个数码管
16 unsigned char d[4],number;
17
18 /*********定义时间变量年月日时分秒***********/
19 unsigned char year,month,day,hour,minute,second,callhour,callminute,callsecond,rehour,reminute,resecond;
20 /**********定义冒号变量 distime=1 是数码管冒号显示出来************/
21 bit distime;
22
23 /*******与数码管相关的两个表*********/
24 //一个显示译码表 //注:这里表比前一个多了一个值,最后一个数代表空显示
25 //一个使能译码表
26 unsigned char code tab[11]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0};
27 unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
28
29 /******延时程序***********/
30 void delay(unsigned char dy)
31 {
32 1 while(--dy);
33 1 }
34
35 /******按键接口描述********/
36 //左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4
37 //左第一个按键键值为1
38 //左第二个按键键值为2
39 //左第三个按键键值为3
40 //左第四个按键键值为4
41
42 /******读取按键子程序 getkey()*************/
43 unsigned char getkey (void)
44 { unsigned char k,m,tem,keytem;
45 1 unsigned int j=0;
46 1 keytem=0;
47 1
48 1 tem=P2 & 0xf0; //第一次读取按键值
49 1 if(tem!=0xf0) //判断有无按键按下
50 1 {
51 2 for(k=0;k<20;k++)
52 2 delay(250); //延时一段时间
53 2 tem=P2 & 0xf0; //再次读取按键值
54 2 if(tem!=0xf0)
55 2 { if(tem==0x70) keytem=1; //表示左第一个按键按下
C51 COMPILER V7.01 HT1380_TIME3 07/11/2007 21:15:43 PAGE 2
56 3 else if(tem==0xb0) keytem=2; //表示左第二个按键按下
57 3 else if(tem==0xd0) keytem=3; //表示左第三个按键按下
58 3 else if(tem==0xe0) keytem=4; //表示左第四个按键按下
59 3 }
60 2 }
61 1
62 1 while(tem!=0xf0)
63 1 {
64 2 for(m=0;m<250;m++)
65 2 delay(250),j++;
66 2 tem=P2 & 0xf0; //等待按键释放
67 2 if (tem==0x70&&j>500)
68 2 flag2=1;
69 2 }
70 1 return(keytem); //返回按键值
71 1 }
72
73 /******* ht1380 子程序*****************/
74 //------------- sent_char to ht1380----------
75 //上升沿写入
76 void sent_char(unsigned char sentchar)
77 {
78 1 unsigned char ii;
79 1
80 1 for(ii=0;ii<8;ii++)
81 1 {
82 2 ht1380_sclk=0;
83 2 if ((sentchar & 1)!=0) ht1380_data=1;
84 2 else ht1380_data=0;
85 2 ht1380_sclk=1;
86 2 sentchar=sentchar>>1;
87 2 }
88 1 }
89 //------------- get_char from ht1380---------
90 unsigned char get_char()
91 {
92 1 unsigned char getchar,ii,temp;
93 1 getchar=0;temp=1;
94 1 for(ii=0;ii<8;ii++)
95 1 {
96 2 ht1380_sclk=0;
97 2 ht1380_data=1;
98 2 if(ht1380_data==1) getchar=getchar |temp;
99 2 ht1380_sclk=1;
100 2 temp=temp<<1;
101 2 }
102 1 return(getchar);
103 1 }
104
105 //-------------set_wp_off------------------
106 void set_wp_off()
107 {
108 1 ht1380_rest=1;
109 1 sent_char(0x8e); //10001110b
110 1 sent_char(0); //00000000b
111 1 ht1380_sclk=0;
112 1 ht1380_rest=0;
113 1 }
114 //-----------set_wp_on--------------------
115 void set_wp_on()
116 {
117 1 ht1380_rest=1;
C51 COMPILER V7.01 HT1380_TIME3 07/11/2007 21:15:43 PAGE 3
118 1 sent_char(0x8e); //10001110b
119 1 sent_char(0x80); //10000000b
120 1 ht1380_sclk=0;
121 1 ht1380_rest=0;
122 1 }
123 //----------read_time --------------------
124 void read_time()
125 {
126 1 unsigned char temp;
127 1 ht1380_rest=1;
128 1 sent_char(0xbf); //10111111b
129 1 second=get_char();
130 1 minute=get_char();
131 1 hour= get_char();
132 1 day= get_char();
133 1 month= get_char();
134 1 temp= get_char(); /* week day */
135 1 year= get_char();
136 1 temp= get_char();
137 1 ht1380_sclk=0;
138 1 ht1380_rest=0;
139 1
140 1 }
141 //--------------set time-----------------
142 void set_time()
143 {
144 1 set_wp_off();
145 1 ht1380_rest=1;
146 1 sent_char(0xbe); //10111110b
147 1 sent_char(second);
148 1 sent_char(minute);
149 1 sent_char(hour);
150 1 sent_char(day);
151 1 sent_char(month);
152 1 sent_char(1); /* week day */
153 1 sent_char(year);
154 1 sent_char(0);
155 1 ht1380_sclk=0;
156 1 ht1380_rest=0;
157 1 set_wp_on();
158 1 }
159
160 /*****定时器初始化程序*******/
161 void Init_Timer (void)
162 {
163 1 TMOD=0x21;
164 1 TH0=(65536-1000)/256;
165 1 TL0=(65536-1000)%256;
166 1 TR0=1;
167 1 ET0=1;
168 1 EA=1;
169 1 }
170
171 /*****定时器0中断服务程序******/
172 //显示处理,具体可以参考前面的实验
173 void timer0() interrupt 1 using 1
174 {
175 1 TH0=(65536-1000)/256;
176 1 TL0=(65536-1000)%256;
177 1 number=number++;
178 1 if(number>3) number=0;
179 1 P2=digit[number];
C51 COMPILER V7.01 HT1380_TIME3 07/11/2007 21:15:43 PAGE 4
180 1 P0=tab[d[number]];
181 1 //在第二个数码管显示时,将最高位的小数点显示出来,这里为冒号
182 1 if(distime==1 && number==1)
183 1 P0=tab[d[number]]+0x80;
184 1 }
185 /*******主函数***********/
186 //效果:
187 //显示时分
188 //可用按键调整时间-时分
189 //在较时状态时,相应的数字闪烁
190 //第一个按键用于调整到较时状态并且可以切换要修改的位,第二个按键用于加1..
191 //..第三个按键用于减,第四个按键用于确认回到正常显示状态。
192 //这里就不调整年月日了.大家可以考虑一下如何调整
193
194 void main (void)
195 {
196 1 unsigned char keyboard,keyboard1; //键值变量
197 1 unsigned char state=0; //状态指示 =1较时状态 =0正常显示状态
198 1 unsigned char i,distem,w=3; //变量
199 1 year=07;month=03;day=0x05;hour=0x07;minute=0x16;second=13; //软件预设时间参数
200 1 callhour=0,callminute=0,callsecond=0;
201 1
202 1 ht1380_rest=0;ht1380_sclk=0; //选中时钟芯片
203 1 set_time(); //设置时间
204 1 Init_Timer(); //初始化定时器及全局变量
205 1 number=0;
206 1 distime=1; //冒号显示
207 1 while(1)
208 1 {
209 2 distime=~distime; // 闪动冒号
210 2 read_time(); //读时间
211 2 if(state==0) //state=0 正常显示状态
212 2 {
213 3 read_time();
214 3 d[0]=hour/16;
215 3 d[1]=hour %16;
216 3 d[2]=minute/16;
217 3 d[3]=minute %16;
218 3 }
219 2 else //较时状态。让需要较时的位闪动
220 2 {
221 3 distem=d[w];
222 3 d[w]=10;
223 3 for(i=0;i<250;i++)
224 3 delay(250);
225 3 d[w]=distem;
226 3 for(i=0;i<250;i++)
227 3 delay(250);
228 3 }
229 2 keyboard=getkey(); //读按键;
230 2
231 2 if(flag2==1)
232 2
233 2 { rehour=hour;
234 3 reminute=minute;
235 3 resecond=second;
236 3 distime=1;
237 3
238 3 keyboard1=getkey();
239 3
240 3
241 3 if(keyboard1==1)
C51 COMPILER V7.01 HT1380_TIME3 07/11/2007 21:15:43 PAGE 5
242 3 { state=1; // ..按键后会同时向后退到下一位
243 4 w++;
244 4 if(w>3) w=0;
245 4 }
246 3 else if(keyboard1==2)
247 3 { d[w]++;
248 4 if(d[0]>2) d[0]=0;
249 4 if(d[0]==2&&d[1]>3) d[1]=0;
250 4 if(d[2]>5) d[2]=0;
251 4 else if(w>=1&&d[w]>9) d[w]=0;
252 4 }
253 3 else if(keyboard1==3)
254 3 { if(d[w]>0) d[w]--; }
255 3 else if(keyboard1==4)
256 3 { callhour=d[0]*16+d[1];
257 4 callminute=d[2]*16+d[3];
258 4 callsecond=0;
259 4 hour= rehour;
260 4 minute=reminute;
261 4 second=resecond;
262 4
263 4 flag2=0;
264 4
265 4 }
266 3
267 3
268 3 }
269 2
270 2
271 2 if(keyboard==1) // keyboard=1时,切换转态到较时并且多次..
272 2 { state=1; // ..按键后会同时向后退到下一位
273 3 w++;
274 3 if(w>3) w=0;
275 3 }
276 2 else if(keyboard==2)
277 2 { d[w]++;
278 3 if(d[0]>2) d[0]=0;
279 3 if(d[0]==2&&d[1]>3) d[1]=0;
280 3 if(d[2]>5) d[2]=0;
281 3 else if(w>=1&&d[w]>9) d[w]=0;
282 3 }
283 2 else if(keyboard==3)
284 2 { if(d[w]>0) d[w]--; }
285 2 else if(keyboard==4)
286 2 { hour=d[0]*16+d[1];
287 3 minute=d[2]*16+d[3];
288 3 second=0;
289 3 set_time();
290 3 state=0;
291 3 }
292 2 if(hour==0x7&&minute==0x10&&(second>=0&&second<=9))
293 2 beep=0;
294 2 beep=1;
295 2
296 2 }
297 1
298 1 }
299
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 833 ----
C51 COMPILER V7.01 HT1380_TIME3 07/11/2007 21:15:43 PAGE 6
CONSTANT SIZE = 15 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 17 2
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -