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

📄 clock.c

📁 基于AVR128单片机的电子时钟程序
💻 C
字号:
#include <iom128.h>
#include <lcd.h>
#define key (PIND&0x08)==0 
#define data (PIND&0x04)==0x04
#define set_cs asm("sbi 0x18,2")
#define set_clk asm("sbi 0x18,3")
#define set_data asm("sbi 0x12,2")
#define cl_cs asm("cbi 0x18,2")
#define cl_clk asm("cbi 0x18,3")                     
#define cl_data asm("cbi 0x12,2")
#pragma interrupt_handler key_check:5
#pragma interrupt_handler timer_ov:15
unsigned char k=0;
unsigned char h=0,m=0,s=0;
unsigned char timer_set[6]={0,0,0,0,0,0};
unsigned char alm[6]={0,0,0,0,0,0};
unsigned char mode=0;
unsigned char o=0;
unsigned char lcd[6]={48,48,48,48,48,48};
void timer_ov()
{
if(s<59)
s++;
else
{
if(m<59)
m++;
else
{
if(h<23)
h++;
else
{
h=0;
m=0;
s=0;
}
m=0;
}
s=0;
}
lcd_clear();
TCNT1H=0x0b;
TCNT1L=0xdb;
}
void display()
{
lcd_putss(4,4,lcd[0]);
lcd_putss(5,4,lcd[1]);
lcd_putss(6,4,58);
lcd_putss(7,4,lcd[2]);
lcd_putss(8,4,lcd[3]);
lcd_putss(9,4,58);
lcd_putss(10,4,lcd[4]);
lcd_putss(11,4,lcd[5]);
switch(mode)
{
case 0:if(o==0)
	   lcd_putsc(2,2,"闹铃关闭");
       else 
       {if((lcd[0]==alm[0]+48)&&(lcd[1]==alm[1]+48)&&(lcd[2]==alm[2]+48)&&(lcd[3]==alm[3]+48)&&(lcd[4]==alm[4]+48)&&(lcd[5]==alm[5]+48))
        lcd_putsc(1,2,"闹铃时间到");
	    else
        lcd_putsc(2,2,"闹铃开启");
       }
       break;
case 1:lcd_putsc(2,2,"时间设置");
       break;
case 2:lcd_putsc(2,2,"闹钟设置");
       break;
}
}
void timer_init()
{
TIMSK|=0x04;
TCNT1H=0x0b;
TCNT1L=0xdb;
TCCR1B|=0x04;
}
void main()
{
unsigned char i=0;
unsigned char j=0;
lcd_init();
init_7279();
timer_init();
lcd_clear();
while(1)
{
switch(k)
{
case 0:break;
case 4:if(mode<2)
       {mode++;}
       else
	   {mode=0;}
	   k=0;
       break;
case 31:if(mode==1)
        {
		timer_set[i]=0;
		i++;
		if(i>5)
		{i=0;}
		}
		if(mode==2)
		{
		alm[j]=0;
		j++;
		if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 23:if(mode==1)
        {
		timer_set[i]=1;
		i++;
		if(i>5)
		{i=0;}
		}
		if(mode==2)
		{
		alm[j]=1;
		j++;
		if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 15:if(mode==1)
        {
		timer_set[i]=2;
		i++;
		if(i>5)
		{i=0;}
		}
		if(mode==2)
		{
		alm[j]=2;
		j++;
		if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 7:if(mode==1)
        {
		if(i!=0)
		{
		timer_set[i]=3;
		i++;
		}
		else if(i>5)
		{i=0;}
		}
		if(mode==2)
        {
		if(j!=0)
		{
		alm[j]=3;
		j++;
		}
		else if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 30:if(mode==1)
        {
		if(i!=0)
		{
		timer_set[i]=4;
		i++;
		}
		else if(i>5)
		{i=0;}
		}
		if(mode==2)
        {
		if(j!=0)
		{
		alm[j]=4;
		j++;
		}
		else if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 22:if(mode==1)
        {
		if(i!=0)
		{
		timer_set[i]=5;
		i++;
		}
		else if(i>5)
		{i=0;}
		}
		if(mode==2)
        {
		if(j!=0)
		{
		alm[j]=5;
		j++;
		}
		else if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 14:if(mode==1)
        {
		if(i!=0&&i!=2&&i!=4)
		{
		timer_set[i]=6;
		i++;
		}
		else if(i>5)
		{i=0;}
		}
		if(mode==2)
        {
		if(j!=0&&j!=2&&j!=4)
		{
		alm[j]=6;
		j++;
		}
		else if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 6:if(mode==1)
        {
		if(i!=0&&i!=2&&i!=4)
		{
		timer_set[i]=7;
		i++;
		}
		else if(i>5)
		{i=0;}
		}
		if(mode==2)
        {
		if(j!=0&&j!=2&&j!=4)
		{
		alm[j]=7;
		j++;
		}
		else if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 29:if(mode==1)
        {
		if(i!=0&&i!=2&&i!=4)
		{
		timer_set[i]=8;
		i++;
		}
		else if(i>5)
		{i=0;}
		}
		if(mode==2)
        {
		if(j!=0&&j!=2&&j!=4)
		{
		alm[j]=8;
		j++;
		}
		else if(j>5)
		{j=0;}
		}
		k=0;
		break;
case 21:if(mode==1)
        {
		if(i!=0&&i!=2&&i!=4)
		{
		timer_set[i]=9;
		i++;
		}
		else if(i>5)
		{i=0;}
		}
		if(mode==2)
        {
		if(j!=0&&j!=2&&j!=4)
		{
		alm[j]=9;
		j++;
		}
		else if(j>5)
		{j=0;}
		}
		k=0;
		break; 
case 13:if(mode==0)
        {
		if(m<59)
        m++;
        else
        {
        if(h<23)
        h++;
        else
        {
        h=0;
        m=0;
        }
        m=0;
        }
		}
	    k=0;
        break;
case 5:if(mode==0)
        {
		if(m>0)
       m--;
       else
       {
       if(h>0)
       h--;
       else
       {
       h=23;
       m=59;
       }
       m=59;
       }
	   }
       k=0;
       break;
case 12:if(o==0)
        {o=1;}
		else if(o==1)
		{o=0;}
		k=0;
        break;
default:break;    	   
}
switch(mode)
{
case 0:i=0;
       lcd[0]=h/10+48;
	   lcd[1]=h%10+48;
	   lcd[2]=m/10+48;
	   lcd[3]=m%10+48;
	   lcd[4]=s/10+48;
	   lcd[5]=s%10+48;
	   break; 
case 1:j=0;
       lcd[0]=timer_set[0]+48;
	   lcd[1]=timer_set[1]+48;
	   lcd[2]=timer_set[2]+48;
	   lcd[3]=timer_set[3]+48;
	   lcd[4]=timer_set[4]+48;
	   lcd[5]=timer_set[5]+48;
       break;
case 2:s=timer_set[4]*10+timer_set[5];
       m=timer_set[2]*10+timer_set[3];
       h=timer_set[0]*10+timer_set[1];
       lcd[0]=alm[0]+48;
	   lcd[1]=alm[1]+48;
	   lcd[2]=alm[2]+48;
	   lcd[3]=alm[3]+48;
	   lcd[4]=alm[4]+48;
	   lcd[5]=alm[5]+48;
	   break; 
default:break;
}
display();
}
}
void key_check()
{
send(0x15);
k=receive();
set_cs;
}
void init_7279()
{
SREG|=0x80;
EIMSK|=0x08;
EICRA&=0x3f;
DDRD&=0xf7;
DDRB|=0x0c;
PORTD&=0xfb;
}
void send (unsigned char out_data)
{
unsigned char i;
DDRD|=0x04;
cl_cs;
l_delay();
for(i=0;i<8;i++)
 {
  if(out_data&0x80)
   set_data;
  else
   cl_data;
  s_delay();
  set_clk;
  s_delay();
  cl_clk;
  s_delay();
  out_data*=2;
 }
 cl_data;
}
unsigned char receive(void)
{
 unsigned char i;
 unsigned char in_data=0x00;
 DDRD&=0xfb;
 for(i=0;i<8;i++)
 {
  set_clk;
  s_delay();
  in_data*=2;
  if(data)
   in_data|=0x01;
  cl_clk;
  s_delay();
 }
 cl_data;
 return(in_data);
}
void l_delay()
{
unsigned char i=33;
while(i!=0)
{i--;}
}
void s_delay()
{
unsigned char i=11;
while(i!=0)
{i--;}
}

⌨️ 快捷键说明

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