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

📄 lesson 10.c

📁 有51单片机C语言基础后在较短时间内学会51单片机C。
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar table1[]=" 2009-02-05";
uchar table2[]="    23:23:55";
uchar count,switch_num,flag,judge,day_full,week;
uint year;
char table3[7][3]={{"SUN"},{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"}};
char hour,minute,second,day,month,year1,year2;

sbit s1=P3^2;
sbit s2=P3^4;
sbit rs=P3^0;
sbit en=P3^1;
sbit switch1=P3^5;	 //功能键
sbit switch2=P3^6;	  //加1键
sbit switch3=P3^7;	  //减1键

void delay(uint z);		  //延时
void intial_T0();         //定时器T0初始化
void initial_LCD();	 			 //液晶显示初始化
void write_cmd(uchar cmd_data);	 //写命令
void write_data(uchar data1);    //写数据
void LCD_display(uchar address,uchar temp);  //年、月、日、时、分、秒显示
void week_display(uchar week);		  //星期显示
void keyscan();         //键盘
void count_month_year(); //判断闰年和非闰年个月的天数
void count_day();		//年、月

void main()
{
	intial_T0();
	initial_LCD();
	while(1)
	{
		keyscan();
	}
}

void delay(uint z)			  //延时
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void intial_T0()   //T0初始化
{
    second=56;minute=23;hour=23; week=4;
	day=5; month=2; year1=9; year2=20;
	TMOD=0x01;			
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;
}

void initial_LCD()
{
	uchar i;
	en=0; switch1=1; switch2=1; switch3=1;
	write_cmd(0x38);	// 16X2	5X8显示
	write_cmd(0x0c);	//开显示 光标 闪烁
	write_cmd(0x06);	//地址指针自动加一,不移动
	write_cmd(0x01);	//清屏
	write_cmd(0x80);    //数据指针设置
    for(i=0;i<12;i++)
	{
		write_data(table1[i]);
	}
	write_cmd(0x80+0x40);    //数据指针设置
	for(i=0;i<12;i++)
	{
		write_data(table2[i]);	 
	}
	week_display(4);	   //写星期
}
 
void write_cmd(uchar cmd_data)	 //1602液晶写命令子程序
{
	rs=0;
	P2=cmd_data;	delay(1);	   //P2为数据口
	en=1;	delay(1);
	en=0;
}

void write_data(uchar data1)  //1602液晶写数据子程序
{
	rs=1;
	P2=data1;	delay(1);	  //P2为数据口
	en=1;	delay(1);
	en=0;
}

void LCD_display(uchar address,uchar temp)
{								 //LCD显示程序
    uchar shi,ge;
	shi=temp/10;
	ge=temp%10;
	write_cmd(0x80+0x40+address);    //数据指针设置
	if(flag==1)	write_cmd(0x80+address);
	write_data(0x30+shi);		
	write_data(0x30+ge);
	flag=0;
}

void week_display(uchar week1)
{
	uchar i;
	write_cmd(0x80+12);
	for(i=0;i<3;i++)
	{
	 	write_data(table3[week1][i]);
	}
}

void keyscan()
{
	if(switch1==0)			   //判断功能键是否按下
	{
		delay(5);			 //去抖动
		if(switch1==0)		 //在判断功能键是否按下
		{
			while(!switch1);	 //松手检测
			delay(5);
			switch_num++;		 //功能键次数加一
			TR0=0;
			if(0<switch_num<=8)	  //功能键1到3次液晶显示对应位闪烁
				write_cmd(0x0d);
			if(switch_num==9)	 //按4次功能键时钟运行
			{
				switch_num=0;
				TR0=1;			   //时钟重新运行
				write_cmd(0x0c);   //消除闪烁
			}
            switch(switch_num)  //时 分 秒对应位闪烁
			{	
				case 1: { write_cmd(0x80+0x40+11);}break;
				case 2: { write_cmd(0x80+0x40+8);}break;				              
				case 3: { write_cmd(0x80+0x40+5);}break;
				case 4:	{ write_cmd(0x80+2);}break;
				case 5:	{ write_cmd(0x80+4);}break;
				case 6:	{ write_cmd(0x80+7);}break;
				case 7:	{ write_cmd(0x80+10);}break;
				case 8:	{ write_cmd(0x80+13);}break;			              
			}	
		}	
	}
	if(switch_num!=0)		 //判断功能键是否按下过
	{
	 	if(switch2==0)		 //判断加1键是否按下
		{
			delay(5);		  //去抖动
			if(switch2==0)
			{
				while(!switch2);
				delay(5);
				switch(switch_num)	 
				{
					case 1:{second++;	 //秒加1并刷新显示
							if(second==60) second=0;
							LCD_display(10,second);
							write_cmd(0x80+0x40+11);}break;					case 2:{minute++;	 //分加1并刷新显示
							if(minute==60) minute=0;
							LCD_display(7,minute);
							write_cmd(0x80+0x40+8);}break;
					case 3:{hour++;	   //时加1并刷新显示
							if(hour==24) hour=0;
							LCD_display(4,hour);
							write_cmd(0x80+0x40+5);}break;
					case 4:{year2++;	   //年高二位加1并刷新显示
							if(year2==100) year2=0;
							flag=1;
							LCD_display(1,year2);
							write_cmd(0x80+2);}break;
					case 5:{year1++;	     //年低二位加1并刷新显示
							if(year1==100) year1=0;
							flag=1;
							LCD_display(3,year1);
							write_cmd(0x80+4);}break;
					case 6:{month++;	     //月加1并刷新显示
							if(month==13) month=0;
							flag=1;
							LCD_display(6,month);
							write_cmd(0x80+7);}break;
					case 7:{day++;	     //天加1并刷新显示
							if(day==32) day=0;
							flag=1;
							LCD_display(9,day);
							write_cmd(0x80+10);}break;
					case 8:{week++;	     //星期加1并刷新显示
							if(week==7) week=0;
							week_display(week);
							write_cmd(0x80+13);} break;
				}
			}
		}
	}
	if(switch_num!=0)
	{
		if(switch3==0)
		{
			delay(5);
			if(switch3==0)
			{
				while(!switch3);
				delay(5);
				switch(switch_num)
				{
					case 1:{second--;  //秒减1并刷新显示
					        if(second==-1) {second=59;} 
							LCD_display(10,second);	   
							write_cmd(0x80+0x40+11);}break;
					case 2:{minute--;	//分减1并刷新显示
							if(minute==-1) minute=59;
							LCD_display(7,minute);
							write_cmd(0x80+0x40+8);}break;
					case 3:{hour--;	  //时减1并刷新显示
							if(hour==-1) hour=23;
							LCD_display(4,hour);
							write_cmd(0x80+0x40+5);}break;
					case 4:{year2--;	   //年高二位加1并刷新显示
							if(year2==-1) year2=99;
							flag=1;
							LCD_display(1,year2);
							write_cmd(0x80+2);}break;
					case 5:{year1--;	     //年低二位加1并刷新显示
							if(year1==-1) year1=99;
							flag=1;
							LCD_display(3,year1);
							write_cmd(0x80+4);}break;
					case 6:{month--;	     //月加1并刷新显示
							if(month==0) month=12;
							flag=1;
							LCD_display(6,month);
							write_cmd(0x80+7);}break;
					case 7:{day--;	     //天加1并刷新显示
							if(day==0) day=31;
							flag=1;
							LCD_display(9,day);
							write_cmd(0x80+10);}break;
					case 8:{week--;	     //星期减1并刷新显示
							if(week==-1) week=6;
							week_display(week);
							write_cmd(0x80+13);} break;
                 }	
			}
		}
	}
}

void count_day()
{ 	
    if(month==2)
	{    
		if(judge==1)	  //闰年2月份有29天
		{  
			day++;
			day_full=30;				
			count_month_year();
		}
		if(judge==0)	  //闰年2月份有28天
		{  
			day++;
			day_full=29;	
			count_month_year();
		}
	}
	else if((month==4)||(month==6)||(month==9)||(month==11)) 
	{ 				  //4、6、9、11月份有30天
		day++;
		day_full=31;           
		count_month_year();
	}  
	else	       //1、3、5、7、8、10、12月份有31天
	{ 
	 	day++;
		day_full=32;
        count_month_year();		
	} 
}

void count_month_year()
{	
	if(day==day_full)	//设置满月变量day_full使month嵌套在day中
	{ 
		day=1; month++;
		if(month==13)
		{
			month=1; year1++;
			if(year1==100)
			{
				year1=0; year2++;
				if(year2==100)	year2=0;
				flag=1;
				LCD_display(1,year2);
			}
			flag=1;
			LCD_display(3,year1);
		}
		flag=1;
		LCD_display(6,month);
		}
	flag=1;
	LCD_display(9,day);	
}

void T_0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
	if(count==18)
	{
		count=0; second++;
		if(second==60)
		{
			second=0; minute++;
			if(minute==60)
			{
				minute=0; hour++;
				if(hour==24)
				{
					hour=0; week++;
					if(week==7) week=0;
					week_display(week);
					year=year2*100+year1;
	           		if((year%4==0)&&(year%100!=0)||(year%400==0))	//判断是否是闰年
					{
						judge=1;	//闰年
						count_day();
					}
					else  
					{
					    judge=0;	 //非闰年
						count_day();
					}
				}
				LCD_display(4,hour);	
			}
			LCD_display(7,minute);	
		}
		LCD_display(10,second);
	}
}

 

⌨️ 快捷键说明

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