📄 wannianli.lst
字号:
159 1 dd=clock_in();
160 1 clock_Rst=0;
161 1 clock_clk=1;
162 1 return(dd);
163 1 }
164 //---------------------------------------常用时钟数据读取
165 void read_clockS(void){
166 1 mm = read_clock(0x83);//读取分钟数据
167 1 hh = read_clock(0x85);//小时
168 1 dd = read_clock(0x87);//日
169 1 mo = read_clock(0x89);//月
170 1 xq = read_clock(0x8b);//星期
171 1 yy = read_clock(0x8d);//年
172 1 }
173 //*---------------------------------------DS1302写数据(底层协议)
174 void write_clock(uchar ord, uchar dd){
175 1 clock_clk=0;
176 1 clock_Rst=0;
177 1 clock_Rst=1;
178 1 clock_out(ord);
179 1 clock_out(dd);
C51 COMPILER V7.50 WANNIANLI 01/09/2006 22:13:53 PAGE 4
180 1 clock_Rst=0;
181 1 clock_clk=1;
182 1 }
183 //--------------------------------------------------调时用加1程序
184 void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
185 1 signed char address,item;
186 1 signed char max,mini;
187 1 if(sel==7) {address=0x80; max=0;mini=0;} //秒7
188 1 if(sel==6) {address=0x82; max=59;mini=0;} //分钟6
189 1 if(sel==5) {address=0x84; max=23;mini=0;} //小时5
190 1 if(sel==3) {address=0x86; max=31;mini=1;} //日3
191 1 if(sel==2) {address=0x88; max=12;mini=1;} //月2
192 1 if(sel==1) {address=0x8c; max=99; mini=0;} //年1
193 1 if(sel==4) {address=0x8a; max=7;mini=1;} //星期4
194 1 //读取1302某地址上的数值转换成10进制赋给item
195 1 item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
196 1 item++;//数值加1
197 1 if(item>max) item=mini;//查看数值有效范围
198 1 if(item<mini) item=max;
199 1 write_clock(0x8e,0x00);//允许写操作
200 1 write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
201 1 write_clock(0x8e,0x80);//写保护,禁止写操作
202 1 }
203 //--------------------------------------------设置1302的初始时间
204 void Init_1302(void){//(2005年12月20日12时00分00秒星期二)
205 1 write_clock(0x8e,0x00);//允许写操作
206 1 write_clock(0x8c,0x05);//年
207 1 write_clock(0x8a,0x02);//星期
208 1 write_clock(0x88,0x12);//月
209 1 write_clock(0x86,0x20);//日
210 1 write_clock(0x84,0x12);//小时
211 1 write_clock(0x82,0x00);//分钟
212 1 write_clock(0x80,0x00);//秒
213 1 write_clock(0x90,0xa5);//充电
214 1 write_clock(0x8e,0x80);//禁止写操作
215 1 }
216 //--------------------------------------------扬声器--整点报时
217 void Beep(void){//BELL
218 1 uchar a;//定义变量用于发声的长度设置
219 1 Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
220 1 for(a=60;a>0;a--){//第一个声音的长度
221 2 Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
222 2 Delay(100);//音调设置延时
223 2 }
224 1 for(a=100;a>0;a--){//同上
225 2 Bell_Out = ~Bell_Out;
226 2 Delay(80);//
227 2 }
228 1 for(a=100;a>0;a--){//同上
229 2 Bell_Out = ~Bell_Out;
230 2 Delay(30);//
231 2 }
232 1 }
233 //--------------------------------------------扬声器--设置报警
234 void Beep_set(void){//BELL
235 1 uchar a;//定义变量用于发声的长度设置
236 1 Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
237 1 for(a=250;a>0;a--){//第一个声音的长度
238 2 Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
239 2 Delay(20);//音调设置延时
240 2 }
241 1 for(a=100;a>0;a--){//同上
C51 COMPILER V7.50 WANNIANLI 01/09/2006 22:13:53 PAGE 5
242 2 Bell_Out = ~Bell_Out;
243 2 Delay(80);//
244 2 }
245 1 }
246 //----------------------------------------扬声器--按键音
247 void Beep_key(void){
248 1 uchar a;//定义变量用于发声的长度设置
249 1 Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
250 1 for(a=100;a>0;a--){//声音的长度
251 2 Bell_Out = ~Bell_Out;
252 2 Delay(50);//音调设置延时
253 2 }
254 1 }
255 //----------------------------------------32个寄存器清空(0x00)
256 void clearRAM (void){//寄存器清空函数
257 1 uchar a;//定义变量用于清空数据指针
258 1 for(a=0;a<32;a++){//指向32个寄存器
259 2 Ledplay[a] = 0;//将指向的寄存器清空
260 2 }
261 1 }
262 //----------------------------------------将字符装入显示寄存器
263 void putin (uchar u){//字符载入函数
264 1 uchar a = 0;//定义变量用于数据提取指针
265 1 do{
266 2 Ledplay[bn] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
267 2 a++;//换下一个提取字节
268 2 bn++;//换下一个显示缓冲字节
269 2 }
270 1 while(no[u][a] != 0);//当显示数据为0时结束循环
271 1 bn++;//换下一个显示缓冲字节
272 1 Ledplay[bn] = 0;//显示一列的空位,便于字符区分
273 1 }
274 //------------------------------------调时切换
275 void setput (uchar k){
276 1 switch(k){//K为0调整日期,K为1调整时间,K为2调整年和星期
277 2 case 0:{
278 3 read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
279 3 clearRAM();//清空显示缓冲区数据
280 3 bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
281 3 if(mo/16 != 0){
282 4 putin(mo/16);//显示月值(十位,为0时消隐)
283 4 }
284 3 putin(mo%16);//显示月值(个位)
285 3 putin(21);//显示横杠“月”
286 3 if(dd/16 != 0){
287 4 putin(dd/16);//显示日值(十位,为0时消隐)
288 4 }
289 3 putin(dd%16);//显示日值(个位)
290 3 putin(22);//显示“日”
291 3 }break;
292 2 case 1:{
293 3 read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
294 3 clearRAM();//清空显示缓冲区数据
295 3 bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
296 3 //if(hh/16 != 0){
297 3 putin(hh/16);//显示小时值(十位,为0时消隐)
298 3 //}
299 3 putin(hh%16);//显示小时值(个位)
300 3 putin(17);//显示冒号“:”
301 3 putin(mm/16);//显示分钟值(十位)
302 3 putin(mm%16);//显示分钟值(个位)
303 3 }break;
C51 COMPILER V7.50 WANNIANLI 01/09/2006 22:13:53 PAGE 6
304 2 case 2:{
305 3 read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
306 3 clearRAM();//清空显示缓冲区数据
307 3 bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
308 3 putin(yy/16);//显示年(十位)
309 3 putin(yy%16);//显示年(个位)
310 3 putin(20);//显示“Y”表示年
311 3 putin(xq+9);//显示星期数据
312 3 }break;
313 2 default:{//数据不附时退出
314 3 }
315 2 }
316 1 Beep_key();//按键音
317 1 }
318 //----------------------------------------32*8点阵显示驱动
319 void display (void){//点阵屏驱动函数
320 1 uchar ac,aa=7;//定义两个数据变量
321 1 for(ac=0x28;ac<0x30;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)
322 2 Led_E = ac;//用ac值驱动使能列信号
323 2 Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏(嵌入DL汇编是为了翻转字节数据,如果接线正确可省
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -