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

📄 wnl.c

📁 自己写的一个万年历程序,能有200多行代码.尽供参考.
💻 C
字号:
#include <p18f1220.h>
#include <delays.h>
#include <string.h>

#define CS PORTAbits.RA1
#define STD PORTAbits.RA2
#define SCLK PORTAbits.RA3
#define RST PORTAbits.RA4
#define LEDA PORTBbits.RB5

#define DATA 1
#define COMM 0

//CS连接RA1,STD连接RA2,SCLK连接RA3,RST连接RA4,LEDA连接RB5固定连接

struct date_time
{
	unsigned char	year;
	unsigned char	month;
	unsigned char	day;
	unsigned char	hour;
	unsigned char	minute;
	unsigned char	second;
};

struct date_time nowtime = {7,7,30,23,59,57};
static 	char s3[16];
		char s2[16];

void init_lcd(void);
void wr_LCD(unsigned char rs, unsigned char data);
void addsecond(void);
void inti_time(void);
void write_time(void);

unsigned int leep(unsigned int);
unsigned int daysofmonth(unsigned int, unsigned int);
void addsecond(void);
void write_time(void);


void init_lcd()//初始化
{
	ADCON1 |= 0x0E;//数字
	TRISA &= 0xE1;//输出
	TRISBbits.TRISB5 = 0;//设置RB5位为输出位
	CS = 0;
	STD = 0;
	SCLK = 0;
	RST = 0;
	LEDA = 0;
	Delay10KTCYx(6);
	RST = 1;
	Delay10KTCYx(10);
	LEDA = 1;

	wr_LCD(COMM, 0X30);
	wr_LCD(COMM, 0X01);
	Delay10KTCYx(25);
	wr_LCD(COMM, 0X06);
	wr_LCD(COMM, 0X0C);
}

void wr_LCD(unsigned char rs, unsigned char data)
{
	
	int i;
	CS = 1;
	
	STD = 1;
	for(i = 0; i < 5; i++)//前五位固定
		{
			SCLK = 1;
			SCLK = 0;
		}
	
	STD = 0;//6位 置0写数据 置1读数据
	SCLK = 1;
	SCLK = 0;
	
	STD = rs;//7位 置1数据模式 0命令模式
	SCLK = 1;
	SCLK = 0;
	
	STD = 0;//8位置0 固定
	SCLK = 1;
	SCLK = 0;
		
	for(i = 7; i >= 4; i--)//9、10、11、12、位数据
		{
			STD = data >> i;
			SCLK = 1;
			SCLK = 0;
		}
	STD = 0;
	for(i = 0; i < 4; i++)//固定
		{
			SCLK = 1;
			SCLK = 0;
		}
	
	for(i = 3; i >= 0; i--)//17、18、19、20位数据
		{
			STD = data >> i;
			SCLK = 1;
			SCLK = 0;
		}
	STD = 0;
	for(i = 0; i < 4; i++)//固定
		{
			SCLK = 1;
			SCLK = 0;
		}

	CS = 0;
}

void inti_time()
{
	INTCON = 0;	//关闭所有中断
	RCONbits.IPEN = 1;	//使能中断优先级
	INTCON = 0xB0;
	INTCON2 = 0x04;	
	T0CON = 0X82;
	INTCONbits.GIEH = 1;
}

#pragma interrupt InterruptHandlerHigh
#pragma code InterruptVectorHigh = 0X08
void InterruptVectorHigh(void){
	_asm
		goto InterruptHandlerHigh
	_endasm
}

#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh(){
	if(INTCONbits.TMR0IF == 1)
	{
		INTCONbits.TMR0IF = 0;
		addsecond();
		write_time();
		TMR0H = 0X8B;
		TMR0L = 0XDC;
	}
}

unsigned int leap(unsigned int year)
{
	return !(year%400)||(!(year%4)&&(year%100));
}

unsigned int daysofmonth(unsigned int year,unsigned int month)
{
	switch(month)
	{	
		case 2: 
			return 28 + leap(year);
		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
	}
		return 31;
}

void addsecond(void)
{	
	nowtime.second ++;
	if(nowtime.second < 60) return;
	nowtime.second = 0;
	nowtime.minute ++;
	if(nowtime.minute < 60) return;
	nowtime.minute = 0;
	nowtime.hour ++;
	if(nowtime.hour < 24) return;
	nowtime.hour = 0;
	nowtime.day ++;
	if(nowtime.day < daysofmonth(nowtime.year,nowtime.month)) return;
	nowtime.day = 1;
	nowtime.month ++;
	if(nowtime.month <= 12) return;
	nowtime.month = 1;
	nowtime.year ++;
}

void write_time()
{
		int i, j;
	

		s3[0] = 50;
		s3[1] = nowtime.year / 100 + '0';
		s3[2] = nowtime.year / 10 % 10 + '0';
		s3[3] = nowtime.year % 10 + '0';
		s3[4] = '/';
		s3[5] = nowtime.month / 10 + '0';
		s3[6] = nowtime.month % 10 + '0';
		s3[7] = '/';
		s3[8] = nowtime.day / 10 + '0';
		s3[9] = nowtime.day % 10 + '0';
	
	
		s2[0] = nowtime.hour / 10 + '0';
		s2[1] = nowtime.hour % 10 + '0';
		s2[2] = ':';
		s2[3] = nowtime.minute / 10 + '0';
		s2[4] = nowtime.minute % 10 + '0';
		s2[5] = ':';
		s2[6] = nowtime.second / 10 + '0';
		s2[7] = nowtime.second % 10 + '0';
		
		wr_LCD(COMM, 0x90);
			for(i = 0; i < 10; i++)
			{
				wr_LCD(DATA, s3[i]);
			}
		wr_LCD(COMM, 0x88);
			for(i = 0; i < 8; i++)
			{
				wr_LCD(DATA, s2[i]);
			}
}

void main()
{
	
	inti_time();
	init_lcd();
	while(1);
}

⌨️ 快捷键说明

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