📄 clock.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 + -