ht1380_time3.lst
来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 562 行 · 第 1/2 页
LST
562 行
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:45:25 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE HT1380_TIME3
OBJECT MODULE PLACED IN ht1380_time3.OBJ
COMPILER INVOKED BY: D:\SOFTWARE\kkk\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 flag=0;
12 bit flag2=0;
13 void Music(unsigned char number);
14 void delay10ms(unsigned char time);
15 void delay50us(unsigned char time);
16 unsigned char code SOUNDLONG[];
17 unsigned char code SOUNDTONE[];
18
19
20 /**********定义两个全局变量*********/
21 //定义数组变量用于存放四个数码管的显示数据
22 //定义number存放动态显示是第几个数码管
23 unsigned char d[4],number;
24
25 /*********定义时间变量年月日时分秒***********/
26 unsigned char year,month,day,hour,minute,second,callhour,callminute,callsecond,rehour,reminute,resecond,ca
-llhour2,callminute2,callsecond2;
27 /**********定义冒号变量 distime=1 是数码管冒号显示出来************/
28 bit distime;
29
30 /*******与数码管相关的两个表*********/
31 //一个显示译码表 //注:这里表比前一个多了一个值,最后一个数代表空显示
32 //一个使能译码表
33 unsigned char code tab[11]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0};
34 unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
35
36 /******延时程序***********/
37 void delay(unsigned char dy)
38 {
39 1 while(--dy);
40 1 }
41
42 /******按键接口描述********/
43 //左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4
44 //左第一个按键键值为1
45 //左第二个按键键值为2
46 //左第三个按键键值为3
47 //左第四个按键键值为4
48
49 /******读取按键子程序 getkey()*************/
50 unsigned char getkey (void)
51 { unsigned char k,m,tem,keytem;
52 1 unsigned int j=0;
53 1 keytem=0;
54 1
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:45:25 PAGE 2
55 1 tem=P2 & 0xf0; //第一次读取按键值
56 1 if(tem!=0xf0) //判断有无按键按下
57 1 {
58 2 for(k=0;k<20;k++)
59 2 delay(250); //延时一段时间
60 2 tem=P2 & 0xf0; //再次读取按键值
61 2 if(tem!=0xf0)
62 2 { if(tem==0x70) keytem=1; //表示左第一个按键按下
63 3 else if(tem==0xb0) keytem=2; //表示左第二个按键按下
64 3 else if(tem==0xd0) keytem=3; //表示左第三个按键按下
65 3 else if(tem==0xe0) keytem=4; //表示左第四个按键按下
66 3 }
67 2 }
68 1
69 1 while(tem!=0xf0)
70 1 {
71 2 for(m=0;m<250;m++)
72 2 delay(250),j++;
73 2 tem=P2 & 0xf0; //等待按键释放
74 2 if (tem==0x70&&j>500)
75 2 {
76 3 flag=1;
77 3
78 3 }
79 2
80 2
81 2 if (tem==0xb0&&j>500)
82 2 {
83 3 flag2=1;
84 3
85 3 }
86 2 }
87 1 return(keytem); //返回按键值
88 1 }
89
90 /******* ht1380 子程序*****************/
91 //------------- sent_char to ht1380----------
92 //上升沿写入
93 void sent_char(unsigned char sentchar)
94 {
95 1 unsigned char ii;
96 1
97 1 for(ii=0;ii<8;ii++)
98 1 {
99 2 ht1380_sclk=0;
100 2 if ((sentchar & 1)!=0) ht1380_data=1;
101 2 else ht1380_data=0;
102 2 ht1380_sclk=1;
103 2 sentchar=sentchar>>1;
104 2 }
105 1 }
106 //------------- get_char from ht1380---------
107 unsigned char get_char()
108 {
109 1 unsigned char getchar,ii,temp;
110 1 getchar=0;temp=1;
111 1 for(ii=0;ii<8;ii++)
112 1 {
113 2 ht1380_sclk=0;
114 2 ht1380_data=1;
115 2 if(ht1380_data==1) getchar=getchar |temp;
116 2 ht1380_sclk=1;
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:45:25 PAGE 3
117 2 temp=temp<<1;
118 2 }
119 1 return(getchar);
120 1 }
121
122 //-------------set_wp_off------------------
123 void set_wp_off()
124 {
125 1 ht1380_rest=1;
126 1 sent_char(0x8e); //10001110b
127 1 sent_char(0); //00000000b
128 1 ht1380_sclk=0;
129 1 ht1380_rest=0;
130 1 }
131 //-----------set_wp_on--------------------
132 void set_wp_on()
133 {
134 1 ht1380_rest=1;
135 1 sent_char(0x8e); //10001110b
136 1 sent_char(0x80); //10000000b
137 1 ht1380_sclk=0;
138 1 ht1380_rest=0;
139 1 }
140 //----------read_time --------------------
141 void read_time()
142 {
143 1 unsigned char temp;
144 1 ht1380_rest=1;
145 1 sent_char(0xbf); //10111111b
146 1 second=get_char();
147 1 minute=get_char();
148 1 hour= get_char();
149 1 day= get_char();
150 1 month= get_char();
151 1 temp= get_char(); /* week day */
152 1 year= get_char();
153 1 temp= get_char();
154 1 ht1380_sclk=0;
155 1 ht1380_rest=0;
156 1
157 1 }
158 //--------------set time-----------------
159 void set_time()
160 {
161 1 set_wp_off();
162 1 ht1380_rest=1;
163 1 sent_char(0xbe); //10111110b
164 1 sent_char(second);
165 1 sent_char(minute);
166 1 sent_char(hour);
167 1 sent_char(day);
168 1 sent_char(month);
169 1 sent_char(1); /* week day */
170 1 sent_char(year);
171 1 sent_char(0);
172 1 ht1380_sclk=0;
173 1 ht1380_rest=0;
174 1 set_wp_on();
175 1 }
176
177 /*****定时器初始化程序*******/
178 void Init_Timer (void)
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:45:25 PAGE 4
179 {
180 1 TMOD=0x21;
181 1 TH0=(65536-1000)/256;
182 1 TL0=(65536-1000)%256;
183 1 TR0=1;
184 1 ET0=1;
185 1 EA=1;
186 1 }
187
188 /*****定时器0中断服务程序******/
189 //显示处理,具体可以参考前面的实验
190 void timer0() interrupt 1 using 1
191 {
192 1 TH0=(65536-1000)/256;
193 1 TL0=(65536-1000)%256;
194 1 number=number++;
195 1 if(number>3) number=0;
196 1 P2=digit[number];
197 1 P0=tab[d[number]];
198 1 //在第二个数码管显示时,将最高位的小数点显示出来,这里为冒号
199 1 if(distime==1 && number==1)
200 1 P0=tab[d[number]]+0x80;
201 1 }
202
203 /*******闹铃程序***********/
204
205 //延时程序
206 void delay10ms(unsigned char time)
207 {
208 1 unsigned char a,b,c;
209 1 for(a=0;a<time;a++)
210 1 for(b=0;b<100;b++)
211 1 for(c=0;c<12;c++)
212 1 ;
213 1 }
214 void delay50us(unsigned char time)
215 {
216 1 unsigned char a,b;
217 1 for(a=0;a<time;a++)
218 1 for(b=0;b<6;b++)
219 1 ;
220 1 }
221
222 unsigned char code SOUNDLONG[]=
223 {9,3,12,12,12,24,
224 9,3,12,12,12,24,
225 9,3,12,12,12,12,12,
226 9,3,12,12,12,24,
227 0, //生日快乐end
228 6,6,9,3,6,6,12,
229 6,6,6,6,6,6,12,
230 6,6,9,3,6,6,9,3,
231 6,3,3,6,3,3,6,6,9,
232 0 //三轮车end
233 };
234
235 unsigned char code SOUNDTONE[]=
236 {
237 212,212,190,212,159,169,
238 212,212,190,212,142,159,
239 212,212,106,126,159,169,190,
240 119,119,126,159,142,159,
C51 COMPILER V7.01 HT1380_TIME3 07/14/2007 22:45:25 PAGE 5
241 0, //生日快乐end
242 239,239,212,189,159,159,189,
243 159,159,142,126,120,120,159,
244 120,120,142,159,189,142,159,189,
245 239,212,189,159,142,159,189,212,239,
246 0 //三轮车end
247 };
248
249 void Music(unsigned char number)
250 {
251 1 unsigned int k,n;
252 1 unsigned int SoundLong,SoundTone;
253 1 unsigned int i,j,m;
254 1
255 1 for(k=0;k<number-1;k++)
256 1 {
257 2 while(SOUNDLONG[i] !=0){i++;}
258 2 i++;
259 2 if(i>=57) i=0;
260 2 }
261 1 for(k=0;k<number-1;k++)
262 1 {
263 2 while(SOUNDTONE[j] !=0){j++;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?