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

📄 shizhong.c

📁 主要由AT89S52,lcd1602,ds1302以及4*4键盘的控制是实现的一个简单电子表 适合初学单片机者下载
💻 C
字号:
//design by Mr zhen
//date:2009-05-10
//采用4-4矩阵键盘中的三个作为按键
#include <reg52.h>
#include <stdio.h>
#include"ds1302.h"
#include"lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
uchar temp,num=0,s=0;
sbit key_set=P0^4; //功能设计键
sbit key_up=P0^5;//上调
sbit key_down=P0^6;//下调
uchar flag,flag_up,flag_down,id,flag_set,f1,f2,id1[1];//转换标志
uchar ucCurtime[7],times[10],date[12];
uchar inittime[7]={0x00,0x15,0x17,0x10,0x05,0x01,0x09};//初始化时间09年5月9日下午17点31分00秒
void change();
void disp_time(void);
void disp_set(void);
void set(void);
void main()
{
 LCD_init();
 v_setd1302(inittime);
 delay(100); 
 while(1)
 {
  set();
  disp_time();
 }
}

 void set (void)  //功能设置程序
{  
   P0=0xf7;
  //test(key_set); //检测按键1是否按下
   if (key_set==0)
  {
   flag_set=1;
   f1=1;
   delay(10);
   disp_set();
   if(key_set==0)
    {
	 flag_set=1;   //真正按下则置标志1
	 while(key_set==0);
	 }
   }

  if(flag_set==1) //如果设置键1按下
   {while(flag_set==1)//等待设置键1再次按下之前测试键2、3的功能选择
	{//test(key_up);
	  if (key_up==0)
       {
	     delay(10);
         if(key_up==0)
         {flag=1;   //真正按下则置标志1
	      while(key_up==0);
	     }
        }
	 flag_up=flag;
	 flag=0;
	 if(flag_up==1)	 //键2功能选择键的功能加1,转向下一功能设置
	  {id++;
	  delay(10);
	  flag_up=0;
	   if (id==5)  //功能循环选择
	     {id=0;}
	   }
	 //test(key_down);
	  if (key_down==0)
       {delay(10);
         if(key_down==0)
          {flag=1;   //真正按下则置标志1
	       while(key_down==0);
	      }
       }
	 flag_down=flag;
	 flag=0;
	 if(flag_down==1) //键3功能选择键的功能减1,转向上一功能设置
	  {id--;
	  delay(10);
	  flag_down=0;
	   if (id==0xff)   //功能循环选择
	     {id=4;}
	   }
	  //test(key_set);
	     if (key_set==0)
          {delay(10);
           if(key_set==0)
            {flag=1;   //真正按下则置标志1
	          while(key_set==0);
	         }
          }
      flag_set=!flag;  //键1再次按下则flag_set=!flag=0,退出该while循环
	  flag=0;
	  disp_set();
	 }
	 while(flag_set==0)	//等待设置键1第三次按下之前测试键2、3进行各项数据的加减调整
	 { 
	 switch(id)
	   {
	   	  case 0: //test(key_up);	     //调年加
			   if (key_up==0)
                {delay(20);
                 if(key_up==0)
                  {flag=1;   //真正按下则置标志1
	               while(key_up==0);
	              }
                 }
	           flag_up=flag;
	           flag=0;
	           if(flag_up==1)
			   {inittime[6]++;
			    if(inittime[6]==0x0a)
				{inittime[6]=0x10;}
				if(inittime[6]==0x1a)
				{inittime[6]=0x20;}
				if(inittime[6]==0x2a)
				{inittime[6]=0x30;}
				if(inittime[6]==0x3a)
				{inittime[6]=0x40;}
				if(inittime[6]==0x4a)
				{inittime[6]=0x50;}
			    if(inittime[6]==0x5a)
				{inittime[6]=0;}
				}
			  // test(key_down);	   //调年减
			  	if (key_down==0)
                {delay(10);
                 if(key_down==0)
                 {flag=1;   //真正按下则置标志1
                  while(key_down==0);
	              }
                 }
	           flag_down=flag;
	           flag=0;
	           if(flag_down==1)
			   {inittime[6]--;
			    if(inittime[6]==0x0f)
				{inittime[6]=0x09;}
				if(inittime[6]==0x1f)
				{inittime[6]=0x19;}
				if(inittime[6]==0x2f)
				{inittime[6]=0x29;}
				if(inittime[6]==0x3f)
				{inittime[6]=0x39;}
				if(inittime[6]==0x4f)
				{inittime[6]=0x49;}
			    if(inittime[6]==0xff)
				{inittime[6]=0x59;}
			    }
				v_setd1302(inittime);
				break;
	   	  case 1: //test(key_up);		  //调月份加
	           if (key_up==0)
                {delay(10);
                 if(key_up==0)
                  {flag=1;   //真正按下则置标志1
                  while(key_up==0); 
	              }
                }
	           flag_up=flag;
	           flag=0;
	           if(flag_up==1)     
			    { inittime[4]++;
			      if(inittime[4]==0x0a) //完成进制的转换
				  {inittime[4]=0x10;}
				  if(inittime[4]==0x13)
				  {inittime[4]=0x00;}
				}
			   //test(key_down);		 //调月份减
			   if (key_down==0)
                {delay(10);
                  if(key_down==0)
                   {flag=1;   //真正按下则置标志1
                   while(key_down==0); 
	                }
                 }
	           flag_down=flag;
	           flag=0;
	           if(flag_down==1)
			    { inittime[4]--;
			      if(inittime[4]==0x0f) //完成进制的转换
				  {inittime[4]=0x09;}
				  if(inittime[4]==0xff)
				  {inittime[4]=0x12;}
				}
				v_setd1302(inittime);
				break;
		  case 2: //test(key_up);	     //调日期加
			   if (key_up==0)
                {delay(10);
                 if(key_up==0)
                  {flag=1;   //真正按下则置标志1
                 while(key_up==0);
 
	              }
                 }
	           flag_up=flag;
	           flag=0;
	           if(flag_up==1)
			   {inittime[3]++;
			    if(inittime[3]==0x0a)
				{inittime[3]=0x10;}
				if(inittime[3]==0x1a)
				{inittime[3]=0x20;}
				if(inittime[3]==0x2a)
				{inittime[3]=0x30;}
				if(inittime[3]==0x32)
				{inittime[3]=0x00;}
				}
			  // test(key_down);	   //调日期减
			  	if (key_down==0)
                {delay(10);
                 if(key_down==0)
                 {flag=1;   //真正按下则置标志1
                  while(key_down==0);
	              }
                 }
	           flag_down=flag;
	           flag=0;
	           if(flag_down==1)
			   {inittime[3]--;
			    if(inittime[3]==0x0f)
				{inittime[3]=0x09;}
				if(inittime[3]==0x1f)
				{inittime[3]=0x19;}
				if(inittime[3]==0x2f)
				{inittime[3]=0x29;}
			    if(inittime[3]==0xff)
				{inittime[3]=0x31;}
				}
				v_setd1302(inittime);
				break;
	      case 3: //test(key_up);	// 调时加
	           if (key_up==0)
                {delay(10);
                 if(key_up==0)
                  {flag=1;   //真正按下则置标志1
                while(key_up==0);
 
	              }
                }
	           flag_up=flag;
	           flag=0;
	           if(flag_up==1)     
			    { inittime[2]++;
			      if(inittime[2]==0x0a) //完成进制的转换
				  {inittime[2]=0x10;}
				  if(inittime[2]==0x1a)
				  {inittime[2]=0x20;}
				   if(inittime[2]==0x24)
				  {inittime[2]=0;}
				}
			   //test(key_down);		 //调时减
			   if (key_down==0)
                {delay(10);
                  if(key_down==0)
                   {flag=1;   //真正按下则置标志1
                    while(key_down==0);
	                }
                 }
	           flag_down=flag;
	           flag=0;
	           if(flag_down==1)
			    { inittime[2]--;
			      if(inittime[2]==0x0f) //完成进制的转换
				  {inittime[2]=0x09;}
				  if(inittime[2]==0x1f)
				  {inittime[2]=0x19;}
				    if(inittime[2]==0xff)
				  {inittime[2]=0x23;}
				}
				v_setd1302(inittime);
				break;
	    case 4: //test(key_up);	     //调分加
			   if (key_up==0)
                {delay(10);
                 if(key_up==0)
                  {flag=1;   //真正按下则置标志1
                 while(key_up==0);
	              }
                 }
	           flag_up=flag;
	           flag=0;
	           if(flag_up==1)
			   {inittime[1]++;
			    if(inittime[1]==0x0a)
				{inittime[1]=0x10;}
				if(inittime[1]==0x1a)
				{inittime[1]=0x20;}
				if(inittime[1]==0x2a)
				{inittime[1]=0x30;}
				if(inittime[1]==0x3a)
				{inittime[1]=0x40;}
				if(inittime[1]==0x4a)
				{inittime[1]=0x50;}
			    if(inittime[1]==0x5a)
				{inittime[1]=0;}
				}
			  // test(key_down);	   //调分减
			  	if (key_down==0)
                {delay(10);
                 if(key_down==0)
                 {flag=1;   //真正按下则置标志1
                  while(key_down==0);
	              }
                 }
	           flag_down=flag;
	           flag=0;
	           if(flag_down==1)
			   {inittime[1]--;
			    if(inittime[1]==0x0f)
				{inittime[1]=0x09;}
				if(inittime[1]==0x1f)
				{inittime[1]=0x19;}
				if(inittime[1]==0x2f)
				{inittime[1]=0x29;}
				if(inittime[1]==0x3f)
				{inittime[1]=0x39;}
				if(inittime[1]==0x4f)
				{inittime[1]=0x49;}
			    if(inittime[1]==0xff)
				{inittime[1]=0x59;}
			    }
				v_setd1302(inittime);
				break;
		default: break;	        
	   } 
	    disp_set();
	  // test(key_set);
	     if (key_set==0)
          {delay(10);
           if(key_set==0)
             {
			   flag=1;   //真正按下则置标志1
	          while(key_set==0);
	         }
          }
	   flag_set=flag;
	   flag=0;
	  }
	  id=0;
   flag_set=!flag_set;
	}
 }  
void disp_set()
{
if(f2==1)
{
LCD_init();
delay(100);
f2--;
f1=1;
}
gotoxy(0,1);
LCD_display("Date:");
gotoxy(0,2);
LCD_display("Time:");
delay(1);
v_Get1302(ucCurtime); 
change();
gotoxy(5,1);
LCD_display(date);	//显示时间
gotoxy(5,2);
LCD_display(times);//显示日期
gotoxy(15,1);
id1[0]=id+'0'; //显示当前处于何种调节
LCD_display(id1);
}
void disp_time(void)
{
if(f1==1)
{
LCD_init();
delay(100);
f1--;
f2=1;
}
gotoxy(0,1);
LCD_display("Date:");
gotoxy(0,2);
LCD_display("Time:");
delay(1);
v_Get1302(ucCurtime); 
change();
gotoxy(8,1);
LCD_display(date);	//显示时间
gotoxy(8,2);
LCD_display(times);//显示日期
gotoxy(2,2);
}
void change()//时间显示转换程序
{ 
// 时 间 的 转 换
times[0]=ucCurtime[2]/16+'0';
times[1]=ucCurtime[2]%16+'0';
times[2]=':';
times[3]=ucCurtime[1]/16+'0';
times[4]=ucCurtime[1]%16+'0';
times[5]=':';
times[6]=ucCurtime[0]/16+'0';
times[7]=ucCurtime[0]%16+'0';
times[8]=' ';
times[9]=' ';
// 日 期 的 转 换
date[0]=ucCurtime[6]/16+'0';
date[1]=ucCurtime[6]%16+'0';
date[2]='-';
date[3]=ucCurtime[4]/16+'0';
date[4]=ucCurtime[4]%16+'0';
date[5]='-';
date[6]=ucCurtime[3]/16+'0';
date[7]=ucCurtime[3]%16+'0';
date[8]=' ';
date[9]=' ';
date[10]=' ';
}

⌨️ 快捷键说明

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