⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3208_v4.01.00.lst

📁 《爱上单片机》配书光盘
💻 LST
📖 第 1 页 / 共 3 页
字号:
 470   1      	clock_out(dd);
 471   1      	clock_Rst=0;
 472   1      	clock_clk=1;
 473   1      }
 474          /**********************************************************************************************/	
 475          void Set_time(unsigned char sel,unsigned char a){ //根据选择调整的相应项目加1并写入DS1302-调时用加1程序
 476   1        signed char address,item;
 477   1        signed char max,mini;
 478   1        //if(sel==7)  {address=0x80; max=0;mini=0;}     //秒7
 479   1        if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟6
 480   1        if(sel==5)  {address=0x84; max=23;mini=0;}    //小时5
 481   1        if(sel==3)  {address=0x86; max=31;mini=1;}    //日3
 482   1        if(sel==2)  {address=0x88; max=12;mini=1;}    //月2
 483   1        if(sel==1)  {address=0x8c; max=99; mini=0;}    //年1
 484   1        if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期4 
 485   1        if(sel==200)  {address=0xc2+a*6; max=6;mini=0;}    //MODE 
 486   1        if(sel==201)  {address=0xc2+a*6+2; max=23;mini=0;}    //星期4 
 487   1        if(sel==202)  {address=0xc2+a*6+4; max=59;mini=0;}    //星期4 
 488   1         
 489   1        //读取1302某地址上的数值转换成10进制赋给item 
C51 COMPILER V6.12  3208_V4_01_00                                                          11/03/2008 14:44:34 PAGE 9   

 490   1        item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
 491   1        if(Add_Key == 0){	 key_off ();//等待键放开
 492   2        	item++;//数值加1
 493   2      	Beep_key();//调时提示音
 494   2        }
 495   1        if(Add2_Key == 0){ key_off ();//等待键放开
 496   2        	item--;//数值减1
 497   2      	Beep_key();//调时提示音
 498   2        }  
 499   1        if(item>max) item=mini;//查看数值有效范围   
 500   1        if(item<mini) item=max;           
 501   1        write_clock(0x8e,0x00);//允许写操作
 502   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 503   1        if(sel == 6 && (Add_Key == 0 || Add2_Key == 0)){
 504   2        	write_clock(0x80,0x00);//秒值=0
 505   2        }
 506   1        write_clock(0x8e,0x80);//写保护,禁止写操作  
 507   1      }
 508          /**********************************************************************************************/	
 509          void Init_1302(void){//-设置1302的初始时间(2008年11月3日00时00分00秒星期一)
 510   1      	uchar f;
 511   1      	if(read_clock(0xc1) != 0xaa){
 512   2      		write_clock(0x8e,0x00);//允许写操作
 513   2      		write_clock(0x8c,0x08);//年
 514   2      		write_clock(0x8a,0x01);//星期
 515   2      		write_clock(0x88,0x11);//月
 516   2      		write_clock(0x86,0x03);//日
 517   2      		write_clock(0x84,0x00);//小时
 518   2      		write_clock(0x82,0x00);//分钟
 519   2      		write_clock(0x80,0x00);//秒
 520   2      		write_clock(0x90,0xa5);//充电	
 521   2      		write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
 522   2      		for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
 523   3      			write_clock(0xc2+f,0x00);
 524   3      		}
 525   2      		write_clock(0xc2+7*6+4,2);//设置显示方式为流动显示(2)
 526   2      		write_clock(0xc2+7*6,1);//设置流动速度为1
 527   2      		write_clock(0x8e,0x80);//禁止写操作
 528   2      	}
 529   1      }
 530          /**********************************************************************************************/
 531          //---V4.0
 532          //说明:每个闹钟占用DS1302的三个RAM,从第5个RAM开始使用。
 533          //每三个RAM中的第一个为当前闹钟的开关,第二个为设置的小时值,第三个为设置的分钟值。
 534          //其它三个RAM,0xc6用于闹钟总开关。0xc4报时的结束时间点。0xc2报时的开始时间点。
 535          void search_time(void){//验证闹钟时间到
 536   1      	uchar i;
 537   1      	write_clock(0x8e,0x00);//允许写操作
 538   1      	for(i=1;i<7;i++){//闹钟改为6组,减少2组留出6个字节RAM
 539   2      		if(		read_clock(0xc3+i*6) != 0 && 					//不为0则表示这项已经设置
 540   2      				read_clock(0xc3+i*6+2) == read_clock(0x85) && //小时对比
 541   2      				read_clock(0xc3+i*6+4) == read_clock(0x83)&& //分值对比
 542   2      				read_clock(0x81) < 0x09 && //这里保证秒值小于8秒动作,防止再操作
 543   2      				v != read_clock(0x83))//按键停止防再响
 544   2      		{
 545   3      			switch (read_clock(0xc3+i*6)){//显示设置项的说明		
 546   4      				case 1://只响一次,之后自动关闭[---V4.0即闹一次后把当前闹钟开关给关闭,下次不再闹]			
 547   4      					BEEP_bit = 1;
 548   4      					write_clock(0xc2+i*6,0);		
 549   4      					break;//		
 550   4      				case 2://常开			
 551   4      					BEEP_bit = 1;
C51 COMPILER V6.12  3208_V4_01_00                                                          11/03/2008 14:44:34 PAGE 10  

 552   4      					break;//		
 553   4      				case 3://周六、日除外			
 554   4      					if(read_clock(0x8b) < 6){
 555   5      						BEEP_bit = 1;
 556   5      					}	
 557   4      					break;//		
 558   4      				case 4://周日除外			
 559   4      					if(read_clock(0x8b) < 7){
 560   5      						BEEP_bit = 1;
 561   5      					}	
 562   4      					break;//		
 563   4      				case 5://周六、日响			
 564   4      					if(read_clock(0x8b) > 5){
 565   5      						BEEP_bit = 1;
 566   5      					}	
 567   4      					break;//		
 568   4      				case 6://周日响			
 569   4      					if(read_clock(0x8b) == 7){
 570   5      						BEEP_bit = 1;
 571   5      					}	
 572   4      					break;//		
 573   4      			}
 574   3      		v = read_clock(0x83);		
 575   3      		}	
 576   2      	}
 577   1      write_clock(0x8e,0x80);//禁止写操作
 578   1      }
 579          /**********************************************************************************************/
 580          void Time_adj(void){//---V4.0功能,时间校准程序
 581   1      	unsigned char temp;
 582   1      	temp=read_clock(0xc3+7*6+2);
 583   1      	if((read_clock(0x85)==3)&&(read_clock(0x83)==0)&&(read_clock(0x81)==30)){//凌晨3点0分30秒时校正
 584   2      		if((temp>0)&&(temp<26)){	//减调整
 585   3      			write_clock(0x8e,0x00);//允许写操作
 586   3      			write_clock(0x80,30-(26-temp));//对秒进行调整。26-temp:让本来+2.+1.+0.-25.-24...变成+2.+1.+0.-1.-2...
 587   3      			write_clock(0x8e,0x80);//禁止写操作	
 588   3      		}
 589   2      		if((temp>=26)&&(temp<52)){ //加调整
 590   3      			write_clock(0x8e,0x00);//允许写操作
 591   3      			write_clock(0x80,30+(temp-26));//对秒进行调整
 592   3      			write_clock(0x8e,0x80);//禁止写操作
 593   3      		}
 594   2      	}
 595   1      }
 596          /**********************************************************************************************/	
 597          void clearRAM (void){//寄存器清空函数-32个寄存器清空(0x00)
 598   1      	uchar a;//定义变量用于清空数据指针
 599   1      	for(a=0;a<32;a++){//指向32个寄存器
 600   2      		Ledplay[a] = 0;//将指向的寄存器清空
 601   2      	}
 602   1      }
 603          /**********************************************************************************************/	
 604          void clearBuf (void){//寄存器清空函数-80个寄存器清空(0x00)--V4.0
 605   1      	uchar a;//定义变量用于清空数据指针
 606   1      	for(a=0;a<80;a++){//指向80个寄存器
 607   2      		Ledplay_buf[a] = 0;//将指向的寄存器清空
 608   2      	}
 609   1      }
 610          /**********************************************************************************************/	
 611          void putin_buf (uchar u){//字符载入函数-将字符装入显示寄存器
 612   1      	uchar a = 0;//定义变量用于数据提取指针
 613   1      	do{		
C51 COMPILER V6.12  3208_V4_01_00                                                          11/03/2008 14:44:34 PAGE 11  

 614   2      		Ledplay_buf[bn+40] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
 615   2      		a++;//换下一个提取字节	
 616   2      		bn++;//换下一个显示缓冲字节			
 617   2      	}
 618   1      	while(no[u][a] != 0);//当显示数据为0时结束循环
 619   1      	bn++;//换下一个显示缓冲字节
 620   1      	Ledplay_buf[bn+40] = 0;//显示一列的空位,便于字符区分	
 621   1      }
 622          /**********************************************************************************************/	
 623          void putin (uchar u){//字符载入函数-将字符装入显示寄存器
 624   1      	uchar a = 0;//定义变量用于数据提取指针
 625   1      	do{		
 626   2      		Ledplay[bn] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
 627   2      		a++;//换下一个提取字节	
 628   2      		bn++;//换下一个显示缓冲字节			
 629   2      	}
 630   1      	while(no[u][a] != 0);//当显示数据为0时结束循环
 631   1      	bn++;//换下一个显示缓冲字节
 632   1      	Ledplay[bn] = 0;//显示一列的空位,便于字符区分	
 633   1      }
 634          /**********************************************************************************************/
 635          //将待显缓冲区的前32字节转移到显示缓冲区中--V4.0
 636          void disBuf_2_disRam(void){
 637   1      	uchar i;	
 638   1      	for(i=0;i<32;i++){
 639   2      		Ledplay[i]=Ledplay_buf[i];
 640   2      	}
 641   1      }
 642          //********************************************************************************************************
             -***
 643          //此处是显示显示缓冲区内容的函数,只有这里才有权力涉及到显示缓冲区的读取!!!
 644          //暂时设置部分的显示不改。
 645          //********************************************************************************************************
             -***
 646          void display (void){//点阵屏驱动函数-32*8点阵显示驱动
 647   1      	uchar ac,aa;//定义两个数据变量
 648   1      	aa = 7;//指定前16个数据的提取	
 649   1      	for(ac=0x28;ac<0x30;ac++){//扫描前两块LED屏		
 650   2      		Led_E  = ac;//用ac值驱动使能列信号
 651   2      
 652   2      		Led_24 = DL(Ledplay[aa+8]);//DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏
 653   2      		Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏
 654   2      		
 655   2      		Delay(60);//延时1.2微秒[60]
 656   2      		Led_E  = 0xff;
 657   2      
 658   2      		Led_13 = 0;//数据总线清空
 659   2      		Led_24 = 0;
 660   2      		aa--;//aa减1,换下一列显示
 661   2      	}
 662   1      	aa = 23;//指定后16个数据的提取
 663   1      	for(ac=0x20;ac<0x28;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)		
 664   2      		Led_E  = ac;//用ac值驱动使能列信号	
 665   2      
 666   2      		Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏
 667   2      		Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏
 668   2      
 669   2      		Delay(60);//延时1.2微秒	[60]
 670   2      		Led_E  = 0xff;
 671   2      
 672   2      		Led_13 = 0;//数据总线清空
 673   2      		Led_24 = 0;
C51 COMPILER V6.12  3208_V4_01_00                                                          11/03/2008 14:44:34 PAGE 12  

 674   2      		aa--;//aa减1,换下一列显示
 675   2      	}
 676   1      	Led_E  = 0xff;
 677   1      }
 678          /**********************************************************************************************/
 679          void display_delay(uchar i){//循环显示i次以达到延时功能
 680   1      	while(i){
 681   2      		display();
 682   2      		i--;
 683   2      	}
 684   1      }
 685          /**********************************************************************************************/
 686          void Load_date(void){ //日期组合与显示
 687   1      	bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
 688   1      	if(read_clock(0x89)/16 != 0){//为0时消隐
 689   2      	putin_buf(read_clock(0x89)/16);//显示月值(十位,为0时消隐)/*将数据存入待显区后四十字节。*/
 690   2      	}
 691   1      	putin_buf(read_clock(0x89)%16);//显示月值(个位)
 692   1      	putin_buf(21);//显示"月"
 693   1      	if(read_clock(0x87)/16 != 0){//为0时消隐
 694   2      	putin_buf(read_clock(0x87)/16);//显示日值(十位,为0时消隐)
 695   2      	}
 696   1      	putin_buf(read_clock(0x87)%16);//显示日值(个位)
 697   1      	putin_buf(22);//显示"日" 
 698   1      }
 699          /**********************************************************************************************/
 700          void Load_time(void){ //时间组合与显示
 701   1      	bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
 702   1      	if(read_clock(0x85) > read_clock(0xc3) && read_clock(0x85) < read_clock(0xc5)){//设定范围内整点报时
 703   2      		if(hour_renew != read_clock(0x85)){//当小时值更新时则启动报时 
 704   3      			hour_renew = read_clock(0x85);//将新的小时值放入更新寄存器//这里会导致开机时报一次整点,因为开机pp值不

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -