📄 ht1380_time2.lst
字号:
C51 COMPILER V7.20 HT1380_TIME2 03/04/2007 20:11:44 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE HT1380_TIME2
OBJECT MODULE PLACED IN ht1380_time2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ht1380_time2.c BROWSE DEBUG OBJECTEXTEND
line 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
11 /**********定义两个全局变量*********/
12 //定义数组变量用于存放四个数码管的显示数据
13 //定义number存放动态显示是第几个数码管
14 unsigned char d[4],number;
15
16 /*********定义时间变量年月日时分秒***********/
17 unsigned char year,month,day,hour,minute,second;
18 /**********定义冒号变量 distime=1 是数码管冒号显示出来************/
19 bit distime;
20
21 /*******与数码管相关的两个表*********/
22 //一个显示译码表
23 //一个使能译码表
24 unsigned char code tab[10]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f};
25 unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
26
27 /******延时程序***********/
28 void delay(unsigned char dy)
29 {
30 1 while(--dy);
31 1 }
32
33 /******按键接口描述********/
34 //左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4
35 //左第一个按键键值为1
36 //左第二个按键键值为2
37 //左第三个按键键值为3
38 //左第四个按键键值为4
39
40 /******读取按键子程序 getkey()*************/
41 unsigned char getkey (void)
42 { unsigned char k,tem,keytem;
43 1 keytem=0;
44 1 tem=P2 & 0xf0; //第一次读取按键值
45 1 if(tem!=0xf0) //判断有无按键按下
46 1 {
47 2 for(k=0;k<20;k++)
48 2 delay(250); //延时一段时间
49 2 tem=P2 & 0xf0; //再次读取按键值
50 2 if(tem!=0xf0)
51 2 { if(tem==0x70) keytem=1; //表示左第一个按键按下
52 3 else if(tem==0xb0) keytem=2; //表示左第二个按键按下
53 3 else if(tem==0xd0) keytem=3; //表示左第三个按键按下
54 3 else if(tem==0xe0) keytem=4; //表示左第四个按键按下
55 3 }
C51 COMPILER V7.20 HT1380_TIME2 03/04/2007 20:11:44 PAGE 2
56 2 }
57 1
58 1 while(tem!=0xf0) tem=P2 & 0xf0; //等待按键释放
59 1 return(keytem); //返回按键值
60 1 }
61
62 /******* ht1380 子程序*****************/
63 //------------- sent_char to ht1380----------
64 //上升沿写入
65 void sent_char(unsigned char sentchar)
66 {
67 1 unsigned char ii;
68 1
69 1 for(ii=0;ii<8;ii++)
70 1 {
71 2 ht1380_sclk=0;
72 2 if ((sentchar & 1)!=0) ht1380_data=1;
73 2 else ht1380_data=0;
74 2 ht1380_sclk=1;
75 2 sentchar=sentchar>>1;
76 2 }
77 1 }
78 //------------- get_char from ht1380---------
79 unsigned char get_char()
80 {
81 1 unsigned char getchar,ii,temp;
82 1 getchar=0;temp=1;
83 1 for(ii=0;ii<8;ii++)
84 1 {
85 2 ht1380_sclk=0;
86 2 ht1380_data=1;
87 2 if(ht1380_data==1) getchar=getchar |temp;
88 2 ht1380_sclk=1;
89 2 temp=temp<<1;
90 2 }
91 1 return(getchar);
92 1 }
93
94 //-------------set_wp_off------------------
95 void set_wp_off()
96 {
97 1 ht1380_rest=1;
98 1 sent_char(0x8e); //10001110b
99 1 sent_char(0); //00000000b
100 1 ht1380_sclk=0;
101 1 ht1380_rest=0;
102 1 }
103 //-----------set_wp_on--------------------
104 void set_wp_on()
105 {
106 1 ht1380_rest=1;
107 1 sent_char(0x8e); //10001110b
108 1 sent_char(0x80); //10000000b
109 1 ht1380_sclk=0;
110 1 ht1380_rest=0;
111 1 }
112 //----------read_time --------------------
113 void read_time()
114 {
115 1 unsigned char temp;
116 1 ht1380_rest=1;
117 1 sent_char(0xbf); //10111111b
C51 COMPILER V7.20 HT1380_TIME2 03/04/2007 20:11:44 PAGE 3
118 1 second=get_char();
119 1 minute=get_char();
120 1 hour= get_char();
121 1 day= get_char();
122 1 month= get_char();
123 1 temp= get_char(); /* week day */
124 1 year= get_char();
125 1 temp= get_char();
126 1 ht1380_sclk=0;
127 1 ht1380_rest=0;
128 1
129 1 }
130 //--------------set time-----------------
131 void set_time()
132 {
133 1 set_wp_off();
134 1 ht1380_rest=1;
135 1 sent_char(0xbe); //10111110b
136 1 sent_char(second);
137 1 sent_char(minute);
138 1 sent_char(hour);
139 1 sent_char(day);
140 1 sent_char(month);
141 1 sent_char(1); /* week day */
142 1 sent_char(year);
143 1 sent_char(0);
144 1 ht1380_sclk=0;
145 1 ht1380_rest=0;
146 1 set_wp_on();
147 1 }
148
149 /*****定时器初始化程序*******/
150 void Init_Timer (void)
151 {
152 1 TMOD=0x21;
153 1 TH0=(65536-1000)/256;
154 1 TL0=(65536-1000)%256;
155 1 TR0=1;
156 1 ET0=1;
157 1 EA=1;
158 1 }
159
160 /*****定时器0中断服务程序******/
161 //显示处理,具体可以参考前面的实验
162 void timer0() interrupt 1 using 1
163 {
164 1 TH0=(65536-1000)/256;
165 1 TL0=(65536-1000)%256;
166 1 number=number++;
167 1 if(number>3) number=0;
168 1 P2=digit[number];
169 1 P0=tab[d[number]];
170 1 //在第二个数码管显示时,将最高位的小数点显示出来,这里为冒号
171 1 if(distime==1 && number==1)
172 1 P0=tab[d[number]]+0x80;
173 1 }
174 /*******主函数***********/
175 //效果:
176 //切换显示年月日时分秒
177 //状态1 显示年
178 //状态2 显示月日
179 //状态3 显示时分
C51 COMPILER V7.20 HT1380_TIME2 03/04/2007 20:11:44 PAGE 4
180 //状态4 显示分秒
181 //切换按键使用一个键S2--左边第一个按键
182
183 void main (void)
184 {
185 1 unsigned char keyboard; //键值变量
186 1 unsigned char state=3; //状态指示 首先显示时分
187 1 year=07;month=03;day=0x04;hour=0x19;minute=0x16;second=13; //软件预设时间参数
188 1 ht1380_rest=0;ht1380_sclk=0; //选中时钟芯片
189 1 set_time(); //设置时间
190 1 Init_Timer(); //初始化定时器及全局变量
191 1 number=0;
192 1 while(1)
193 1 {
194 2 read_time(); //读时间
195 2 keyboard=getkey(); //读按键
196 2 if (keyboard==1) state=(state+1)%4; //(左)按键1切换状态
197 2 if (state==0)
198 2 {
199 3 distime=0; //不显示冒号
200 3 d[0]=2;
201 3 d[1]=0;
202 3 d[2]=year/16;
203 3 d[3]=year%16;
204 3 delay(250);
205 3 }
206 2 else if (state==1)
207 2 {
208 3 distime=0; //不显示冒号
209 3 d[0]=month/16;
210 3 d[1]=month%16;
211 3 d[2]=day/16;
212 3 d[3]=day%16;
213 3 delay(250);
214 3 }
215 2 else if(state==2)
216 2 {
217 3 distime=1; //显示冒号
218 3 d[0]=hour/16;
219 3 d[1]=hour%16;
220 3 d[2]=minute/16;
221 3 d[3]=minute%16;
222 3 delay(250);
223 3 }
224 2 else if(state==3)
225 2 {
226 3 distime=1; //显示冒号
227 3 d[0]=minute/16;
228 3 d[1]=minute%16;
229 3 d[2]=second/16;
230 3 d[3]=second%16;
231 3 delay(250);
232 3 }
233 2 }
234 1 }
235
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 523 ----
CONSTANT SIZE = 14 ----
XDATA SIZE = ---- ----
C51 COMPILER V7.20 HT1380_TIME2 03/04/2007 20:11:44 PAGE 5
PDATA SIZE = ---- ----
DATA SIZE = 11 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -