十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
PIC16F877A LCD1602液晶式万年历
成都创新互联长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为新民企业提供专业的成都网站设计、成都网站制作、外贸网站建设,新民网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
默认分类 2011-03-23 23:27:51 阅读10 评论0 字号:大中小 订阅
#includepic.h#define uchar unsigned char#define uint unsigned int#define RS RA1#define RW RA2#define E RA3#define s1 RB1#define s2 RB2#define s3 RB3 __CONFIG(0x1832);int Hours=0;//定义小时int Minutes=0;//定义分钟int Seconds=0;//定义秒int Day=20;int Months=03;int Years=2011;const char Table[]="0123456789"; ////1602:0-9 数字uint Y[16]; //8字节的显示缓冲区uchar set_2=0;int incone(int n);int decone(int m);void delay(uint x)///延时 { uint a,b; for(a=x;a0;a--) for(b=30;b0;b--); }
void interrupt time0 (){uchar temp,intnum; T0IF=0; TMR0=63; intnum++; if(intnum==40) { intnum=0; Seconds++; if(Seconds==60) { Seconds=0; Minutes++; if(Minutes==60) { Minutes=0; Hours++; if(Hours==24) { Hours=0; Day++; if(Day==31) { Day=0; Months++; if(Months==12) { Months=0; Years++; } } } } } } }
void write_Directive(uchar a)//写指令{RS=0;RW=0;delay(1);E=0;PORTD=a;delay(1);E=1;delay(1);E=0;delay(1);}
void write_Data(uchar a)//写数据{RS=1;RW=0;delay(1);E=0;PORTD=a;delay(1);E=1;delay(1);E=0;delay(1);
}void init()//初始化{ ADCON1=0X07; PORTB=0xFF; TRISB=0XFF; PORTC=0x00; TRISC=0X00; TRISD=0; TRISA=0; OPTION=0X06; TMR0=63; INTCON=0XA0;Y[14]=':';delay(15);write_Directive(0x38);delay(5);write_Directive(0x38);delay(5);write_Directive(0x38);write_Directive(0x01);write_Directive(0x02);//初始化后数据地址为0x80;即第一行,第一个位置write_Directive(0x0c);//不显示光标}
void write_Data_String()//显示时间函数{ Y[0]=Hours/10;//转换成10进制显示Y[1]=Hours%10;Y[2]=Minutes/10;Y[3]=Minutes%10;Y[4]=Seconds/10;Y[5]=Seconds%10;Y[6]=Years/1000;Y[7]=Years/100%10;Y[8]=Years/10%10;Y[9]=Years%10;//Y[6]=Years/1000;//Y[7]=Years%1000/100;//DispBuf[8]=Years%100/10;//DispBuf[9]=Years%10;Y[10]=Months/10;Y[11]=Months%10;Y[12]=Day/10;Y[13]=Day%10;Y[14]=':';Y[15]='.';Y[0]=Table[Y[0]];//查表取字符Y[1]=Table[Y[1]];Y[2]=Table[Y[2]];Y[3]=Table[Y[3]];Y[4]=Table[Y[4]];Y[5]=Table[Y[5]];Y[6]=Table[Y[6]];//查表取字符Y[7]=Table[Y[7]];Y[8]=Table[Y[8]];Y[9]=Table[Y[9]];Y[10]=Table[Y[10]];Y[11]=Table[Y[11]];Y[12]=Table[Y[12]];Y[13]=Table[Y[13]];write_Directive(0x80+0x04);//第一行,第五个位置地址
write_Data(Y[0]);//第一行,第五个位置write_Data(Y[1]);//第一行,第六个位置
write_Data(Y[14]);//第一行,第七个位置
write_Data(Y[2]);//第一行,第八个位置write_Data(Y[3]);//第一行,第九个位置
write_Data(Y[14]);//第一行,第十个位置
write_Data(Y[4]);//第一行,第十一个位置write_Data(Y[5]);//第一行,第十二个位置
write_Directive(0x80+0x43);//第二行,第四个位置地址
write_Data(Y[6]);//第二行,第四个位置write_Data(Y[7]);//第二行,第五个位置write_Data(Y[8]);//第二行,第六个位置write_Data(Y[9]);//第二行,第七个位置
write_Data(Y[15]);//第二行,第八个位置
write_Data(Y[10]);//第二行,第九个位置write_Data(Y[11]);//第二行,第十个位置
write_Data(Y[15]);//第二行,第十一个位置
write_Data(Y[12]);//第二行,第十二个位置write_Data(Y[13]);//第二行,第十三个位置}void key_set() //时间按键设置{if(s1 == 0){ delay(20); if(s1 == 0) { set_2++; while(!s1); if(set_2 == 8) { set_2 = 0; } }}}void set_time() //设置时间函数{ if(set_2==1) { RC0=1; } if(set_2==2) ////s2即RB1按1次调秒 { Seconds=incone(Seconds); if(Seconds59) { Seconds=0; } Seconds=decone(Seconds); if(Seconds0) { Seconds=59; } } if(set_2==3) ////s2即RB1按2次调分 { Minutes=incone(Minutes); if(Minutes59) { Minutes=0; } Minutes=decone(Minutes); if(Minutes0) { Minutes=59; } } if(set_2==4) ////s2即RB1按3次调时 { Hours=incone(Hours); if(Hours23) { Hours=0; } Hours=decone(Hours); if(Hours0) { Hours=23; } } if(set_2==5) ////s2即RB1按4次调天 { Day=incone(Day); if(Day31) { Day=1; } Day=decone(Day); if(Day1) { Day=31; } } if(set_2==6) ////s2即RB1按4次调月 { Months=incone(Months); if(Months12) { Months=1; } Months=decone(Months); if(Months1) { Months=12; } } if(set_2==7) ////s2即RB1按5次调年 { Years=incone(Years); if(Years2050) { Years=1986; } Years=decone(Years); if(Years1986) { Years=2010; } } }
int incone(int n) //加“1”函数{ if(s2==0) { delay(20); if(s2==0) { n++; while(!s2); write_Data_String(); } }}
int decone(int m) //减“1”函数{ if(s3==0) { delay(20); if(s3==0) { m--; while(!s3); write_Data_String(); } }}void main(){init();while(1) { key_set(); set_time(); write_Data_String(); }}
这个题用循环语句比较简单,递归的话稍微复杂点,下面是我刚写的:
Hand和Hand2是递归函数;Test是测试函数,用来检验x1,x2,x3的值是否满足条件,满足的话输出(这个函数不是重点,我只写了句提示,你把它补充完整就行);fun函数直接调用Hand函数,主函数中把fun函数放进去就行了。
void fun(bool x1,bool x2,bool x3){
static int count=0;
Hand(x1,x2,x3,count);
}
void Test(bool X,bool Y,bool Z){ //测试函数
if((x1 || !x2 || x3)(!x1 || x2 || x3)) ..... 输出X,Y,Z的值
}
bool Hand2(int x){ //递归函数,按顺序为x1x2x3赋值
if(x=0) return false;
ruturn !Hand(x-1);}
void Hand(bool x1,bool x2,bool x3,count) //递归函数,依次赋值并检测(调用了Hand2和Test)
{
if (count=8) return ;
x1=Hand2(count%4);x2=Hand2(count%2);x3=Hand2(count);
Test(x1,x2,x3);
Hand(x1,x2,x3,count++);
}
采用就给分吧。
#include"stdio.h"
#include"stdlib.h"
main( )
{
int Year,Month; //年、月
int FirstDay_Year,FirstDay_Month; //某年的第一天是星期几,某年某月的第一天是星期几(范围是0~6,其中0代表星期日)
int IsLeapYear; //是否为闰年,0表示不是闰年,1表示是闰年
int i,d,y; //临时变量
char YN; //Yes No,程序是否要继续
int Days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//Days[1~12]存储每个月有多少天,其中二月的天数是可变的(闰年29天,平年28天),这里初始化为28天
printf(" C语言简单万年历\n"); //打印标题
XunHuan: //循环标号(可以通过goto跳转到这里)
printf("请输入年份: "); //提示输入年份(0~9999)
scanf("%d",Year); //把输入的年份赋值给变量Year
printf("请输入月份: "); //提示输入月份(1~12)
scanf("%d",Month); //把输入的月份赋值给变量Month
y=Year;
FirstDay_Year=5*(y/4)+(y%4)-(y/100)+(y/400);//蔡勒公式(计算某年的第一天是星期几)
IsLeapYear=(y%4==4y%100!=100||y%400==0)?1:0;
//判断是否为闰年
Days[2]=(IsLeapYear==1)?29:28; //闰年二月29天,非闰年二月28天
for(i=1,d=0;iMonth;i++)
d=d+Days[i];
FirstDay_Month=(d+FirstDay_Year)%7; //当月的第一天是星期几(0代表星期日)
printf("\n****************************************************\n");
printf("\t\t公元 %d 年 %2d 月",Year,Month); //打印年月
printf("\n****************************************************\n");
printf(" 星期日 星期一 星期二 星期三 星期四 星期五 星期六\n");
//打印星期表头
for(i=0;iFirstDay_Month;i++)
printf("%7c",' '); //当某月的第一天不是星期日时打印空格占位
for(d=1;d=Days[Month];d++) //循环,从每个月的第一天开始打印
{
printf("%7d",d);
if(((d+FirstDay_Month)%7)==0 dDays[Month])
printf("\n"); //当输出了星期六而且还未输出所有天数时,换行
}
printf("\n****************************************************\n");
printf("\n");
printf("是否继续(Y/N)?\n");
scanf("%c",YN);
scanf("%c",YN);
if(YN=='Y' || YN=='y')
goto XunHuan;
}
递归函数有三点要求:
1,递归的终止点,即递归函数的出口
2,不断的递归调用自身
3,递归函数主体内容,即递归函数需要做的事情
ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根据不同的需要合并,比如,有时候递归函数的主体就是返回调用下层函数所得到的结果。
具体例子如下:
void fun(int n)
{
if(n=0) return; //1 这是递归的终点,即出口
fun(n-1); //2、递归函数自身的调用
coutnendl; //3 递归函数的主体内容
}
2,3合并的情况
int fun(int n)
{
if(n=0) return 0;
return fun(n-1)+fun(n-2); //2 3合并
}
C语言设计简单万年历源代码[含阳历阴历转化、密码登陆功能]
C语言课程设计简单万年历源代码[含阳历阴历转化、密码登陆功能]发布:极乐鸟 | 发布时间: 2009年6月23日
万年历
一.基本要求
1. 万年历是简单实用的单机软件。考虑到学生们对日历的认知比较熟悉,所以需要他们实现日历的诸多功能。在编码前先提供清晰的设计框架,再用C语言的程序源完成主要模块的详细设计。即:先构想好流程图,然后利用流程图编写C语言源代码,编写的源代码在TC上运行,运行通过后再进行测试。
2. 一人一组完成程序的分析和编码。
3. 熟悉各个流程步骤,理解各个环节之间的控制流程。
4. 熟练掌握TC或Visual C++下C程序的运行环境。
5. 熟练掌握C语言,调用子程序和函数进行读写数据的操作。程序编写过程中必须用到函数、指针、文件操作等C语言技能。
二、任务分解
本软件能查询0~20000年的公历并能查询1900-2200年的农历,是真正的“万年历”。
1. 显示封面模块(初始界面)
(1)执行本软件后首先显示欢迎信息、版本号、作者姓名、日期及其它信息。
(2)进入方式:按回车进入日历系统,按‘ESC’键退出。
2. 密码检测模块
(1)进入日历系统时,需要密码验证,若密码输入正确则课选择进入日历系统或进入重设新密码页面,否则若密码输入连续3次错误按任意键退出程序。
(2)若需重设新密码,则按‘Y’键即进入重设新密码系统。
(3)在重设新密码时,要求输入正确的旧密码2次,才能输入新密码进行重设。
(4)若输入旧密码3次错误,重设新密码失败,按任意键退出到初始界面。
(5)定义文件指针,用来读取密码文件中的密码数据和将新的密码数据写入密码文件。
3. 查询显示日历模块
(1)查询并显示某一个月的日历(公历);
(2)查询并显示某一年的日历(公历);
(3)查询并显示某一天是星期几,属于该月的第几个星期;
(4)查询并显示某一天是该年的第几天;
(5)查询并显示某一天对应的农历是哪一天;
(6)能够查询中国传统的24节气所对应的公历和农历
(7)当所查询日历完成,按上下光标键可以进行向前向后翻屏查询;按‘ENTER’键重新输入年月,进行新的查询;按‘ESC’键退出程序。
4. 特殊功能模块:用函数实现特殊功能子模块(子程序)。
(1)通过文件操作设置自己的备忘录;
(2)中国传统节日自动提醒或特殊显示。
5. 学生们可以自由发挥增添更丰富的功能。
#include stdio.h
int day,year,month;
int isLeap()
{int isleap;
if(((year%4==0)!(year%100==0))||(year%400==0))isleap=1;
else isleap=0;
return isleap;}
int lastdayofmonth()
{int lastday,isleap;
switch (month)
{case 1: case 3: case 5: case 7:case 8: case 10: case 12: lastday=31;break;
case 4: case 6: case 9: case 11: lastday=30;break;
case 2: {isleap=isLeap();
if (isleap==1) lastday=29;
else lastday=28;}}
return lastday;}
int ValidDate()
{int valid;
int yearOK,monthOK,dayOK;
if ((year1811)(year=2012)) yearOK=1;
else yearOK=0;
if ((month0)(month=12)) monthOK=1;
else monthOK=0;
if ((day0)(day=lastdayofmonth())) dayOK=1;
else dayOK=0;
if(yearOK monthOK dayOK) valid=1;
else valid=0;
return valid;}
int getday(){printf("Enter a month/a day/a year");scanf("%d %d %d",month,day,year);
return ValidDate();}
void incrementdate()
{if (daylastdayofmonth()) day+=1;
else
{day=1;
if (month==12)
{month=1;year+=1;}
else month+=1;}}
void print()
if (ValidDate())printf("nextday is %d/%d/%d",month,day,year);elseprintf("Date error");}
void main(){getday();incrementdate();print();}
补充一下,又发现一个问题。输入之后虽然你做了输入检查,但是现在的写法,这个检查起不到任何作用。可以把main里的getday();改写成if(getday()==0){printf("Date error");return;}意思是如果输入的日期不正常的话打出出错信息并结束程序
主要功能包括
1.查询某年某月每一天对应星期几
2.可以查询某年某月的上个月或是下个月的日历情报
3.查询某年某月某日是这一年的第几天,并查询改天是星期几
4.判断该年是闰年还是平年,判断这一年的生肖
#include stdio.h
#include conio.h
#include dos.h
void rili(int,int);
int runniansub(int);
int week(int,int,int);
int monthday[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{ struct date d;
getdate(d);
printf("今天是:%d年 %d月 %d日\n",d.da_year,d.da_mon,d.da_day);
rili(d.da_year,d.da_mon-1);
system("pause");
return 0; }
void rili(int year,int month)
{ int d,w,i,s,c,p;
char x;
while(month11) {
month-=12;
year++; }
while(month0) { year--;
month+=12; }
if(runniansub(year)) monthday[1]=29;
printf("%d年%d月\n",year,month+1);
printf("S M T W T F S\n");
s=week(year,month+1,1);
for(i=0; i3*s; i++ ) printf(" ");
c=s;
for(d=1;d=monthday[month];d++) {
if(c6) {
printf("\n");
c=0; }
c++;
printf("%d",d);
printf("%s",(d10)?" ":" "); }
printf("\n");
printf("下月N,上月P,退出Q");
x=getch();
printf("%c\n",x);
if(x=='N' || x=='n') { rili(year,month+1); }
else if(x=='P' || x=='p') { rili(year,month-1); }
else { printf("感谢使用!88\n"); return;} }
int runniansub(int year)
{ return ((year%4==0 year%100!=0) || (year%4==0 year%400==0)); }
int week(int y,int m,int d)
{ if((m==1)||(m==2)) {
m+=12;
y--; }
return ((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)+1)%7;
#include stdio.h
int IsLeapYear(int); /*定义子函数*/
main()
{int i,day,year,temp,temp_i; /*定义变量*/
long int Year_days=0;
int Year_Start=1;
int Per_Year_Days;
int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29};/*定义
月份*/
printf("We know that 2000.01.01 is saturday!\n");
printf("Please enter the year and month:"); /*提示信息*/
while(1)
{scanf("%d %d",year,temp);
if(getchar()=='q')
exit(0);
while(Year_Start year)
{ if(IsLeapYear(Year_Start)) /*调用IsLeapYear函数判断是否为
闰年*/
Per_Year_Days=366; /*闰年一年366天*/
else
Per_Year_Days=365; /*平年一年365天*/
Year_days=Year_days + Per_Year_Days;
Year_Start++;
} /*输出每个月的日历*/
// for(temp=1;temp=12;temp++)
{switch(temp)
{ case 1: printf("January (%d) \n",year);break;
case 2: printf("February (%d) \n",year); break;
case 3: printf("March (%d) \n",year); break;
case 4: printf("April (%d) \n",year); break;
case 5: printf("May (%d) \n",year); break;
case 6: printf("June (%d) \n",year);break;
case 7: printf("July (%d) \n",year);break;
case 8: printf("Auguest (%d) \n",year); break;
case 9: printf("September (%d) \n",year);break;
case 10:printf("October (%d) \n",year);break;
case 11:printf("Novermber (%d) \n",year); break;
case 12:printf("December (%d) \n",year); break;
default:printf("error\n");
}
i=Year_days%7;
printf("Mon Tue Wed Thu Fri Sat Sun\n"); /*星期提示信息*/
if(i!=0)
for(temp_i=0;temp_ii;temp_i++)
printf(" ");
day=1;
if(IsLeapYear(year)temp==2)
while(day=month_day[12])
{if(day1)
if(Year_days%7==0)
printf("\n");
if(day=10)
printf("%d ",day);
else
printf("%d ",day);
Year_days++;
day++;}
else
while(day=month_day[temp-1])
{ if(day1)
if(Year_days%7==0)
printf("\n");
if(day=10)
printf("%d ",day);
else
printf("%d ",day);
Year_days++;
day++; } /*依次输入日期*/
printf("\n") ;}}}
int IsLeapYear(int year) /*判断是否是闰年*/
{ if((year%4==0)(year%100!=0)||(year%400==0))
return 1;
else
return 0;}}
#include stdio.h
int leap (int year)
{if(year%4==0year%100!=0||year%400==0) //判断是否是闰年
return 1;
else return 0; }
int days_month (int month,int year) //判断大月和小月
{ if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //找出大月
return 31;
if(month==4||month==6||month==9||month==11) //找出小月
return 30;
if(month==2leap(year)==1) return 29; //判断二月是29天还是29天
else return 28; }
int firstday(int month,int year)
{int w;
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1; //判断每个月开始的第一天是星期几
return w; }
main()
{int i,j=1,k=1,a,b,month,year;
printf("\n input month and year:\n");
scanf("%d%d",month,year); //输入月和年
b=days_month(month,year);
a=firstday (month,year);
printf(" Sun Mon Tue Wed Thu Fri Sat \n"); //输出对应当月的日历
if(a==7)
{for(i=1;i=b;i++)
{printf("%4d",i);
if(i%7==0)
{printf("\n"); } } }
if(a!=7)
{while (j=4*a)
{printf(" ");
j++; }
for(i=1;i=b;i++)
{printf("%4d",i);
if(i==7*k-a)
{printf("\n");
k++; } } }
printf("\n"); }
PS:这份是山东交通学院信息工程系电气类专业2009年6月C语言课程设计的题目之一。以上程序核心是一学妹写的,因为她写出后出现了一些bug,本人负责了调试及bug修补工作。