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

📄 n90clockc.c

📁 单片机开发资料光盘-双龙-686M.zip
💻 C
字号:
#include<io8515.h>
#include<slavr.h>

#pragma interrupt_handler timer0_ovf:8

#define clrcs     PORTC&=~0x10;   
#define setcs     PORTC|=0x10;
#define clrclk    PORTC&=~0x08;
#define setclk    PORTC|=0x08;



unsigned char  led[]={0,0,0,0,0,0};
unsigned char  *ledpoint;
unsigned char  beep,timecnt;

struct time                //定义结构体time
{
 unsigned char second;
 unsigned char minute;
 unsigned char hour;
} time;
 

void delay(unsigned char mst)  //延时子程序
 {  unsigned char i;
     for (i = 1; i<mst; i++)
			;
 }


void send(unsigned char temp)  //发送子程序
{
 unsigned char i;
 clrcs
 delay(150);
 clrclk
 for(i=8;i>0;i--)
  {
   PORTC=(temp&0x80)?PORTC|0x04:PORTC&0xfb;
   setclk
   delay(10);
   clrclk
   delay(10);
   temp=temp<<1;
  }
 PORTC&=~0x04;  
} 

void write279(unsigned char cmd1, unsigned char cmd2)
{
	send(cmd1);
	send(cmd2);                              
	setcs;
}

 receive(void)              //接收子程序
{
 unsigned char i,rec_buff;
 DDRC&=~0x04;
 PORTC&=~0x04;
 delay(150); 
 for(i=8;i>0;i--)
 { 
  rec_buff=rec_buff<<1;
  setclk
  delay(10);
  rec_buff=(PINC&0x04)==0?rec_buff&0xfe:rec_buff|0x01;
  clrclk
  delay(10);
 } 
 DDRC|=0x04;
 PORTC&=~0x04;
 return rec_buff;	
}

void initdis()                  //初始化时间  
{
 unsigned char	i;
 write279(0x88,0x7f);
 for(i=0xc8;i<2+0xc8;i++)
 {				 
  write279(i,0);
 }
  write279(0x92,0x01);
 for(i=0xcb;i<2+0xcb;i++)
 {
  write279(i,0);
 }
  write279(0x95,0x01);
 for(i=0xce;i<2+0xce;i++)
 {
  write279(i,0);
 }  
  beep=0;
}


void display(unsigned char ledcnt,unsigned char dischar)                    //显示子程序
{
  write279(ledcnt,dischar);
  *(ledpoint++)=dischar;
}

void bitblink(unsigned char m)
{
 if(m==5|m==2) m=m-1;
 if(m==0xff)   m=7;
 m=1<<m;
 m^=0xff;
 write279(0x88,m);
}

   
keyscan(void)                //键扫子程序
{
 static signed char keycode,keypress=0;
 if((PINC&0x02)==0)
 {
  if(keypress==0)
  {
   send(0x15);
   keycode=receive();
   setcs
   keypress=1;
  } 
   return 0xff;
 }

 if(keypress==1)
 {
  keypress=0;
  return   keycode; 
 }
 return 0xff;
}

void judgetime()              //判断时间是否正确
{
 unsigned char i;
 for(i=0;i<6;i++)
 {				 
  if(led[i]>=10)
  {
   goto settime0;
  }
 }
 time.hour=led[0]*10+led[1];
 time.minute=led[2]*10+led[3];
 time.second=led[4]*10+led[5];
 if(time.hour>=24)
 {
   goto settime0;

 }
 if(time.minute>=60)
 {
   goto settime0;
 }
 if(time.second>=60)
 {
   goto settime0;
 }
 return;
settime0:
 initdis();
 time.hour=0;
 time.minute=0;
 time.second=0;
}     

void opentime()                  //初始化定时器
{
 timecnt=0;
 SREG|=0X80;
 TCNT0=0X06;
 TIMSK=0X02;
 TCCR0=0X04;
}               

void dissecond()                //显示秒
{
 write279(0xc9,time.second/10);
 write279(0xc8,time.second%10);
} 
void disminute()                //显示分
{
 write279(0xcc,time.minute/10);
 write279(0xcb,time.minute%10);
} 
void dishour()                   //显示小时
{
 write279(0xcf,time.hour/10);
 write279(0xce,time.hour%10);
}    

 main()
{
 unsigned char i,j,n,c,ledbit;
 DDRC=0xfd;
 PORTC=0xf7;
 send(0xa4);
 setcs
 initdis();
 ledbit=0xcf;
 ledpoint=led;
 n=7;
 while((c=keyscan())!=0x17)
 {
     if(c!=0xff)
	 {
	  if(ledbit==0xc7) 
	  {
	   ledbit=0xcf;
	   ledpoint=led;
	   n=7;
	  }
	  if((ledbit==0xcd)|(ledbit==0xca))
      {
	   ledbit=ledbit-1;
	   n=n-1;
	  }
      display(ledbit--,c);
      bitblink(--n);
     }	
 }
 write279(0x88,0xff);
 judgetime();
 opentime();
ww:
 while(beep)
 {
  for(j=0;j<15;j++)
  {
  for(i=0;i<250;i++)
   {
  PORTC^=0X01;
  delay(220);
   }
  }
  beep=0;
 }
  goto ww;
}

void timer0_ovf()              //溢出中断子程序
{
 TCNT0=0x06;
 if((++timecnt)>=125)
 {
  timecnt=0;
  if((++time.second)>=60)
  {
   time.second=0;
   if((++time.minute)>=60)
   {
   	beep=1;
   	time.minute=0;
	if((++time.hour)>=24)
	{
	 time.hour=0;	
	}    
	dishour();
   }
  disminute();
  }
  dissecond();
 }
}

⌨️ 快捷键说明

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