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

📄 digit_timer_use_128064.c

📁 用液晶12864做的时钟
💻 C
字号:
#include <regx51.h>
#define TIMER0_COUNT 0xDC11//10000H-((11.059.200(12*FREQ))-17
/*绘图型LCD指令*/
#define GLCD_OFF				62
#define GLCD_ON					63
#define GLCD_START_LINE_0		192
#define SET_PAGE				184
#define	SET_Y_ADDRESS_0			64
#define CLEAR					0
/*绘图型LCD控制线*/
#define	ENABLE					1
#define	DISABLE					0
#define READ					1
#define WRITE					0
#define COMMAND					0
#define DATA					1
#define GLCD_RESET				P2
#define GLCD_R_W				P2_6
#define	GLCD_ENABLE				P2_7
//_2
#define GLCD_CS2				P2_3
#define GLCD_CS1				P2_4
#define GLCD_D_I				P2_5
#define mode_button				P2_0
#define up_button               P2_1

typedef struct
{
	char hour;
	char minute;
	char second;
}time;

typedef struct
{
	char year;
	char month;
	char day;
}date;

time now={23,59,0},display;
date today={5,9,1},tmpday;
unsigned char gx,gy,mode;
static unsigned timer0_tick;
char code int2char[]="0123456789";
char code dayofmonth[]={31,28,31,3,31,30,31,31,30,31,30,31};

unsigned char code digit[10][4][8]=
//0
{{
{0X00,0X00,0X00,0XFC,0XFE,0X03,0X01,0X81},
{0XC1,0X61,0X31,0X1B,0XFE,0XFC,0X00,0X00},
{0X00,0X00,0X00,0X0F,0X1F,0X36,0X23,0X21},
{0X20,0X20,0X20,0X30,0X1F,0X0F,0X00,0X00}},
//1
{
{0X00,0X00,0X00,0X00,0X00,0X04,0X06,0XFF},
{0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X20,0X20,0X20,0X3F},
{0X3F,0X20,0X20,0X20,0X00,0X00,0X00,0X00}},
//2
{
{0X00,0X00,0X00,0X1C,0X1E,0X03,0X01,0X81},
{0XC1,0X41,0X61,0X33,0X3E,0X1C,0X00,0X00},
{0X00,0X00,0X00,0X3C,0X3E,0X33,0X31,0X31},
{0X30,0X30,0X30,0X30,0X30,0X3C,0X00,0X00}},
//3
{
{0X00,0X00,0X00,0X0C,0X0E,0X02,0X01,0X41},
{0X41,0XE1,0XE1,0XB2,0X1E,0X0C,0X00,0X00},
{0X00,0X00,0X00,0X0C,0X1C,0X10,0X20,0X20},
{0X20,0X20,0X20,0X11,0X1F,0X0E,0X00,0X00}},
//4
{
{0X00,0X00,0X80,0XC0,0X60,0X30,0X18,0X0C},
{0X06,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00},
{0X00,0X07,0X07,0X04,0X04,0X04,0X04,0X24},
{0X24,0X3F,0X3F,0X24,0X24,0X04,0X00,0X00}},
//5
{
{0X00,0X00,0X00,0XFF,0XFF,0X43,0X23,0X23},
{0X23,0X23,0X23,0X43,0XC3,0X80,0X00,0X00},
{0X00,0X00,0X00,0X0C,0X1C,0X10,0X20,0X20},
{0X20,0X20,0X20,0X10,0X1F,0X0F,0X00,0X00},},
//6
{
{0X00,0X00,0X00,0XFC,0XFE,0X82,0X41,0X41},
{0X41,0X41,0X41,0XC7,0X86,0X00,0X00,0X00},
{0X00,0X00,0X00,0X0F,0X1F,0X30,0X20,0X20},
{0X20,0X20,0X20,0X10,0X1F,0X0F,0X00,0X00}},
//7
{
{0X00,0X00,0X00,0X0F,0X03,0X03,0X03,0X03},
{0X83,0XC3,0X63,0X33,0X1F,0X0F,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F},
{0X3F,0X00,0X00,0X00,0X00,0X00,0X00,0X00}},
//8
{
{0X00,0X00,0X00,0X1C,0XBE,0XE2,0X41,0X41},
{0X41,0X41,0XE2,0XBE,0X1C,0X00,0X00,0X00},
{0X00,0X00,0X0E,0X1F,0X11,0X20,0X20,0X20},
{0X20,0X20,0X20,0X11,0X1F,0X0E,0X00,0X00}},
//9
{
{0X00,0X00,0X00,0X7C,0XFE,0X82,0X01,0X01},
{0X01,0X01,0X82,0XC6,0XFC,0XF8,0X00,0X00},
{0X00,0X00,0X00,0X0C,0X1C,0X18,0X21,0X21},
{0X21,0X21,0X10,0X1C,0X0F,0X03,0X00,0X00}}};
unsigned char code slash[4][8]=
///
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X38},
{0X38,0X10,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X07},
{0X07,0X02,0X00,0X00,0X00,0X00,0X00,0X00}};
//:
unsigned char code comma[4][8]=
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X38},
{0X38,0X10,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X07},
{0X07,0X02,0X00,0X00,0X00,0X00,0X00,0X00}};	

unsigned char code space[4][8]=
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00}};
unsigned char code token[7][4][8]=
{
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00}},
//现
{
{0X42,0X42,0XFE,0X43,0X42,0X00,0X00,0XFE},
{0X49,0X49,0X49,0X49,0XFF,0X00,0X00,0X00},
{0X08,0X18,0X0F,0X04,0X22,0X20,0X20,0X13},
{0X0E,0X01,0X01,0X3E,0X23,0X20,0X30,0X00}},
//在
{
{0X02,0X02,0X02,0X84,0X64,0X1C,0X87,0X84},
{0X84,0XF4,0X84,0X84,0XC4,0X86,0X04,0X00},
{0X04,0X02,0X01,0X3F,0X00,0X10,0X10,0X10},
{0X10,0X1F,0X10,0X10,0X10,0X18,0X10,0X00}},
//时
{
{0XFC,0X44,0X44,0XFC,0X80,0X92,0X92,0X52},
{0X52,0X5F,0X52,0XF2,0X9A,0XD2,0X80,0X00},
{0X0F,0X04,0X04,0X0F,0X00,0X00,0X02,0X04},
{0X80,0X00,0X40,0X1F,0X00,0X00,0X00,0X00}},
//间
{
{0X00,0XFF,0X15,0X15,0X15,0X95,0X9F,0X10},
{0X10,0X9F,0X95,0X15,0X15,0X15,0XFF,0X00},
{0X00,0X3F,0X00,0X00,0X00,0X0F,0X0A,0X0A},
{0X0A,0X0A,0X0F,0X00,0X20,0X20,0X1F,0X00}},
//是
{
{0X40,0X40,0X40,0X5F,0X55,0X55,0X55,0XD5},
{0X55,0X55,0X55,0X5F,0X40,0X60,0X40,0X00},
{0X20,0X10,0X08,0X07,0X08,0X10,0X20,0X3F},
{0X22,0X22,0X22,0X23,0X22,0X20,0X20,0X00}},
//:
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X38},
{0X38,0X10,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X07},
{0X07,0X02,0X00,0X00,0X00,0X00,0X00,0X00}}};


void check_GLCD_busyflag(void)
{
	unsigned char x;
	GLCD_R_W=READ;
	GLCD_D_I=COMMAND;
	GLCD_ENABLE=ENABLE;
	P0=255;
	do
	{
		x=P0&&128;
	}while(x);
	GLCD_ENABLE=DISABLE;
	GLCD_D_I=1;
	GLCD_R_W=1;
}

/**************************写入命令***************************/
void write_GLCD_command(unsigned command)				  
{
	GLCD_R_W=WRITE;		 //P2_6=0
	GLCD_D_I=COMMAND;	 //P_5=0
	GLCD_ENABLE=ENABLE;	 //P2_7=1
	P0=command;			 //从P0送出command
	GLCD_ENABLE=DISABLE; //P2_7=0
	GLCD_D_I=1;			 //P2_5=1
	GLCD_R_W=1;			 //P2_6=1
	//检查忙碌标志,直到绘图型LCD不忙碌时就返回
	check_GLCD_busyflag();
}

/************************写入数据*****************************/
void write_GLCD_data(unsigned GLCDdata)					 
{
	GLCD_R_W=WRITE;		 //P2_6=0
	GLCD_D_I=DATA;		 //P2_5=1
	GLCD_ENABLE=ENABLE;	 //P2_7=1
	P0=GLCDdata;		 //从P0送出数据
	GLCD_ENABLE=DISABLE; //P2_7=0
	GLCD_D_I=0;			 //P2_5=0
	GLCD_R_W=1;			 //P2_6=1
	check_GLCD_busyflag();
}

/************************清除屏幕***************************/
void clear_GLCD()										 
{
	int i,j;
	GLCD_RESET=0;
	for(i=0;i<2;i++);
	GLCD_RESET=1;
	GLCD_CS1=1;
	GLCD_CS2=1;
	write_GLCD_command(GLCD_ON);
	write_GLCD_command(GLCD_START_LINE_0);
	for(i=0;i<8;i++)
	{
		write_GLCD_command(SET_PAGE+i);
		write_GLCD_command(SET_Y_ADDRESS_0);
		for(j=0;j<64;j++)
			write_GLCD_data(0);
	}
}

/**************************显示一个圆形********************/
void show_pattern(unsigned char page,unsigned char y,unsigned char *pattern,unsigned char len)
{
	int i;
	write_GLCD_command(SET_PAGE+page);
	write_GLCD_command(SET_Y_ADDRESS_0+y);
	for(i=0;i<len;i++)
	{
		write_GLCD_data(*pattern);
		pattern++;
	}
}


/*******************************显示一个字********************************/
void display_GLCD_data(unsigned char *p)			
{
	if(gx<64)
	{
		GLCD_CS1=1;
		GLCD_CS2=0;
		show_pattern(gy,gx,p,8);
		show_pattern(gy,gx+8,p+8,8);
		show_pattern(gy+1,gx,p+16,8);
		show_pattern(gy+1,gx+8,p+24,8);
	}
	else
	{
		GLCD_CS1=0;
		GLCD_CS2=1;
		show_pattern(gy,gx-64,p,8);
		show_pattern(gy,gx-58,p+8,8);
		show_pattern(gy+1,gx-64,p+16,8);
		show_pattern(gy+1,gx-58,p+24,8);
	}
	gx=gx+16;
}

/******************************显示一个字符串*****************************/
void display_GLCD_string(unsigned char *p,int len)		
{
	int i;
	for(i=0;i<len;i++)
		display_GLCD_data((p+32*i));
}

/******************************显示一个数字(0~99)************************/
void display_GLCD_number(char number)				   
{
	int x,y;
	x=number/10;
	y=number%10;
	display_GLCD_data(digit[x]);
	display_GLCD_data(digit[y]);
}

/******************************指定光标位置*****************************/
void gotoxy(unsigned char x,unsigned y)				   
{
	gy=y;
	gx=x;
}

void display_time(time display_time)
{
	gotoxy(0,2);
	display_GLCD_number(display_time.hour);
	display_GLCD_data(comma);
	display_GLCD_number(display_time.minute);
	display_GLCD_data(comma);
	display_GLCD_number(display_time.second);
}

void display_date(date tmp_date)
{
	gotoxy(0,4);
	display_GLCD_number(tmp_date.year);
	display_GLCD_data(slash);
	display_GLCD_number(tmp_date.month);
	display_GLCD_data(slash);
	display_GLCD_number(tmp_date.day);
}

char monthday(char year,char month)
{	
	if(month==2&&year%4==0)
		return(29);
	else
		return(dayofmonth[month-1]);
}

static void timer0_isr(void) interrupt  1 using 1
{
	TR0=0;
	TL0=(TIMER0_COUNT&0x00FF);
	TH0=(TIMER0_COUNT>>8);
	TR0=1;
	timer0_tick++;
	if(timer0_tick==100)
	{
		timer0_tick=0;
		now.second++;
		if(now.second==60)
		{
			now.second=0;
			now.minute++;
			if(now.minute==60)
			{
				now.minute=0;
				now.hour++;
				if(now.hour==24)
				{
					now.hour=0;
					today.day++;
					if(today.day>monthday(today.year,today.month))
					{
						today.day=0;
						today.month++;
						if(today.month==13)
						{
							today.month=1;
							today.year++;
						}
					}
					if(mode!=0)return;
					display_date(today);
				}
			}

		}
		if(mode!=0)return;
		display_time(now);
	}
	
}


static void timer0_initialize(void)
{
	EA=0;
	timer0_tick=0;
	TR0=0;
	TMOD&=0xF0;
	TMOD|=0x01;
	TL0=(TIMER0_COUNT&0x00FF);
	TH0=(TIMER0_COUNT>>8);
	PT0=0;
	ET0=1;
	TR0=1;
	EA=1;
}

 //时间延时
void delay(void)
{
	unsigned char i,j;
	for(i=0;i<255;i++)
		for(j=0;j<255;j++)
		;
}

char gotkey()
{
	if(mode_button==0)
	{
		delay();
		if(mode_button==0)return(0);
	}
	if(up_button==0)
	{
		delay();
		if(up_button==0)return(1);
	}
	return(15);
}

void main(void)
{
	unsigned char keys,i=0;
	clear_GLCD();
	gotoxy(0,0);
	display_GLCD_string(token,7);
	display_time(now);
	display_date(today);
	timer0_initialize();
	mode=0;
	do
	{
		switch(keys)
		{
			case 0:
					mode++;
					if(mode==6)
					{
						mode=0;
						now=display;
						today=tmpday;
						break;
					}
					if(mode==1)
					{
						display=now;
						tmpday=today;
						break;
					}
					break;
			case 1:
					if(mode==0)break;
					switch(mode)
					{
						case 1:
								display.hour++;
								if(display.hour<=24)display.hour=0;
								display_time(display);
								break;
						case 2:
								display.minute++;
								if(display.minute>=60)display.minute=0;
								display_time(display);
								break;
						case 3:
								tmpday.year++;
								if(tmpday.year<=100)tmpday.year=0;
								display_date(tmpday);
								break;
						case 4:
								tmpday.month++;
								if(tmpday.month>12)tmpday.month=1;
								display_date(tmpday);
								break;
						case 5:
								tmpday.day++;
								if(tmpday.day>monthday(tmpday.year,tmpday.month))
								tmpday.day=1;
								display_date(tmpday);
								break;
					}
					break;
		}
	}while(1);
}




⌨️ 快捷键说明

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