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

📄 2402test.lst

📁 基于单片机和液晶2402的数字钟     包含电路图及源码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 556   2        }
 557   1        else{//否则是 个位数据
 558   2        	item = (read_clock(address+1))/16;//先读出 十位 数据
 559   2          item2 = DT;//键值放入 个位
 560   2        }  
 561   1        item=(item)*10 + (item2);//将 十位 和 个位 数据合成	 
 562   1        if(item>max) item=mini;//查看数值有效范围   
 563   1        if(item<mini) item=max;           
 564   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 565   1        write_clock(0x8e,0x80);//写保护,禁止写操作
 566   1      }
 567          /*****************************************************************************/
 568          //检测时钟芯片是否未被初始化,如是则设置1302的初始时间
 569          void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
 570   1      	menu = 0;//
 571   1      	if(read_clock(0xc1) != 0xaa){
 572   2      		write_clock(0x8e,0x00);//允许写操作
 573   2      		write_clock(0x8c,0x07);//年
 574   2      		write_clock(0x8a,0x01);//星期
 575   2      		write_clock(0x88,0x01);//月
 576   2      		write_clock(0x86,0x01);//日
 577   2      		write_clock(0x84,0x00);//小时
 578   2      		write_clock(0x82,0x00);//分钟
 579   2      		write_clock(0x80,0x00);//秒
 580   2      		write_clock(0x90,0xa5);//充电	
 581   2      		write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
 582   2      		write_clock(0x8e,0x80);//禁止写操作
 583   2      		AT24C02_Write1Byte(0x03,0x00);//初始化24C00中的报警开关选择寄存器
 584   2      		menu = 1;//如果初始化则直接提示调时
 585   2      	}
 586   1      }
 587          /********************************************************************************************/
 588          // 定义小汉字 // 
 589          uint8 code Xword[]={
 590              0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,        //C,代码 0x03
 591              0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,        //一,代码 0x04
 592              0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,        //二,代码 0x05
 593              0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,        //三,代码 0x06
 594              0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,        //四,代码 0x07
 595              0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,        //五,代码 0x08
 596              0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x09
 597              0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x0a
 598          };
 599          void CgramWrite(void) {// 装入cgram
 600   1          uint8 i;
 601   1      	LCM2402_WriteCMD(0x06);        // CGRAM地址自动加1
 602   1      	LCM2402_WriteCMD(0x40);        // CGRAM地址设为00处
 603   1          for(i=0;i<64;i++) {
 604   2          		LCM2402_WriteData(Xword[i]);
 605   2          }
 606   1      }
 607          //=================================红外遥控接收===========================================//
 608          
 609          sbit	KBS	=	P3 ^ 2;
 610          
 611          /********************************************************************************************
 612          * 函数名称:keyboard_int
 613          * 功    能:中断 红外遥控器数据接收初始化
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 11  

 614          *********************************************************************************************/
 615          void keyboard_int (void){	//INT0中断0 P3.2引脚,不能更改
 616   1      	TMOD 	= 0x01; 		//定时器0方式1
 617   1      	EA 		= 1; 			//允许CPU中断
 618   1      	IT0 	= 1; 			//INT0下降沿有效
 619   1      	EX0 	= 1; 			//开INT0中断;
 620   1      	DT		= 0xff;
 621   1      }
 622          /********************************************************************************************
 623          * 函数名称:keyboard
 624          * 功    能:中断 红外遥控器数据接收
 625          * 入口参数:无
 626          * 出口参数:无
 627          *********************************************************************************************/
 628          void timeint(void) interrupt 1 using 2 {	//定时器0中断处理
 629   1      	TH0=0xFC;	TL0=0xE0; //设定时值为800us
 630   1      	if (IRCON<3){
 631   2      		if (IRCON2<8){ //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
 632   3      			IRCON2++;
 633   3      			IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
 634   3      			IRCode[IRCON]=IRCode[IRCON] | KBS; //每八次填满一个字节,一个字节存放遥控编码4个位
 635   3      			//LED1 = ~LED1;
 636   3      		}
 637   2      		else{
 638   3      			IRCON++; //填满一个字节,指向下一个变量
 639   3      			IRCON2=0; //计数清零
 640   3      		}
 641   2      	}
 642   1      	else{
 643   2      		TR0 = 0; //关闭定时器
 644   2      		ET0 = 0; //定时器0中断关闭
 645   2      		if ((IRCode[1]!=0xff) && (IRCode[2]!=0xff)){
 646   3      			if (IRCode[1] == 0x55){
 647   4      				LED1 = 0;
 648   4      				switch (IRCode[2]){
 649   5      					case 0xD2: DT = 0X4C;break;	//POWER	//ON			
 650   5      					case 0xD3: DT = 0X2F;break;	//MUTE //OFF
 651   5      					case 0xAB: DT = 0x01;break;	//0-9键控制
 652   5      					case 0xAC: DT = 0x02;break;	//
 653   5      					case 0xAD: DT = 0x03;break;					
 654   5      					case 0xB2: DT = 0x04;break;
 655   5      					case 0xB3: DT = 0x05;break;
 656   5      					case 0xB4: DT = 0x06;break;
 657   5      					case 0xB5: DT = 0x07;break;
 658   5      					case 0xCA: DT = 0x08;break;
 659   5      					case 0xCB: DT = 0x09;break;
 660   5      					case 0xAA: DT = 0x00;break;	// 0
 661   5      					case 0xCC: DT = 0X11;break;	// -/--
 662   5      					case 0x54: DT = 0X12;break;	// SEARCH
 663   5      					case 0x2A: DT = 0X17;break;	// vol+
 664   5      					case 0x2B: DT = 0X1A;break; // vol-
 665   5      					case 0xD5: DT = 0X19;break;	// RECALL
 666   5      					case 0xD4: DT = 0X1B;break;	// PP
 667   5      				}
 668   4      			}
 669   3      			if (IRCode[1] == 0x56){
 670   4      				LED1 = 0;
 671   4      				switch (IRCode[2]){
 672   5      					case 0xAA: DT = 0x13;break;//PR+
 673   5      					case 0xAB: DT = 0x14;break;//PR-
 674   5      					case 0xCD: DT = 0x15;break;//FT+
 675   5      					case 0xD2: DT = 0x16;break;//FT-
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 12  

 676   5      					case 0xCB: DT = 0x18;break;//STORE
 677   5      					case 0xB4: DT = 0x1C;break;//SLEEP
 678   5      					case 0x4A: DT = 0X1D;break;	// AV
 679   5      				}
 680   4      			}
 681   3      		}
 682   2      		EX0 	= 1; 			//开INT0中断;
 683   2      	}
 684   1      } 
 685          void INT0Fun(void) interrupt 0 using 3 {	//INT0中断
 686   1      	EX0 = 0; //外部中断0关闭		
 687   1      	ET0 = 1; //定时器0中断打开	
 688   1      	TH0=0xFC;	TL0=0xE0; //设定时值为800us	
 689   1      	for (IRCON=0; IRCON<3; IRCON++){	
 690   2      		IRCode[IRCON] = 0;	
 691   2      	}	
 692   1      	IRCON = 0;	
 693   1      	IRCON2 = 0; //计数清零	
 694   1      	TR0 = 1;//开始计数	
 695   1      }
 696          /********************************************************************************************/
 697          
 698          
 699          //=================================BEEP驱动===========================================//
 700          
 701          sbit	Bell_Out	=	P3 ^ 0;//元件是动圈式扬声器(并非有源蜂鸣器),需要MCU驱动发声
 702          
 703          /********************************************************************************************/
 704          void beep (	unsigned char a,unsigned char b,
 705          			unsigned char c,unsigned char d){
 706   1      	for(;a>0;a--){//第一个声音的长度
 707   2      		Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
 708   2      		Delay(b);//音调设置延时
 709   2      	}
 710   1      	for(;c>0;c--){//同上
 711   2      		Bell_Out = ~Bell_Out;
 712   2      		Delay(d);//
 713   2      	}
 714   1      	Bell_Out = 1;
 715   1      }
 716          /********************************************************************************************/
 717          //--------------------------------------------扬声器--按键音
 718          void beep_k(void){beep(10,60,5,250); }
 719          //--------------------------------------------扬声器--闹钟报警
 720          void beep_a(void){beep(250,16,150,40); }//BELL 
 721          //--------------------------------------------扬声器--成功音
 722          void beep_y(void){beep(50,30,100,50); }//BELL 
 723          //--------------------------------------------扬声器--无效音
 724          void beep_n(void){beep(50,80,100,100); }//BELL 
 725          /********************************************************************************************/
 726          
 727          
 728          //================================纯软件部分=========================================//
 729          
 730          /********************************************************************************************
 731          //显示项目 时间部分 在第一行全行显示时间
 732          *********************************************************************************************/    
 733          void RealTime_Display(void){
 734   1      	    print(0x80,"20");
 735   1      	    print2(0x82,(read_clock(0x8d)/16)+0x30);
 736   1      	    print2(0x83,(read_clock(0x8d)%16)+0x30);
 737   1      		print(0x84,"/");            // 显示年
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 13  

 738   1      		//
 739   1      	    print2(0x85,(read_clock(0x89)/16)+0x30);
 740   1      	    print2(0x86,(read_clock(0x89)%16)+0x30);
 741   1      		print(0x87,"/");            // 显示月
 742   1      		//
 743   1      	    print2(0x88,(read_clock(0x87)/16)+0x30);
 744   1      	    print2(0x89,(read_clock(0x87)%16)+0x30);
 745   1      
 746   1      		print(0x8b,"[");            // 显示[
 747   1      		print2(0x8c,read_clock(0x8b)%16); //星期
 748   1      		print(0x8d,"]");            // 显示]
 749   1      
 750   1      	    print2(0x8f,(read_clock(0x85)/16)+0x30);//小时
 751   1      	    print2(0x90,(read_clock(0x85)%16)+0x30);
 752   1      		print(0x91,":");            // 显示cgram第一个字模":"
 753   1      		//
 754   1      	    print2(0x92,(read_clock(0x83)/16)+0x30);//分钟
 755   1      	    print2(0x93,(read_clock(0x83)%16)+0x30);
 756   1      		print(0x94,".");            // 显示cgram第一个字模"."
 757   1      		//
 758   1      	    print2(0x95,(read_clock(0x81)/16)+0x30);//秒
 759   1      	    print2(0x96,(read_clock(0x81)%16)+0x30);
 760   1      		//
 761   1      		print(0x8a," ");//在主显示区空白处写入空格 防止乱码
 762   1      		print(0x8e," ");
 763   1      		print(0xc0," ");
 764   1      }
 765          /********************************************************************************************
 766          //显示项目 定时时间部分 在第一行全行显示时间
 767          *********************************************************************************************/    
 768          void alarm_Display(void){
 769   1      	    print(0x80,"AL");
 770   1      	    print2(0x82,(AT24C02_Read1Byte(0x05+(rom*10))/16)+0x30);
 771   1      	    print2(0x83,(AT24C02_Read1Byte(0x05+(rom*10))%16)+0x30);
 772   1      		print(0x84,"/");            // 显示年
 773   1      		//
 774   1      	    print2(0x85,(AT24C02_Read1Byte(0x06+(rom*10))/16)+0x30);
 775   1      	    print2(0x86,(AT24C02_Read1Byte(0x06+(rom*10))%16)+0x30);
 776   1      		print(0x87,"/");            // 显示月
 777   1      		//
 778   1      	    print2(0x88,(AT24C02_Read1Byte(0x07+(rom*10))/16)+0x30);
 779   1      	    print2(0x89,(AT24C02_Read1Byte(0x07+(rom*10))%16)+0x30);
 780   1      
 781   1      		print(0x8b,"[");            // 显示[
 782   1      		if(AT24C02_Read1Byte(0x08+(rom*10)) == 0xff){
 783   2      			print(0x8c,"?");
 784   2      		}
 785   1      		else{	
 786   2      			print2(0x8c,AT24C02_Read1Byte(0x08+(rom*10))%16); //星期
 787   2      		}
 788   1      		print(0x8d,"]");            // 显示]
 789   1      
 790   1      	    print2(0x8f,(AT24C02_Read1Byte(0x09+(rom*10))/16)+0x30);//小时
 791   1      	    print2(0x90,(AT24C02_Read1Byte(0x09+(rom*10))%16)+0x30);
 792   1      		print(0x91,":");            // 显示cgram第一个字模":"
 793   1      		//
 794   1      	    print2(0x92,(AT24C02_Read1Byte(0x0a+(rom*10))/16)+0x30);//分钟
 795   1      	    print2(0x93,(AT24C02_Read1Byte(0x0a+(rom*10))%16)+0x30);
 796   1      		print(0x94,".");            // 显示cgram第一个字模"."
 797   1      		//
 798   1      	    print2(0x95,(AT24C02_Read1Byte(0x0b+(rom*10))/16)+0x30);//秒
 799   1      	    print2(0x96,(AT24C02_Read1Byte(0x0b+(rom*10))%16)+0x30);
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 14  

 800   1      		//
 801   1      		print2(0xc0,AT24C02_Read1Byte(0x04+(rom*10))/16+0x30); //显示控制项值//控制项值
 802   1      		print2(0xc1,AT24C02_Read1Byte(0x04+(rom*10))%16+0x30); //
 803   1      
 804   1      }
 805          /********************************************************************************************
 806          //清屏+刷新显示+延时+清空DT 一体函数
 807          //LRDD()
 808          *********************************************************************************************/    
 809          void LRDD (void){
 810   1      	LCM2402_Init();
 811   1      	RealTime_Display();
 812   1      	DelayS(500); DT = 0xff;		
 813   1      }
 814          /********************************************************************************************
 815          //清屏+刷新定时值显示+延时+清空DT 一体函数
 816          //LADD()
 817          *********************************************************************************************/    
 818          void LADD (void){
 819   1      	LCM2402_Init();
 820   1      	alarm_Display();
 821   1      	DT = 0xff;		
 822   1      }
 823          /********************************************************************************************
 824          //闹钟呜响查寻程序
 825          //BEEPing();
 826          *********************************************************************************************/
 827          void BEEPing(void){//闹钟呜响查寻程序
 828   1      	uint8 a;
 829   1      	LADD();
 830   1      	print(0xc4,"{Time`s up}  AV: OFF");
 831   1      	for(a=0;a<250 && DT == 0xff;a++){
 832   2      		beep_a();////
 833   2      	}
 834   1      	DT = 0xff;
 835   1      }
 836          /********************************************************************************************
 837          //闹钟和无线遥控的键值处理
 838          //ALARMing();

⌨️ 快捷键说明

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