万年历程序加入农历c语言,大神们日历程序里面怎么加农历(附程序)

时钟的时钟线引脚*/

sbit T_IO=P2^1; /* 实时时钟的数据线*/

sbit T_RST=P2^2; /* 实时时钟的复位线引脚*/

uchar bdata datbyte;

sbit datbyte0=datbyte^0;

sbit datbyte7=datbyte^7;

/*----------键盘相关声明-------------------------------------*/

sbit key=P1^0; //功能键

sbit key1=P1^1; //只有加1键

sbit key2=P1^2;

uchar sum,keyflag=0; //调用时,分,秒,标志,调用键盘处理标志.

/*--------------以下为LCD12864相关函数--------------------------*/

/**************************************************************

函数名称:void delay1ms(uint x)

函数功能: 延时1MS

***************************************************************/

void delay1ms(uint x)

{

uint i,j;

for(i=0;i

for(j=0;j<120;j++);

}

/**************************************************************

函数名称:void w_12864byte(uchar byte)

函数功能: 写字节

**************************************************************/

void w_12864byte(uchar byte)

{

uchar i;

for(i=0;i<8;i++)

{

sck=0;

byte<<=1;

sid=CY;

sck=1;

}

}

/**************************************************************

函数名称:uchar r_12864byte(void)

函数功能: 读字节

***************************************************************/

uchar r_12864byte(void)

{

uchar i,temp1,temp2;

temp1 = 0;

temp2 = 0;

for(i=0;i<8;i++)

{

temp1=temp1<<1;

sck = 0;

sck = 1;

sck = 0;

if(sid) temp1++;

}

for(i=0;i<8;i++)

{

temp2=temp2<<1;

sck = 0;

sck = 1;

sck = 0;

if(sid) temp2++;

}

return ((0xf0&temp1)+(0x0f&temp2));

}

/**************************************************************

函数名称:void c_12864busy( void )

函数功能: 检测忙函数

**************************************************************/

void c_12864busy( void )

{

do

w_12864byte(0xfc); //11111,RW(1),RS(0),0

while(0x80&r_12864byte());

}

/**************************************************************

函数名称:void w_12864(bit dat_com,uchar byt)

函数功能: 写入函数

***************************************************************/

void w_12864(bit dat_com,uchar byt)

{

uchar temp;

if(dat_com==0) //为零,写入指令

temp=0xf8; //11111,RS(0),RW(0),0

else //否则,写入数据

temp=0xfa; //11111,RS(1),RW(0),0

cs=1;

c_12864busy();

w_12864byte(temp);

w_12864byte(byt&0xf0); //写入高四位

w_12864byte(byt<<4); //写入低四位

cs=0;

}

/**************************************************************

函数名称:void init_12864(void)

函数功能:初始化12864

***************************************************************/

void init_12864(void)

{

w_12864(com,0x30); //基本指令功能.

w_12864(com,0x0c); //显示打开,关光标,反白关.

w_12864(com,0x01); //清屏指令.

w_12864(com,0x06); //AC自动加一

}

/*----------------以下为DS1302相关函数-------------------------*/

/**************************************************************

函数名称:void w_1302byte(uchar date)

函数功能:写一个字节(上升沿)

***************************************************************/

void w_1302byte(uchar date)

{ uchar i;

datbyte=date;

for(i=0;i<8;i++)

{ T_IO=datbyte0; //写最低位

T_CLK=0;

T_CLK=1;

datbyte>>=1;

}

}

/**************************************************************

函数名称:uchar r_1302byte(void)

函数功能:读一个字节(下降沿)

***************************************************************/

uchar r_1302byte(void)

{ uchar i;

datbyte=0;

for(i=0;i<8;i++)

{ datbyte7=T_IO; //读最低位

T_CLK=1;

T_CLK=0;

datbyte>>=1;

}

return(datbyte);

}

/***************************************************************

函数名称:void write_1302(uchar addr,uchar date)

函数功能: 指定位置写数据

****************************************************************/

void write_1302(uchar addr,uchar date)

{ T_RST=0;

T_CLK=0;

T_RST=1;

w_1302byte(addr);

w_1302byte(date);

T_CLK=0;

T_RST=0;

}

/**************************************************************

函数名称:uchar read_1302(uchar addr)

函数功能: 指定位置读数据

****************************************************************/

uchar read_1302(uchar addr)

{ uchar dat1,dat2,temp;

T_RST=0;

T_CLK=0;

T_RST=1;

w_1302byte(addr);

temp=r_1302byte();

T_RST=0;

T_CLK=0;

dat1=temp/16;

dat2=temp%16;

temp=dat1*10+dat2;

return(temp);

}

/***************************************************************

函数名称:void init_1302(void)

函数功能: 初始化

*****************************************************************/

void init_1302(void)

{ uchar i;

uchar addr=0x80;

write_1302(0x8e,0x00);

for(i=0;i<7;i++)

{

write_1302(addr,TAB_1302);

addr+=2;

}

write_1302(0x8e,0x80);

}

/****************************************************************

函数名称:void get_1302(void)

功能说明:读取DS1302时钟信息.

*****************************************************************/

void get_1302(void)

{ uchar i,addr=0x81;

for(i=0;i<7;i++)

{ TAB_1302=read_1302(addr);

addr+=2;

}

}

/*---------------以下为显示相关函数--------------------------*/

/******************************

函数名称: void fenli(uchar x,uchar y,uchar val)

功能描述: 指定位置写入数据

********************************/

void fenli(uchar x,uchar y,uchar val)

{ uchar ge,shi,addr,i=0;

if(val==5)//这里把星期数字显示的转换为中文

{

w_12864(com,0x88+2);

for(i=0;i<2;i++)

{ //一个汉字写两次

if(TAB_1302[5]==0)w_12864(dat,TAB_XQ);

if(TAB_1302[5]==1)w_12864(dat,TAB_XQ[2+i]); //

if(TAB_1302[5]==2)w_12864(dat,TAB_XQ[3+i]); //!!??星期三显示没规律,不知咋回事.

if(TAB_1302[5]==3)w_12864(dat,TAB_XQ[5+i]);

if(TAB_1302[5]==4)w_12864(dat,TAB_XQ[7+i]);

if(TAB_1302[5]==5)w_12864(dat,TAB_XQ[9+i]);

if(TAB_1302[5]==6)w_12864(dat,TAB_XQ[11+i]);

}

}

else

{

shi=TAB_1302[val]/10;//分离十位

ge=TAB_1302[val]%10;

if(x==1)x=0x80;

if(x==2)x=0x90;

if(x==3)x=0x88;

if(x==4)x=0x98;

addr=x+y;

w_12864(com,addr);//指定位置

w_12864(dat,0x30+shi);//写入

w_12864(dat,0x30+ge);

}

}

/*************************************************************

函数名称:void display(void)

功能描述: 显示函数

**************************************************************/

void display(void)

{ get_1302(); //读1302

fenli(3,7,0); //读秒

fenli(3,5,1); //读分

fenli(3,3,2); //读时

fenli(2,5,3); //读日

fenli(2,3,4); //读月

fenli(3,2,5); //读星期

fenli(2,1,6); //读年

}

/*---------------按键处理相关函数--------------------------*/

/************************************************************

函数名称:void scanner()

功能描述: 按键函数

*************************************************************/

void scanner()

{ uchar i,j;

if(!key) //功能键按下

{ delay1ms(500); //延时500MS

if(!key) //还按下,退出时间调整

{ keyflag=0; //标志位为0

sum=0; //清0

w_12864(com,0x0c);//清闪烁

for(i=0;i<7;i++)//十进制转十六进制

{ j=TAB_1302/10;

TAB_1302=TAB_1302%10;

TAB_1302=TAB_1302+16*j;

}

init_1302(); //写入1302

while(!key); //等待释放

delay1ms(10); //延时消抖

}

else //500MS内放开

{ keyflag=1; //标志为1,进行时间调整

sum++; //功能键加1

if(sum==8)

sum=0;

switch(sum)

{ case 1: //

{ w_12864(com,0x98+7);

w_12864(com,0x0f);

break;

}

case 2: //为2,年闪烁

w_12864(com,0x90+1);

break;

case 3: //月闪烁

w_12864(com,0x90+3);

break;

case 4: //日闪烁

w_12864(com,0x90+5);

break;

case 5: //分闪烁

w_12864(com,0x88+5);

break;

case 6: //时闪烁

w_12864(com,0x88+3);

break;

}

}

}

if(sum) //功能键按下

{

if(!key1)

{ delay1ms(10);

if(!key1)

{ while(!key1);//等待加1键释放

delay1ms(10);

if(sum==1)

{ //备用

}

if(sum==2)

{ TAB_1302[6]++;

if(TAB_1302[6]==100)

TAB_1302[6]=0;

fenli(2,1,6);

w_12864(com,0x90+1);//闪烁归位

}

if(sum==3)

{ TAB_1302[4]++;

if(TAB_1302[4]==13)

TAB_1302[4]=1;

fenli(2,3,4);

w_12864(com,0x90+3);

}

if(sum==4)

{ TAB_1302[3]++;

if(TAB_1302[3]==32)

TAB_1302[3]=1;

fenli(2,5,3);

w_12864(com,0x90+5);

}

if(sum==5)

{ TAB_1302[1]++;

if(TAB_1302[1]==60)

TAB_1302[1]=0;

fenli(3,5,1);

w_12864(com,0x88+5);

}

if(sum==6)

{ TAB_1302[2]++;

if(TAB_1302[2]==24)

TAB_1302[2]=0;

fenli(3,3,2);

w_12864(com,0x88+3);

}

}

}

if(sum) //功能键按下

{

if(!key2)

{ delay1ms(10);

if(!key2)

{ while(!key2);//等待加1键释放

delay1ms(10);

if(sum==1)

{

}

if(sum==2)

{ TAB_1302[6]--;

if(TAB_1302[6]==0)

TAB_1302[6]=100;

fenli(2,1,6);

w_12864(com,0x90+1);//闪烁归位

}

if(sum==3)

{ TAB_1302[4]--;

if(TAB_1302[4]==0)

TAB_1302[4]=12;

fenli(2,3,4);

w_12864(com,0x90+3);

}

if(sum==4)

{ TAB_1302[3]--;

if(TAB_1302[3]==0)

TAB_1302[3]=31;

fenli(2,5,3);

w_12864(com,0x90+5);

}

if(sum==5)

{ TAB_1302[1]--;

if(TAB_1302[1]==0)

TAB_1302[1]=60;

fenli(3,5,1);

w_12864(com,0x88+5);

}

if(sum==6)

{ TAB_1302[2]--;

if(TAB_1302[2]==0)

TAB_1302[2]=24;

fenli(3,3,2);

w_12864(com,0x88+3);

}

}

}

}

}

}

//=============================================================

void init(void)

{

uchar i;

init_12864();

init_1302();

while(TAB1!='\0')

{

w_12864(dat,TAB1);

i++;

}

i=0;

w_12864(com,0x90);

while(TAB2!='\0')

{

w_12864(dat,TAB2);

i++;

}

i=0;

w_12864(com,0x88);

while(TAB3!='\0')

{

w_12864(dat,TAB3);

i++;

}

i=0;

w_12864(com,0x98);

}

/*************************************************************

函数名称:主函数

函数功能:

**************************************************************/

main()

{

init();

while(1)

{

scanner(); //检测键盘

if(!keyflag) //标志为0

{ display(); //调用显示

delay1ms(500);

}

}

}

699ba7046c51816a17b33a7caa85f179.png

0

befd55929eb5666354dfa35bc455f0d6.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个带有农历万年历功能的 C 语言程序代码示例: ```c #include <stdio.h> #include <stdlib.h> int get_weekday(int year, int month, int day) { if (month == 1 || month == 2) { month += 12; year--; } int c = year / 100; year %= 100; int week = year + year / 4 + c / 4 - 2 * c + 13 * (month + 1) / 5 + day - 1; week = (week % 7 + 7) % 7; return week; } int is_leap_year(int year) { return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; } int get_month_days(int year, int month) { int days[] = {31, 28 + is_leap_year(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } void print_calendar(int year, int month) { printf(" %d %d 月\n", year, month); printf("日 一 二 三 四 五 六\n"); int weekday = get_weekday(year, month, 1); for (int i = 0; i < weekday; i++) { printf(" "); } int month_days = get_month_days(year, month); for (int i = 1; i <= month_days; i++) { printf("%2d ", i); if ((i + weekday) % 7 == 0) { printf("\n"); } } if ((month_days + weekday) % 7 != 0) { printf("\n"); } } void print_lunar_calendar(int year, int month, int day) { char *lunar_year[] = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十" }; char *lunar_month[] = { "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊" }; char *lunar_day[] = { "初", "十", "廿", "三十" }; int lunar_month_days[] = { 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 29 }; int lunar_year_days = 0; for (int i = 1901; i < year; i++) { lunar_year_days += is_leap_year(i) ? 366 : 365; } for (int i = 1; i < month; i++) { lunar_year_days += lunar_month_days[i - 1]; } lunar_year_days += day - 1; int lunar_year_months[] = {0, 12}; int lunar_year_days_sum[] = {0, 383}; int lunar_month_days_sum = 0; for (int i = 0; i < 12; i++) { lunar_month_days_sum += lunar_month_days[i]; if (lunar_year_days_sum[0] + lunar_month_days_sum <= lunar_year_days) { lunar_year_months[0]++; lunar_year_days_sum[0] += lunar_month_days_sum; } if (lunar_year_days_sum[1] + lunar_month_days_sum <= lunar_year_days) { lunar_year_months[1]++; lunar_year_days_sum[1] += lunar_month_days_sum; } } int lunar_month = lunar_year_months[1] == 12 ? 1 : lunar_year_months[1] + 1; int lunar_day = lunar_year_days - lunar_year_days_sum[1] + 1; printf("农历:%s%s%s月%s%s\n", lunar_year[year / 1000], lunar_year[year % 1000 / 100], lunar_month[lunar_month], lunar_day[lunar_day / 10], lunar_day[lunar_day % 10]); } int main() { int year, month, day; printf("请输入份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); printf("请输入日期:"); scanf("%d", &day); print_calendar(year, month); print_lunar_calendar(year, month, day); return 0; } ``` 这个程序可以通过输入份、月份和日期来打印出对应的公历农历日历。其中,`get_weekday()` 函数用于计算某一天是星期几,`is_leap_year()` 函数用于判断某一是否为闰,`get_month_days()` 函数用于获取某一某一月的天数,`print_calendar()` 函数用于打印公历日历,`print_lunar_calendar()` 函数用于打印农历日历

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值