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