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

📄 time.c

📁 实现时钟计时的功能
💻 C
字号:
#include<avr/io.h>
#include<avr/signal.h>
#include<avr/interrupt.h>
#include<avr/pgmspace.h>
#define PRG_RDB(addr)       pgm_read_byte(addr)
#include"bolibei.h"

#define PPI_1_PB (unsigned char *)0x6001;
#define PPI_1_PC (unsigned char *)0x6002;
#define PPI_1_CT (unsigned char *)0x6003;
#define TLCD_CTRL (unsigned char *)0x7000;
#define TLCD_DATA (unsigned char *)0x7001;



unsigned char*ppi_ctrl,*ppi_pb,*key;
unsigned char*lcd_data,*lcd_control;
unsigned int cnt=0;           //用于声音文件的全局变量

void initialize_timer(void);
void initialize_text_lcd(void);
void lcd_control_wait(void);
void lcd_data_wait(void);
void delay(int d1,int d2);
void print_message(char *message);
void transmit(void);
void initialize_ppi(void);
void transmit1(void);
unsigned char out_put(unsigned char in);
unsigned char key_scan(void);
void show_time(void);
void compare_time(void);
void music(void);

volatile unsigned char secl,sech,minl=9,minh=5,hourl,hourh;
volatile unsigned char secL=0,secH=0,minL=1,minH,hourL,hourH,data;
volatile unsigned char dayl=9,dayh=1,monthl=7,monthh=0; //调整显示日期的变量
volatile unsigned char dayL,dayH,monthL=7,monthH=0;  //调整闹钟日期的变量

volatile unsigned char number=0;

volatile char string_data[]="   00:00:00";        //时间显示字符串
volatile char string_data1[]="   00:00:00";       //闹钟显示字符串
volatile char string_date[]="2006 07 19 ";        //日期显示字符串
volatile char string_date1[]="2006 07 15 ";       //闹钟显示字符串

SIGNAL(SIG_OVERFLOW1)           //定时器1中断程序
{  
   TCNT1=0xffff-16000+1;
   secl+=1;
   if(secl>9)
   {secl=0;
   sech+=1;}
   if(sech==6)
   {minl+=1;
   sech=0;}
   if(minl>9)
   {minh+=1;
   minl=0;}
   if(minh==6)
   {hourl+=1;
   minh=0;}
   if(hourl>9)
   {hourh+=1;
   hourl=0;}
   
   if((hourh==2)&(hourl==4))
   {secl=0;
   sech=0;
   minl=0;
   minh=0;
   hourl=0;
   hourh=0;
   dayl++;
   if(dayl==9)
  {dayl=0;
   dayh++;}
   if((dayh==3)&(dayl==0))
   {dayl=0;
   dayh=0;
   monthl++;}
   if(monthl==9)
   {monthh++;
    monthl=0;}
   if((monthl==2)&(monthh==1))
   {monthl=0;
   monthh=0;}
   }
   transmit();
}

void main (void)
{  unsigned char in;
	MCUCR|=(1<<SRE);
	initialize_text_lcd();
	initialize_timer();
	initialize_ppi();
	do
	{
	  in=key_scan();
	  data=out_put(in);
	  show_time();
	  compare_time();
    }while(1);
}
	
void initialize_timer(void)
{
	TCNT1=0xffff-16000+1;	//记数初值
	TCCR1B=0X05;	        //1024分频
	TIMSK=0x04;		       //打开中断使能
	sei();			      //开中断
}


void initialize_ppi(void)     //键盘初始化
{
ppi_ctrl=PPI_1_CT;
key=PPI_1_PC;
ppi_pb=PPI_1_PB;
*ppi_ctrl=0X90;
*key=0X00;
}

void transmit(void)            //显示数据传送
{
  string_data[3]='0'+hourh;
  string_data[4]='0'+hourl;
  string_data[6]='0'+minh;
  string_data[7]='0'+minl;
  string_data[9]='0'+sech;
  string_data[10]='0'+secl;
  
  string_date[5]='0'+monthh;
  string_date[6]='0'+monthl;
  string_date[8]='0'+dayh;
  string_date[9]='0'+dayl;
  
}

void transmit1(void)
{
  string_data1[3]='0'+hourH;    //显示闹钟时间和日期
  string_data1[4]='0'+hourL;
  string_data1[6]='0'+minH;
  string_data1[7]='0'+minL;
  
  string_date1[5]='0'+monthH;
  string_date1[6]='0'+monthL;
  string_date1[8]='0'+dayH;
  string_date1[9]='0'+dayL;
}
  
void initialize_text_lcd(void)  //LCD初始化
{
lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;
lcd_control_wait();
*lcd_control|=0x38;
lcd_control_wait();
*lcd_control|=0x02;
lcd_control_wait();
*lcd_control|=0x01;
lcd_control_wait();
*lcd_control|=0x06;
lcd_control_wait();
*lcd_control|=0x0c;
lcd_control_wait();
}

void print_message(char *message)  //初始LCD显示时间
{
  unsigned char i;
  for(i=0;i<11;i++)
   {*lcd_data=message[i];
     lcd_data_wait();
   }
}


void lcd_control_wait(void)        //LCD控制延时
{
  delay(1000,10);
}

void lcd_data_wait(void)           //LCD显示延时
{
  delay(1000,10);
}	

void delay(int d1,int d2)          //延时程序
{
  int i,j;
  for(i=0;i<d1;i++)
    {
       for(j=0;j<d2;j++);
    }
}

unsigned char key_scan(void)         //键盘扫描
{
   unsigned char save_low,save_high;
   *ppi_ctrl=0x91;
   *key=0xf0;
    delay(10,10);
	save_low=*key&0x0f;
	*ppi_ctrl=0x90;
	*key=0x00;
	if(save_low)
	{
	*ppi_ctrl=0x98;
	*key=0x0f;
	delay(10,10);
	   save_high=*key&0xf0;
	   *ppi_ctrl=0x90;
	   *key=0x00;
	   if(!save_high)
	   return 0;
	 save_high|=save_low;
	return save_high;
	}
return 0;
}

unsigned char out_put(unsigned char in)  //求取键值
{
  unsigned char a=0;
  switch(in)
{
           case 0x11:a=0x01;
           break;
		   case 0x12:a=0x04;
		   break;
		    case 0x22:a=0x05;
		   break;
		    case 0x42:a=0x06;
		   break;
		    case 0x82:a=0x0b;
		   break;
		    case 0x14:a=0x07;
		   break;
		    case 0x24:a=0x08;
		   break;
		    case 0x44:a=0x09;
		   break;
		    case 0x84:a=0x0c;
		   break;
		   default: a=0x00;
		             break;
		}
			return a;
}


void show_time(void)      //设置时间并显示
{ unsigned char out;
  out=data;
    if(out==1)
      { cli();
	    number++;
	  }
 if(number==1)          //按一下,暂停
	  {
	  *lcd_control=0x01;
	  lcd_control_wait();
	  print_message((char *)string_data);
	  *lcd_control=0xc3;
      lcd_control_wait();
	  print_message((char *)string_date);		
	  delay(1000,1000);}	
  if(number==2)       //按两下,调整闹钟
	  {
      transmit1();
	  *lcd_control=0x01;
	  lcd_control_wait();
	  print_message((char *)string_data1);
      *lcd_control=0xc3;
      lcd_control_wait();	
      print_message((char *)string_date1);			
	  delay(1000,1000);
	  if (out==4)
         {   minL++;
		    if(minL>9)
		      {minH+=1;
			   minL=0;}
		    if(minH==6)
	           minH=0;
	     }
	  if (out==5)
         {  hourL++;
		    if(hourL>9)
		      {hourH+=1;
			   hourL=0;}
	        if((hourH==2)&(hourL==4))
			   {hourL=0;
			   hourH=0;}
		}
			   
		if (out==7)
          {  
		    if((minL==0)&(minH!=0))
		      {minH-=1;
			   minL=9;}
		    else if((minL==0)&(minH==0))
			  {minH=5;
			  minL=9;}
			else
		     minL--;
			 
		  }
	  if (out==8)
         {  
		    if((hourL==0)&(hourH!=0))
		      {hourH-=1;
			   hourL=9;}
			else if((hourH==0)&(hourL==0))
			   {hourL=4;
			   hourH=2;}
			else    
			   hourL--;
		 }
		 
	
	  if (out==6)
         {  dayL++;
		    if(dayL>9)
		      {dayH+=1;
			   dayL=0;}
	        if((dayH==3)&(dayL==1))
			   {dayL=0;
			   dayH=0;}
		 }
	  if (out==9)
         {  
		    if((dayL==0)&(dayH!=0))
		      {dayH-=1;
		       dayL=9;}
			else if((dayH==0)&(dayL==1))
			   {dayL=0;
			   dayH=3;}
			else    
			   dayL--;
		 }
		 if (out==0x0b)
         {  monthL++;
		    if(monthL>9)
		      {monthH+=1;
			   monthL=0;}
	        if((monthH==1)&(monthL==3))
			   {monthL=0;
			   monthH=0;}
		 }
	  if (out==0x0c)
         {  
		    if((monthL==0)&(monthH!=0))
		      {monthH-=1;
		       monthL=9;}
			else if((monthH==0)&(monthL==1))
			   {monthL=2;
			   monthH=1;}
			else if((monthH==0)&(monthL==0)) 
			   {monthL=2;
			   monthH=1;}
		 }
}	
		 if(number==3)    //按三下,调整当前时间
	{
      transmit();
	  *lcd_control=0x01;
	  lcd_control_wait();
	  print_message((char *)string_data);
      *lcd_control=0xc3;
      lcd_control_wait();	
	  print_message((char *)string_date);	
	  delay(1000,1000);
	  if (out==4)
         {   minl++;
		    if(minl>9)
		      {minh+=1;
			   minl=0;}
		    if(minh==6)
	           minh=0;
	     }
	  if (out==5)
         {  hourl++;
		    if(hourl>9)
		      {hourh+=1;
			   hourl=0;}
	        if((hourh==2)&(hourl==4))
			   {hourh=0;
			   hourl=0;}
		}
			   
		if (out==7)
         {  
		    if((minl==0)&(minh!=0))
		      {minh-=1;
			   minl=9;}
		    else if((minh==0)&(minl==0))
			  {minh=5;
			  minl=9;}
			else
		     minl--;
		  }
	  if (out==8)
         {  
		    if((hourl==0)&(hourh!=0))
		      {hourh-=1;
			   hourl=9;}
			else if((hourl==0)&(hourh==0))
			   {hourl=4;
			   hourh=2;}
			else    
			   hourl--;
	      }
		if (out==6)
         {  dayl++;
		    if(dayl>9)
		      {dayh+=1;
			   dayl=0;}
	        if((dayh==3)&(dayl==1))
			   {dayl=0;
			   dayh=0;}
		 }
	  if (out==9)
         {  
		    if((dayl==0)&(dayh!=0))
		      {dayh-=1;
		       dayl=9;}
			else if((dayh==0)&(dayl==1))
			   {dayl=0;
			   dayh=3;}
			else    
			   dayl--;
		 }
		 if (out==0x0b)
         {  monthl++;
		    if(monthl>9)
		      {monthh+=1;
			   monthl=0;}
	        if((monthh==1)&(monthl==3))
			   {monthl=0;
			   monthh=0;}
		 }
	  if (out==0x0c)
         {  
		    if((monthl==0)&(monthh!=0))
		      {monthh-=1;
		       monthl=9;}
			else if((monthh==0)&(monthl==1))
			   {monthl=2;
			   monthh=1;}
			else if((monthh==0)&(monthl==0))
			   {monthl=2;
			   monthh=1;}
			else    
			   monthl--;
		 }
    }
     if((number!=1)&(number!=2)&(number!=3))   //正常显示
      {
	  number=0;
	  sei();
	  *lcd_control=0x01;
	  lcd_control_wait();
	  print_message((char *)string_data);
	  *lcd_control=0xc3;
      lcd_control_wait();
      print_message((char *)string_date);				
	  delay(1000,1000);}	
}

void compare_time(void)   //与设置的闹钟时间进行比较,相同就播放音乐
{
if(monthH==monthh)
 if(monthL==monthl)
  if(dayH==dayh)
   if(dayL==dayl)
    if(hourH==hourh)
     if(hourL==hourl)
	  if(minH==minh)
       if(minL==minl)
	    if(secH==sech)
	     if(secL==secl)
	       music();
}

void music(void)        //播放音乐
{        cnt=0;   
    do
         {  *ppi_pb=PRG_RDB(&snd_data[cnt]);
			cnt++;
			if(PRG_RDB(&snd_data[cnt])!='\0')
			delay(20,10);
			else
			delay(20,20);
		 }while(cnt<=32897);}	

⌨️ 快捷键说明

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