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

📄 clock.c

📁 使用AVR ATmega128实验箱上的资源
💻 C
字号:
#include<avr/io.h>
#include<avr/signal.h>
#include<avr/interrupt.h>
#define TLCD_CTRL (unsigned char *)0x7000
#define TLCD_DATA (unsigned char *)0x7001
#define PPI_1_PA (unsigned char *)0x6000
#define PPI_1_PB (unsigned char *)0x6001
#define PPI_1_PC (unsigned char *)0x6002
#define PPI_1_CT (unsigned char *)0x6003
#define ADD_YEAR 0x80
#define ADD_MONTH 0x85
#define ADD_DATE 0x88
#define ADD_WEEK 0x8b
#define ADD_HOUR 0xc0
#define ADD_MINITE 0xc3
#define ADD_SECOND 0xc6
#define ADD_ALTHOUR 0xc9
#define ADD_ALTMINITE 0xcc
unsigned int Second=0,Minite=0,Hour=0;
unsigned int Date=1,Month=7,Year=2006;
unsigned int second=0,minite=0,hour=0;
unsigned int date=1,month=7,year=2006;
unsigned int AltHour=0,AltMinite=0;
int m[]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char *lcd_data,*lcd_ctrl;
unsigned int interrupt_count=0;
unsigned char keying;
unsigned char *ppi_ctrl,*key;
int Feb(int year);
void init_timer();
void delay(int d1,int d2);
void lcd_ctrl_wait(void);
void lcd_data_wait(void);
void init_text_lcd(void);
void printmsg(char*msg);
void printchar(char c);
void printweek();
void display();
void printcell(int data,int address);
unsigned char key2asc(unsigned char in);
unsigned char key_scan(void);
int bell();
void init_key(void);
int Feb(int year){
	if(((year%4==0)&&(year%100!=0))||(year%100==0))
		return 29;
	else 
		return 28;
}
SIGNAL(SIG_OVERFLOW0){
	TCNT0=0x70;
	TCCR0=0X07;
	m[1]=Feb(Year);
	PORTB=0x60&bell();
	interrupt_count++;
	if(interrupt_count<100)goto ed;interrupt_count=0;Second++;
	if(Second<60)goto ed;Second=0;Minite++;
	if(Minite<60)goto ed;Minite=0;Hour++;
	if(Hour<24)  goto ed;Hour=0;Date++;
	if(Date<m[Month-1])goto ed;Date=1;Month++;
	if(Month<13)goto ed;Month=1;Year++;
	ed:
	if(keying)return;
	display();
}
void init_timer(){
	TCNT0=0x70;
	TCCR0=0X07;
	TIMSK=0x01;
	sei();
}
void delay(int d1,int d2){
	int i,j;
	for(i=0;i<d1;i++)
		for(j=0;j<d2;j++);
}
void lcd_ctrl_wait(void){
	delay(1000,100);
}
void lcd_data_wait(void){
	delay(1000,10);
}
void init_text_lcd(void){
	lcd_ctrl=TLCD_CTRL;
	lcd_data=TLCD_DATA;
	lcd_ctrl_wait();
	*lcd_ctrl=0x38;
	lcd_ctrl_wait();
	*lcd_ctrl=0x02;
	lcd_ctrl_wait();
	*lcd_ctrl=0x01;
	lcd_ctrl_wait();
	*lcd_ctrl=0x06;
	lcd_ctrl_wait();
	*lcd_ctrl=0x0C;
	lcd_ctrl_wait();
}
void printmsg(char*msg)
{
	unsigned int i=0;
	for(i=0;msg[i]!='\0';i++)
	{
		if(msg[i]=='\r')
		{
			*lcd_ctrl=0xc0;
			lcd_ctrl_wait();
		}
		else
		{
			*lcd_data=msg[i];
			lcd_data_wait();
		}
	}
}

void printchar(char c){
	*lcd_data=c;
	lcd_data_wait();
}
void printcell(int data,int address)
{
	char str[5]={0};
	int i;
	for(i=3;i>=0;i--)
	{
		str[i]=data%10+'0';
		data=data/10;
	}
	*lcd_ctrl=address;
	lcd_ctrl_wait();
	for(i=(address==ADD_YEAR?0:2);str[i];i++)
	{
		*lcd_data=str[i];
		lcd_data_wait();
	}
}
void display(){
	if(Second-second){printcell(Second,ADD_SECOND);second=Second;}
	if(Minite-minite){printcell(Minite,ADD_MINITE);minite=Minite;}
	if(Hour-hour){printcell(Hour,ADD_HOUR);hour=Hour;}
	if(Date-date){printcell(Date,ADD_DATE);printweek();date=Date;}
	if(Month-month){printcell(Month,ADD_MONTH);printweek();month=Month;}
	if(Year-year){printcell(Year,ADD_YEAR);printweek();year=Year;}
	
}
unsigned char key2asc(unsigned char in)
{
	unsigned char ka[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};
	unsigned char a;
	for(a=0;a<0x10;a++)
		if(ka[a]==in)break;
	return (a&0x0f);
}
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;
}
void init_key(void)
{
	ppi_ctrl=PPI_1_CT;
	key=PPI_1_PC;
	*ppi_ctrl=0x90;
	*key=0x00;
}
int main(){
	unsigned char in;
	keying=0;
	MCUCR=(1<<SRE);
	init_timer();
	init_text_lcd();
	init_key();
	printmsg("2006-07-01\r00:00:00 00:00");
	printweek();
	DDRB=0x60;
	while(1)
	{
		
		in=key_scan();
		if(in==0)continue;
		delay(1152,750);
		in=key2asc(in);
		keying=1;
		switch(in)
		{
		case 1:
			Year++;
			year=Year;
			printcell(Year,ADD_YEAR);
			printweek();
			break;
		case 2:
			Month++;
			if(Month==13)Month=1;
			month=Month;
			printcell(Month,ADD_MONTH);
			printweek();
			break;
		case 3:
			Date++;
			m[1]=Feb(Year);
			if(Date>m[Month-1])Date=1;
			date=Date;
			printcell(Date,ADD_DATE);
			printweek();
			break;
		case 9:
			Hour=(Hour+49)%24;
			hour=Hour;
			printcell(Hour,ADD_HOUR);
			break;
		case 10:
			Minite=(Minite+121)%60;
			minite=Minite;
			printcell(Minite,ADD_MINITE);
			break;
		case 11:
			Second=(Second+121)%60;
			second=Second;
			printcell(Second,ADD_SECOND);
			break;
		case 5:
			Year--;
			year=Year;
			printcell(Year,ADD_YEAR);
			printweek();
			break;
		case 6:
			Month--;
			if(Month<1)Month=12;
			month=Month;
			printcell(Month,ADD_MONTH);
			printweek();
			break;
		case 7:
			Date--;
			m[1]=Feb(Year);
			if(Date<1)Date=m[Month-1];
			date=Date;
			printcell(Date,ADD_DATE);
			printweek();
			break;
		case 13:
			Hour=(Hour+47)%24;
			hour=Hour;
			printcell(Hour,ADD_HOUR);
			break;
		case 14:
			Minite=(Minite+119)%60;
			minite=Minite;
			printcell(Minite,ADD_MINITE);
			break;
		case 15:
			Second=(Second+119)%60;
			second=Second;
			printcell(Second,ADD_SECOND);
			break;
		case 0:
			AltHour=(AltHour+49)%24;
			printcell(AltHour,ADD_ALTHOUR);
			break;
		case 8:
			AltMinite=(AltMinite+121)%60;
			printcell(AltMinite,ADD_ALTMINITE);
			break;
		case 4:
			AltHour=(AltHour+47)%24;
			printcell(AltHour,ADD_ALTHOUR);
			break;
		case 12:
			AltMinite=(AltMinite+119)%60;
			printcell(AltMinite,ADD_ALTMINITE);
			break;
		}
		m[1]=Feb(Year);
		if(Date>m[Month-1])
		{
			Date=1;
			date=1;
			printcell(Date,ADD_DATE);
			printweek();
		}
		keying=0;
	}
}
void printweek()
{
	unsigned char week[7][7]={"Sun. ","Mon. ","Tues.","Wed. ","Thur.","Fri. ","Sat. "};
	int i,d;
	d=Year+(Year-1)/4-(Year-1)/100+(Year-1)/400-1;
	for(i=0;i<Month-1;i++)
		d+=m[i];
	d+=Date;
	d=d%7;
	*lcd_ctrl=ADD_WEEK;
	lcd_ctrl_wait();
	for(i=0;week[d][i];i++)
	{
		*lcd_data=week[d][i];
		lcd_data_wait();
	}
}
int bell()
{
	if(Hour==AltHour&&Minite==AltMinite&&Second%2)return 0x0;
	return 0xff;
}

⌨️ 快捷键说明

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