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

📄 clock.c

📁 我做的畢業設計,用AT89S51 控制LCD1602作為顯示. DS1302時鐘芯片顯示時間,DS18B20測量溫度,還有4X4的鍵盤驅動.實現了一個計算功能.可以用PROTUES 仿真軟件仿真,當時
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
  
                 
  
   File Name:       clock.c
   Author:          liao xu ming
   Created:         2007/3/23
   Modified:		NO
   Revision: 		1.0
  
***************************************************************************/

#include"clock.H"
#include"keyboard.h"
#include"lcd1602.h"
#include"ds1302.h"
#include"main.h"
#define ON   1
#define OFF  0
 
void BurstWrite1302_New(void);            //DS1302 时钟芯片 多字节数据写入函数声明          
void Display_Adjust_ALARM_Time(void);     //显示 调整打玲时间的函数声明 
void	Display_Time(void);               //显示函数 声明

bit Bell_Flag;                            //打玲标志
bit Bell_Enable;                          //打玲使能
bit LCD_LIGHT_FLAG;                       //LCD 背光灯亮标志  
unsigned char Bell_f;                     //蜂呜器响玲频
bit BurstWrite1302_Flag;                  //多字节数据写入 DS1302 标志
bit Bell_State_switch_flag;               //打玲状态切换标志
bit Call_Display_Adjust_ALARM_Time_Bit;   //调用显示调整打玲时间标志
unsigned char ClockRtc[8]={0,0,0,0,0,0,0,0};           //时钟数据
unsigned char DateString[9]={0,0,0,0,0,0,0,0,0};       //日期数据  
unsigned char TimeString[9]={0,0,0,0,0,0,0,0,0};       //时间数据

unsigned char count_50ms;                              //50ms 中断计数
                                                       //打玲数据
static unsigned char Alarm_Ram[9]={0+'0',0+'0','-',0+'0',0+'0','-',0+'0',0+'0','\0'};
                                                      
unsigned char   code  string_input_the_alarm_time[]="Input alarm time";   //字符串显示 输入打玲时间的英文
extern unsigned char  code  string_clear_line2[];                         //字符串   清空

/***********************
宏定义

***********************/
#define HOUR_H         0               
#define HOUR_L         1
#define MIN_H          3
#define MIN_L          4
#define SECOND_H       6
#define SECOND_L       7

#define YEAR_H         0
#define YEAR_L         1
#define MONTH_H        3
#define MONTH_L        4 
#define DATA_H         6
#define DATA_L         7

#define NORMAL         0  
#define SECOND_ADJ_L   1
#define SECOND_ADJ_H   2 

#define MINUTE_ADJ_L   3 
#define MINUTE_ADJ_H   4  

#define HOUR_ADJ_L     5
#define HOUR_ADJ_H     6

#define DATA_ADJ_L     7
#define DATA_ADJ_H     8

#define MONTH_ADJ_L    9
#define MONTH_ADJ_H    10

#define YEAR_ADJ_L     11
#define YEAR_ADJ_H     12

#define ALARM_ADJ_SECOND_L      13
#define ALARM_ADJ_SECOND_H      14
#define ALARM_ADJ_MIN_L         15
#define ALARM_ADJ_MIN_H         16
#define ALARM_ADJ_HOUR_L        17
#define ALARM_ADJ_HOUR_H        18
#define Bell_Enable_ON_OFF      19

#define STATUS_MIN      0       //最小状态数
#define STATUS_MAX     19       //最大状态数 
extern  bit  State_Switch_Flag; //状态切换标志
unsigned char State_ADJ;        //状态

void  Clock(unsigned char Key_temp) //时钟处理函数
{

if(State_Switch_Flag==1)           //状态切换
  { 
   EA=1;                           //开中断
   State_Switch_Flag=0;           
   LCD_send_command(LCD_CLEAR_SCREEN);  //清屏
   GotoXY(0,0);                        
   Print("Date: ");
   GotoXY(0,1);
   Print("Time: ");
   }

if(Key_temp==ADD)                         //如果'+'键按下
  { 
   if(State_ADJ<STATUS_MAX)State_ADJ++;   //如果状态值小于对大状态,则状态值加1
   else State_ADJ=STATUS_MIN;             //否则,状态值置最小状态值
  }
if(Key_temp==DEC)                         //如果'-'键按下
  { 
   if(State_ADJ>STATUS_MIN)State_ADJ--;   //如果状态值小于对大状态,则状态值加1
   else State_ADJ=STATUS_MIN;             //否则,状态值置最小状态值
    
   if(State_ADJ==YEAR_ADJ_H)              //如果状态是 YEAR_ADJ_H
	  {     LCD_send_command(LCD_CLEAR_SCREEN); //清屏
	    	GotoXY(0,0);
        	Print("Date: ");
	        GotoXY(0,1);
	        Print("Time: ");
			GotoXY(6,0);
        	Print(DateString);
		    GotoXY(6,1);
		    Print(TimeString);
	  }
   }
if(State_ADJ!=NORMAL)                     //如果状态不等于常态
{ 
  if(Key_temp==EQUAL)                     //如果'='键按下
    { 
       BurstWrite1302_New();              //多字节数据写入 DS1302
	   BurstWrite1302_Flag=0;             //
       State_ADJ=NORMAL;                  //状态初始化
       LCD_send_command(LCD_CLEAR_SCREEN);//清屏
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);//不显示光标
	    	GotoXY(0,0);
        	Print("Date: ");
	        GotoXY(0,1);
	        Print("Time: ");
			GotoXY(6,0);
        	Print(DateString);
		    GotoXY(6,1);
		    Print(TimeString);
            EA=1;
    }
}



switch(State_ADJ)                         //状态选择
{
case  NORMAL:                             //常态   
      //displayTime
      {//  Bell=0;
	    if(BurstWrite1302_Flag==1)       //多字节写入DS1302标志为1
	     {
		 BurstWrite1302_New();           //多字节数据写入DS1302 函数
		 BurstWrite1302_Flag=0;          //多字节数据写入DS1302标志为0
		 LCD_send_command(LCD_CLEAR_SCREEN); //清屏
		 GotoXY(0,0);
	     Print("Date: ");
	     GotoXY(0,1);
	     Print("Time: ");
         EA=1;
	  	 TR0=1;
		 LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);//不显示光标
		 }
	   }
      break;
case  SECOND_ADJ_L:                    //秒底位调整
     {  EA=0;                          //关中断
	   /* switch(Key_temp)               //根据按键值选择要写入的  !!好像可以很简单的处理就是用一条语句就可以
			 {
			  case ZERO : TimeString[SECOND_L]=0+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;    
			  case ONE  : TimeString[SECOND_L]=1+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;          
			  case TWO  : TimeString[SECOND_L]=2+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;       
			  case THREE: TimeString[SECOND_L]=3+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;			
			  case FOUR	: TimeString[SECOND_L]=4+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;		 
			  case FIVE	: TimeString[SECOND_L]=5+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;	
			  case SIX	: TimeString[SECOND_L]=6+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;		
			  case SEVEN: TimeString[SECOND_L]=7+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;        
			  case EIGHT: TimeString[SECOND_L]=8+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;          
			  case NINE : TimeString[SECOND_L]=9+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
			  default :break;        
			  }*/
       if((Key_temp>=0)&&(Key_temp<=9))
	    {
       TimeString[SECOND_L]=Key_temp+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]);
        } 
	   GotoXY(13,1);                  //写入秒底位
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
       GotoXY(13,1);
       Delay1ms(20);
       BurstWrite1302_Flag=1;
      }
      break;
case  SECOND_ADJ_H:                    //秒高位调整
      //display
	  {
        if((Key_temp>=0)&&(Key_temp<=5))
		 {
           TimeString[SECOND_H]=Key_temp+'0';GotoXY(12,1);LCD_send_data(TimeString[SECOND_H]);
         }
       GotoXY(12,1);
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
       GotoXY(12,1);
       Delay1ms(20);
	   BurstWrite1302_Flag=1;
      }
      break;
case  MINUTE_ADJ_L:                    //分钟底位调整
      //display
	  {
	     if((Key_temp>=0)&&(Key_temp<=9))
			 {
                TimeString[MIN_L]=Key_temp+'0';GotoXY(10,1);LCD_send_data(TimeString[MIN_L]);
             }  
	   GotoXY(10,1);
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
       GotoXY(10,1);
       Delay1ms(20);
	   BurstWrite1302_Flag=1;
	  }
      break;
case  MINUTE_ADJ_H:                     //分钟高位调整
      //display
	  {
          if((Key_temp>=0)&&(Key_temp<=5))
			    {
	              TimeString[MIN_H]=Key_temp+'0';GotoXY(9,1);LCD_send_data(TimeString[MIN_H]);
				}

       GotoXY(9,1);
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
       GotoXY(9,1);
       Delay1ms(20);
	   BurstWrite1302_Flag=1;
	  }
      break;
case  HOUR_ADJ_L:                      //小时底位调整
      //display
	  {
   

			 if((Key_temp>=0)&&(Key_temp<=9))
			  {
                   TimeString[HOUR_L]=Key_temp+'0';GotoXY(7,1);LCD_send_data(TimeString[HOUR_L]);
               } 
       GotoXY(7,1);
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
       GotoXY(7,1);
       Delay1ms(20);
	   BurstWrite1302_Flag=1;
	  }
      break; 
case  HOUR_ADJ_H:                      //小时高位调整   
      //display
	  {
    
	   /*switch(Key_temp)
			 {
			  case ZERO : TimeString[HOUR_H]=0+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]); break;    
			  case ONE  : TimeString[HOUR_H]=1+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]); break;          
			  case TWO  : TimeString[HOUR_H]=2+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]); break;       
	
			  default :break;        
			  }*/
			   if((Key_temp>=0)&&(Key_temp<=2))
			    {
	                TimeString[HOUR_H]=Key_temp+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]);
				 }

       GotoXY(6,1);
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
       GotoXY(6,1);
       Delay1ms(20);
	   BurstWrite1302_Flag=1;
      }
      break; 
case  DATA_ADJ_L:                      //日期底位调整
      //display
     {
    	    if((TimeString[HOUR_H]-'0'>=2)&&(TimeString[HOUR_L]-'0'>=4))
		   {
		     State_ADJ=HOUR_ADJ_L;
		   }
	 
			   if((Key_temp>=0)&&(Key_temp<=9))
			    {
	                DateString[DATA_L]=Key_temp+'0';GotoXY(13,0);LCD_send_data(DateString[DATA_L]);
				 }

       GotoXY(13,0);
	   LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
       GotoXY(13,0);
       Delay1ms(20);
	   BurstWrite1302_Flag=1;
      }
      break;
case  DATA_ADJ_H:                     //日期高位调整     
      //display
     {
  

			   if((Key_temp>=0)&&(Key_temp<=1))
			    {
                  DateString[DATA_H]=Key_temp+'0';GotoXY(12,0);LCD_send_data(DateString[DATA_H]);
				}

⌨️ 快捷键说明

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