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

📄 wannianli.c

📁 LED点阵屏电子钟制作全资料,有注意大家好好学习单片机。望大家分享。
💻 C
📖 第 1 页 / 共 2 页
字号:
		case 0:{
			read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
			clearRAM();//清空显示缓冲区数据
			bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
			if(mo/16 != 0){
				putin(mo/16);//显示月值(十位,为0时消隐)
			}
			putin(mo%16);//显示月值(个位)
			putin(21);//显示横杠“月”
			if(dd/16 != 0){
				putin(dd/16);//显示日值(十位,为0时消隐)
			}
			putin(dd%16);//显示日值(个位)
			putin(22);//显示“日”
		}break;	
		case 1:{
			read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
			clearRAM();//清空显示缓冲区数据
			bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
			//if(hh/16 != 0){
				putin(hh/16);//显示小时值(十位,为0时消隐)
			//}
			putin(hh%16);//显示小时值(个位)
			putin(17);//显示冒号“:”
			putin(mm/16);//显示分钟值(十位)
			putin(mm%16);//显示分钟值(个位)
		}break;	
		case 2:{
			read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
			clearRAM();//清空显示缓冲区数据
			bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
			putin(yy/16);//显示年(十位)
			putin(yy%16);//显示年(个位)
			putin(20);//显示“Y”表示年
			putin(xq+9);//显示星期数据
		}break;
		default:{//数据不附时退出
		}
	}
	Beep_key();//按键音
}
//----------------------------------------32*8点阵显示驱动
void display (void){//点阵屏驱动函数
	uchar ac,aa=7;//定义两个数据变量
	for(ac=0x28;ac<0x30;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)		
		Led_E  = ac;//用ac值驱动使能列信号		
		Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏(嵌入DL汇编是为了翻转字节数据,如果接线正确可省去)
		Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏
		Delay(60);//延时1.2微秒
		Led_13 = 0;//数据总线清空
		Led_24 = 0;
		aa--;//aa减1,换下一列显示
	}
	aa = 23;//指定后16个数据的提取	
	for(ac=0x20;ac<0x28;ac++){//扫描前两块LED屏		
		Led_E  = ac;//用ac值驱动使能列信号		
		Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏
		Led_13 = Ledplay[aa];//将显示寄存器数据写入1、3屏				
		Delay(60);//延时1.2微秒
		Led_13 = 0;//数据总线清空
		Led_24 = 0;
		aa--;//aa减1,换下一列显示
	}
}
//--------------------------------------------32*8点阵反色显示驱动(表示调时)
void display_s (void){//点阵屏驱动函数
	uchar ac,aa=7;//定义两个数据变量
	for(ac=0x28;ac<0x30;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)		
		Led_E  = ac;//用ac值驱动使能列信号		
		Led_24 = ~DL(Ledplay[aa+8]);//将显示寄存器数据反色写入2、4屏(嵌入DL汇编是为了翻转字节数据,如果接线正确可省去)
		Led_13 = ~Ledplay[aa];//将显示寄存器数据反色写入1、3屏
		Delay(60);//延时1.2微秒
		Led_13 = 0;//数据总线清空
		Led_24 = 0;
		aa--;//aa减1,换下一列显示
	}
	aa = 23;//指定后16个数据的提取	
	for(ac=0x20;ac<0x28;ac++){//扫描前两块LED屏		
		Led_E  = ac;//用ac值驱动使能列信号		
		Led_24 = ~DL(Ledplay[aa+8]);//将显示寄存器数据反色写入2、4屏
		Led_13 = ~Ledplay[aa];//将显示寄存器数据反色写入1、3屏				
		Delay(60);//延时1.2微秒
		Led_13 = 0;//数据总线清空
		Led_24 = 0;
		aa--;//aa减1,换下一列显示
	}
}
//-------------------------------------------------------定时器0初始化
void Timer0_Init(void){//定时器0初始(主函数中被调用一次)
	TMOD=0x01;//定时器方式设置(定时器工作方式1-16位定时)
	TH0=(65535-50000)/256;//50MS
	TL0=(65535-50000)%256;
	EA=1;//开总中断
	ET0=1;//开定时器0中断允许 
	TR0=1;//启动定时器0
}
//===============================================定时器中断函数(产生显示切换)
void Timer0(void) interrupt 1 using 0{//定时器中断入口,使用第1工作组寄存器	
	TH0=(65535-50000)/256; //50ms定时(定时器工作方式1)
  	TL0=(65535-50000)%256;  
  	timecount++;//软件计数加1
	if(timecount == 20){//软件计数加到20时显示日期(1S)
		Led_EA  = 1;//关列显示驱动,防止屏幕出现乱码
		read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
		clearRAM();//清空显示缓冲区数据
		bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
		if(mo/16 != 0){//为0时消隐
			putin(mo/16);//显示月值(十位,为0时消隐)
		}
		putin(mo%16);//显示月值(个位)
		putin(21);//显示“月”
		if(dd/16 != 0){//为0时消隐
			putin(dd/16);//显示日值(十位,为0时消隐)
		}
		putin(dd%16);//显示日值(个位)
		putin(22);//显示“日”					
	}
	if(timecount == 40){//软件计数加到40时显示时间(2S)				
		Led_EA  = 1;//关列显示驱动,防止屏幕出现乱码		 
		clearRAM();//清空显示缓冲区数据
		bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
		if(hh > 6 && hh < 22){//整点报时设为早6时到晚22时之间
			if(pp != hh){//当小时值更新时则启动报时 
				pp = hh;//将新的小时值放入更新寄存器
				Beep();//启动报时
			}			
		}
		//if(hh/16){//为0时消隐 
			putin(hh/16);//显示小时值(十位,为0时消隐)
		//}
		putin(hh%16);//显示小时值(个位)
		putin(17);//显示冒号“:”
		putin(mm/16);//显示分钟值(十位)
		putin(mm%16);//显示分钟值(个位)		
	}
  	if(timecount > 80){////软件计数加到80时显示时间(1S) 
		uchar ty = 0;//定义温度寄存器变量  	    			
		timecount = 0;//软件计数清零
		Led_EA  = 1;//关列显示驱动,防止屏幕出现乱码							
		ty = DSS();//将DSS汇编程序取得的温度值放入温度寄存器变量
			clearRAM();//清空显示缓冲区数据
			bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)			
		if(ty >99){//当温度高于99度或未发现温度传感器(DS18B20)时显示“--”		 
			putin(18);//显示“--”
			putin(18);
		}
		else{//温度小于99度并发现温度传感器(DS18B20)时,显示温度值 
			if(ty/10 != 0){//为0时消隐
				putin(ty/10);//温度值的十位
			}
			putin(ty%10);//温度值的个位
		}
		putin(19);//显示摄氏度符号“oC”
		putin(xq+9);//显示星期数据	    		          
    }
}
//===============================================外中断0,调时开关(P3.3)
void int1 (void) interrupt 2 {//中断入口2(INT1)
	uchar a;//定义延时长度
	for(a=100;a>0;a--){//延时处理,防止误按(长按2秒后有效)
		display_s ();//反色显示表示按键有效
	}
	if(int_Key == 0){//进入闹钟设置界面
		Beep_set();//调时提示音	
		if(settime == 0x77){//如果调时标志为0说明当正为正常显示状态	
			ET0 = 0;//关定时器中断(停止显示切换)
			TR0 = 0;
			settime = 0;//变为调时的反色显示
			setput(0);//显示清0后的内容			
		}
		else{//如果调时标志为1说明当正为调时显示状态
			ET0 = 1;//开定时器中断(开启显示切换)
			TR0 = 1;
			settime = 0x77;//变为正常显示
		}
		while(int_Key == 0){//等待调时键释放
			display ();//不释放时调用屏幕显示
		}
	}
}
//===============================================主函数,产生点阵显示
void main(void){ //主函数 
	uchar a = 0;//定义变量用于数据提取指针
	Beep();//启动发出报时音(测试扬声器)
	do{//显示开机画面“DYDIY”		
		Ledplay[bn] = dydiy[a];//将二维数组中的一组数据放入显示缓冲区
		a++;//换下一个提取字节	
		bn++;//换下一个显示缓冲字节			
	}
	while(dydiy[a] != 0x99);//当显示数据为0时结束循环
	timecount = 41;//将显示切换值调到41,使开机画面停留2秒
	Timer0_Init();//定时器初始化
	IT1 = 0;//外中断1下沉触发
	EX1 = 1;//开外中断1(调时键)
	settime = 0x77;//显示标志为0表示正常显示
//-------------------------------------主循环体
	while(1){//	
		static uchar k = 0;
		if(settime == 0x77) {//显示标志为0表示正常显示
			display ();//正常显示驱动
			//正常显示时同时按下Add、Add2、OK三个键则初始化时间
			if(Add_Key == 0 && Add2_Key ==0 && OK_Key == 0 ){
				DelayM(100);//延时去抖动
				if(Add_Key == 0 && Add2_Key ==0 && OK_Key == 0 ){			
					Beep_set();//提示音
					Init_1302();//调用时间初始化函数
				}
			}
		}
		else{//显示标志为1表示调时状态				
			display_s();//调时显示驱动
			if(OK_Key == 0) {//调时切换键按下切换调时的内容
				DelayM(20);//去抖
				if(OK_Key == 0){									
					k++;//切换累加变量					
					setput(k);//显示切换的内容
				    if(k > 2){//切换值超出后清0
						k = 0;//清0
						setput(0);//显示清0后的内容
					}
				while(OK_Key == 0 );//等待键放开
				}
			}
			if(Add_Key == 0){//前位加1键(使屏幕前位的月,年,小时加1)
				DelayM(20);//去抖
				if(Add_Key == 0){
					switch(k){//依照显示内容数据调整
						case 0:{
							Set_time(2);//月调整	
							setput(k);//更新显示数据
						}break;
						case 1:{
							Set_time(5);//小时调整
							setput(k);//更新显示数据
						}break;
						case 2:{
							Set_time(1);//年调整
							setput(k);//更新显示数据
						}break;
						default:{//数值不附的处理(无动作)
						}
					}
				while(Add_Key == 0 );//等待键释放
				}
			}
			if(Add2_Key == 0){//后位加1键(使屏幕前位的日、星期、分钟加1)
				DelayM(20);
				if(Add2_Key == 0){
					switch(k){
						case 0:{
							Set_time(3);//日调整	
							setput(k);//更新显示数据
						}break;
						case 1:{
							Set_time(6);//分调整
							setput(k);//更新显示数据
						}break;
						case 2:{
							Set_time(4);//星期调整
							setput(k);//更新显示数据
						}break;
						default:{//数值不附的处理(无动作)
						}
					}
				while(Add2_Key == 0 );//等待键释放
				}
			}	
		}
	}
}




⌨️ 快捷键说明

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