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

📄 3208_v4.01.00.c

📁 《爱上单片机》_单片机学习必备
💻 C
📖 第 1 页 / 共 4 页
字号:
/**********************************************************************************************/
void Load_time(void){ //时间组合与显示
	bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
	if(read_clock(0x85) > read_clock(0xc3) && read_clock(0x85) < read_clock(0xc5)){//设定范围内整点报时
		if(hour_renew != read_clock(0x85)){//当小时值更新时则启动报时 
			hour_renew = read_clock(0x85);//将新的小时值放入更新寄存器//这里会导致开机时报一次整点,因为开机pp值不等于小时值。
			Beep();//启动正点报时								---V4.0注
		}			
	}
	putin_buf(read_clock(0x85)/16);//显示小时值(十位,为0时消隐)
	putin_buf(read_clock(0x85)%16);//显示小时值(个位)
	putin_buf(17);//显示冒号“:
	putin_buf(read_clock(0x83)/16);//显示分钟值(十位)
	putin_buf(read_clock(0x83)%16);//显示分钟值(个位)
}
/**********************************************************************************************/
void Load_T_week(void){	//温度、星期组合与显示
	if(timecount<=201)//由于第三种显示方式每次装数据都要读温度值时需要进行温度转换,
					  //要花较长时间,导致显示较暗。这里改成显示的时候只读取一次数据。
					  //当timecount为201-250时,只在201时转换一次温度数据,其它时间不转换。
					  //只有在第三种显示方式timecount才会大于200。
	ty = printTemperature();//取得的温度值放入温度寄存器变量
	bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)			
	if(ty >60){//当温度高于99度或未发现温度传感器(DS18B20)时显示“--”	
	putin_buf(18);//显示“--
	putin_buf(18);
	}
	else{//温度小于99度并发现温度传感器(DS18B20)时,显示温度值 
		if(ty/10 != 0){//为0时消隐
		putin_buf(ty/10);//温度值的十位
		}
	putin_buf(ty%10);//温度值的个位
	}
	putin_buf(19);//显示摄氏度符号“oC”
	putin_buf(23);//显示摄氏度符号“周”----V4.0
	putin_buf(read_clock(0x8b)+9);//显示星期数据
}
/**********************************************************************************************/	
void disbuf_pro (void){//将待显缓冲区内容放入显示缓冲区的处理。---V4.0
	uchar i;
	if(read_clock(0xc3+7*6+4)==1){//显示模式1--静态显示时间
	 	timecount=0;//对定时器的计数清零,防止溢出。
		clearBuf();//清待显缓冲
		Load_time();
		for(i=0;i<40;i++){	//对80字节待显数据进行移位。
			Ledplay_buf [i]=Ledplay_buf [i+40];
		}
	}
	if(read_clock(0xc3+7*6+4)==2){//显示模式2--流动显示所有信息
		if(timecount>(read_clock(0xc3+7*6)+4))//控制左移的速度。加4为了避免默认速度飞快//原数据为timecount>8
		{										//加4也可以调节最高与最低速的平衡。
			timecount=0;
			left_move_time++;
			Ledplay_buf [79]=0x00;//对最后一帧数据清零,当left_move_time=40的时候相当于将后四十个字节全部清零。
			for(i=0;i<79;i++){	//对80字节待显数据进行移位。
				Ledplay_buf [i]=Ledplay_buf [i+1];
			}
			if(left_move_time>=40){//左移次数判断
				left_move_time=0;
				disbuf_flag++;
				if(disbuf_flag==5)disbuf_flag=1;
				//以下为根据不同的标志向待显缓冲区放入不同的内容。
				if(disbuf_flag==1){
					Load_date();
				}
				if(disbuf_flag==2){
					Load_time();		
				}
				if(disbuf_flag==3){
					Load_T_week();
				}
				if(disbuf_flag==4){}//显示一屏空数据
			}
		}
	}
	if(read_clock(0xc3+7*6+4)==3){//显示模式3--整页切换显示所有信息
		if((timecount>=0)&&(timecount<=150)){//显示时间timecount<--限定范围显示才正确,不然会乱跳。
			clearBuf();//清待显缓冲
			Load_time();
			for(i=0;i<40;i++){	//对80字节待显数据进行移位。
				Ledplay_buf [i]=Ledplay_buf [i+40];
			}
		}
		if((timecount>150)&&(timecount<=200)){//显示日期
			clearBuf();//清待显缓冲
			Load_date();
			for(i=0;i<40;i++){	//对80字节待显数据进行移位。
				Ledplay_buf [i]=Ledplay_buf [i+40];
			}
		}
		if((timecount>200)&&(timecount<=250)){//显示温度及星期
		 	clearBuf();//清待显缓冲
			Load_T_week();//
			for(i=0;i<40;i++){	//对80字节待显数据进行移位。
				Ledplay_buf [i]=Ledplay_buf [i+40];
			}
		}
		if(timecount>250)timecount=0;
	}
}
/**********************************************************************************************/	
void Timer0_Init(void){//定时器0初始(主函数中被调用一次)
	TMOD=0x01;//定时器方式设置(定时器工作方式1-16位定时)
	TH0=(65535-10000)/256;//50MS
	TL0=(65535-10000)%256;
	EA=1;//开总中断
	ET0=1;//开定时器0中断允许 
	TR0=1;//启动定时器0
}
/**********************************************************************************************/	
void Timer0(void) interrupt 1 using 0{//定时器中断入口,使用第1工作组寄存器=定时器中断函数(产生显示切换)
	TH0=(65535-10000)/256; //50ms定时(定时器工作方式1)
  	TL0=(65535-10000)%256; //----------------定时改为10MS 
  	timecount++;//软件计数加1	
}
/**********************************************************************************************/	
void MENUadd1 (void){//主菜单加1或减1
	if(Add_Key == 0 || Add2_Key == 0){			
		DelayM(20);//去抖
		if(Add_Key == 0){			
			MENU++;
			Beep_key();//调时提示音
			if(MENU >12){//减少两组闹钟,增加三个功能,menu由11改为12
				MENU = 1;
			}		
		}
		if(Add2_Key == 0){			
			MENU--;
			Beep_key();//调时提示音
			if(MENU <1){
				MENU = 12;
			}		
		}			
		key_off ();//等待键放开		
	}	
}
/**********************************************************************************************/	
void MENUexit (void){//退出菜单项 回到时钟显示
	if(int_Key == 0){
		DelayM(20);//去抖			
		if(int_Key == 0){
			key_off ();//等待键放开
			Beep_set();//调时提示音
			clearRAM();//清空显示缓冲区数据
			//timecount = 19;//将显示切换值调到41,使开机画面停留2秒
			MENU = 0;
			Timer0_Init();//定时器初始化
		}
	}
}
/**********************************************************************************************/	
void main(void){ //主函数 
	uchar b,a = 0;//定义变量用于数据提取指针
	Init_1302();//调用时间初始化函数
	Beep();//启动发出报时音(测试扬声器)
	clearBuf();//清空待显BUF,避免开机后流动的第一屏有乱码。
	do{//显示开机画面“DoYoung
		Ledplay[bn] = DoYoung[a];//将二维数组中的一组数据放入显示缓冲区
		a++;//换下一个提取字节	
		bn++;//换下一个显示缓冲字节			
	}  
	while(DoYoung[a] != 0x99);//当显示数据为0时结束循环
	//timecount = 41;//将显示切换值调到41,使开机画面停留2秒
	display_delay(255);//用显示来作为大致的延时,一举两得!!!
	Timer0_Init();//定时器初始化
	MENU = 0;//显示标志为0表示正常显示
	BEEP_bit = 0;
/**********************************************************************************************/	
	while(1){//主线程
/**********************************************************************************************/	
		if(BEEP_bit == 1 && read_clock(0xc7) == 1){
			ET0 = 0;//关定时器中断(停止显示切换)
			TR0 = 0;
			bn=0;//计数清零,使数据从第一个字节开始存放。
			clearRAM();//清空显示缓冲区数据
			putin(read_clock(0x85)/16);//显示小时值(十位,为0时消隐)
			putin(read_clock(0x85)%16);//显示小时值(个位)
			putin(17);//显示冒号“:
			putin(read_clock(0x83)/16);//显示分钟值(十位)
			putin(read_clock(0x83)%16);//显示分钟值(个位)
			for(b=0;b<140;b++){	//扫描键盘
				Beeplll();
				for(a=0;a<6;a++){
					if(OK_Key == 0 || int_Key == 0 || Add_Key == 0 || Add2_Key == 0){
						b = 200;
						v = read_clock(0x83);//按键停止后设置分=V,可防止松开键后再次响
					}
 					display ();//正常扫描显示驱动
					Led_EA  = 1;//关列显示驱动,防止出现拖尾现象。
				}		
			}
			BEEP_bit = 0;
			ET0 = 1;//关定时器中断(停止显示切换)
			TR0 = 1;
		}else{
			Led_EA  = 1;//关列显示驱动,防止出现拖尾现象。
			display ();//正常扫描显示驱动---[整个系统的显示程序]---
			Led_EA  = 1;
			if(v != read_clock(0x83)){//当分不再是闹钟的分时,则设置V是211 不会有冲突
				v = 0xfe;
			}
		}	
/**********************************************************************************************/	
		if(MENU == 0) {//时钟显示,主画面
		disBuf_2_disRam();//缓冲数据转存至显示缓冲区
		ET0 = 0;TR0 = 0;
		disbuf_pro();//这里处理待显示的数据
		ET0 = 1;TR0 = 1;
		search_time();//--------检测闹钟
		Time_adj();//-----------时间校准。	
			if(OK_Key == 0){//OK键 全部LED点亮 测试用
				DelayM(10);//去抖20MS左右,[感觉按键有点干扰似的,老是很快的红屏]
				if(OK_Key==0){
					for(bn=0;bn<32;bn++){//	
					Ledplay[bn] = 0xff;//将数据放入显示缓冲区
					}
				}
			}
			if(Add_Key == 0){//按+键显示LOGO “DOYOUNG”	 
				bn = 0;a=0;
				clearRAM();//清空显示缓冲区数据
				while(DoYoung[a] != 0x99){//显示画面“DOYOUNG”		
					Ledplay[bn] = DoYoung[a];//
					a++;//换下一个提取字节	
					bn++;//换下一个显示缓冲字节			
				}
				display_delay(255);
			}
			if(Add2_Key == 0){//按-键显示版本号 V3.0
				bn = 0;a=0;
				clearRAM();//清空显示缓冲区数据
				while(V30[a] != 0x99){//显示开机画面“ALARM”		
					Ledplay[bn] = V30[a];//将二维数组中的一组数据放入显示缓冲区
					a++;//换下一个提取字节	
					bn++;//换下一个显示缓冲字节			
				}
				display_delay(255);
			}
			if(int_Key == 0){//接MENU键 进入设置菜单			
				DelayM(20);//去抖			
				if(int_Key == 0){
				key_off ();//等待键放开
				ET0 = 0;//关定时器中断(停止显示切换)
				TR0 = 0;
				MENU++;//MENU菜单切换值加1 跳入菜单项目
				Beep_set();//调时提示音			
				}
			}		
		}
/**********************************************************************************************/	
		if(MENU >0 && MENU < 7){//ALARM1~8 闹钟设置菜单	//ALARM1~6 闹钟设置菜单	 ---V4.0
			bn = 0;a=0;	
			clearRAM();//清空显示缓冲区数据
			while(ALARM[a] != 0x99){//显示开机画面“ALARM”			
				Ledplay[bn] = ALARM[a];//将二维数组中的一组数据放入显示缓冲区		
				a++;//换下一个提取字节		
				bn++;//换下一个显示缓冲字节				
			}
			putin(MENU);//显示闹钟组号			 --V4.0  //这里是把数据直接放到待显示RAM中
			if(OK_Key == 0){//确定进入此号闹钟				
		 		DelayM(20);//去抖				
		 		if(OK_Key == 0){	
					key_off ();//等待键放开	
		 			Beep_set();//调时提示音				
					a = MENU;
					MENU = 200;
					b = 200;
				}	
		 	}	
			MENUadd1 ();//菜单加1	
			MENUexit ();//	
		}
/**********************************************************************************************/	
		if(MENU == 200){//闹钟调时设置项 	
			uchar y = 0;
			bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)	
			clearRAM();//清空显示缓冲区数据
			switch (b){//显示设置项的说明
				case 200:			
					while(Mode[y] != 0x99){//显示开机画面“MODE”				
						Ledplay[bn] = Mode[y];//将二维数组中的一组数据放入显示缓冲区	
						y++;//换下一个提取字节		
						bn++;//换下一个显示缓冲字节				
					}
					putin(read_clock(0xc3+a*6));//根据闹钟组号读出设置值
					break;//		
				case 201:
					bn = 0;	
					clearRAM();//清空显示缓冲区数据	
					while(A[y] != 0x99){//显示			
						Ledplay[bn] = A[y];//将二维数组中的一组数据放入显示缓冲区	
						y++;//换下一个提取字节		
						bn++;//换下一个显示缓冲字节				
					}	
					putin(read_clock(0xc3+a*6+2)/16);//显示(十位)		
					putin(read_clock(0xc3+a*6+2)%16);//显示(个位)		
					putin(24);//显示“时”表示		
					break;//		
				case 202:			
					bn = 0;	
					clearRAM();//清空显示缓冲区数据	
					while(A[y] != 0x99){//显示			
						Ledplay[bn] = A[y];//将二维数组中的一组数据放入显示缓冲区	
						y++;//换下一个提取字节		
						bn++;//换下一个显示缓冲字节				
					}	
					putin(read_clock(0xc3+a*6+4)/16);//显示分(十位)		
					putin(read_clock(0xc3+a*6+4)%16);//显示分(个位)		
					putin(25);//显示“分”表示		
					break;//		
			}
			if(OK_Key == 0){//确定进入此号闹钟			
				DelayM(20);//去抖				
				if(OK_Key == 0){	
					key_off ();//等待键放开	
					Beep_set();//调时提示音
					b++;//设置下一项
					if(b>202){ b = 200;}
				}	
			}
			Set_time(b,a);
			MENUexit ();	
		}
/**********************************************************************************************/	
		if(MENU == 7){//TIME 调时设置项	-----V4.0--(7)
			bn = 0;a=0;	
			clearRAM();//清空显示缓冲区数据
			while(Time[a] != 0x99){//显示开机画面“ALARM”			
				Ledplay[bn] = Time[a];//将二维数组中的一组数据放入显示缓冲区	
				a++;//换下一个提取字节		
				bn++;//换下一个显示缓冲字节				
			}	
			MENUadd1 ();//菜单加1	
			MENUexit ();	
		 	if(OK_Key == 0){				
		 		DelayM(20);//去抖				
		 		if(OK_Key == 0){	
					key_off ();//等待键放开	
		 			Beep_set();//调时提示音				
		 			MENU = 100;	
					a = 1;	
		 		}	
			 }	
		}
/**********************************************************************************************/	
		if(MENU == 100){//TIME 调时设置项 	
			uchar y = 0;	
			bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)	
			clearRAM();//清空显示缓冲区数据

⌨️ 快捷键说明

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