万年历程序分析资料

  • 格式:doc
  • 大小:56.00 KB
  • 文档页数:13

万年历程序(中文版) #include #include #include

char*S="\n *"; //换行符'\n'右边的4个空格使“年历”相对于屏幕比较“居中” //空格少则“年历”偏于屏幕左边,反之则“年历”就偏于右边。

//“准空行(1个星号+70个空格+1个星号)”的宏定义: #define EP printf("%s%s %s%s*",S,k,k,k)

int LEAP(int year); int xqj(int year,int month,int day); void fill(int y,int m,char array[]); void half(int year,int month1st);

main() { int year; do { printf("年份: "); scanf("%d",&year); fflush(stdin);//避免误输入导致的死循环 } while(year<=0||year>9999); half(year,1); //上半年 getch();//避免一闪而过 printf("\n"); half(year,7); //下半年 getch();//避免一闪而过 printf("\n"); }

int LEAP(int y)//判断公元y年是否闰年 //如果y是闰年年份(如2008)则返回1,否则返回0 { return!(y%(y%100?4:400)); //即 // return (y%(y%100!=0?4:400))==0; // 但前面那种表达方式显然更加精炼 }

int xqj(int year,int month,int day) //确定year年month月day日为星期几 //[注意]如果是星期天则返回值为零 { int i,y1,days[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; days[2]=28+LEAP(year);//搞定2月份的天数 for(i=1;i// 循环毕,形参day存放:这一天是全年的第几天 y1=year-1;//因为year年还没过完,所以减一 day+=y1+y1/4-y1/100+y1/400;//此句是核心 return day%7; //让返回值落在闭区间[0,6] }

void fill(int y,int m,char array[3*7*6]) //用sprintf()对array[]填充某个月的“日” //关于数组大小[3*7*6]的解释: //“3”是因为“日”最大值31占用2格再加上1个间隔 //“7”是因为“星期几”共有7种状态 //“6”是因为1个“月”最多可能要涉及6个“星期” { char *pa; int i,x1,days[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; days[2]=28+LEAP(y);//搞定2月份的天数 x1=xqj(y,m,1);//求y年m月1号是星期几 if(x1==0)x1=7;//让星期日与x1==7对应 pa=array+3*(x1-01);//此句是很关键的 ////pa=array+3*(x1-00);//另一种版本应这样////////////////// for(i=0;i<3*7*6;i++)array[i]=' '; for(i=1;i<=days[m];i++,pa+=3)sprintf(pa,"%3d",i); *pa=' ';//用空格冲掉sprintf()语句遗留下来的'\0' }

void half(int year,int m) //完成半个“年历”的输出任务 //m=1对应上半年m=7对应下半年 { int i,j; char ary[6][7*3],bry[6][7*3],cry[6][7*3]; char *k=" ";//20个空格 char *xq="一 二 三 四 五 六 日 ";//星期几 ////char *xq="日 一 二 三 四 五 六 ";//另一种版本应这样////////////////// char *xs="********************************";//32个星号 printf("%s%s %04d %s*",S,xs,year,xs);//上半个年历(或下半个年历)的首行 for(i=1;i<=2;i++,m+=3) { EP;//为了美观,插入1个准空行(即1个星号、70个空格、1个星号) if(m<10)//如果是1~9月份之一 printf("%s%.10s%d月%.20s%d月%.20s%d月%.11s*",S,k,m,k,m+1,k,m+2,k); else //如果是10~12月份之一 printf("%s%.10s%d月%.19s%d月%.19s%d月%.10s*",S,k,m,k,m+1,k,m+2,k); EP;//为了美观,插入1个准空行(即1个星号、70个空格、1个星号) printf("%s %s %s %s *",S,xq,xq,xq); fill(year,m ,*ary); fill(year,m+1,*bry); fill(year,m+2,*cry); for(j=0;j<6;j++) { printf("%s %.21s %.21s %.21s *",S,ary[j],bry[j],cry[j]); } EP;//为了美观,插入1个准空行(即1个星号、70个空格、1个星号) } printf("%s%s******%s*",S,xs,xs);//上半个年历(或下半个年历)的底行 } 第二个 1.主程序 /*************************************************** * 标题:万年历 * * 作者:Wujieflash * * 日期:2008年1月13日 * * 说明:包含文件 ***************************************************/ #include #include "ziku.h" #include "lcd_init.h" #include "ds1302.h" #include "ds18b20.h" #include "keyscan.h" #include "yinli.h" //子程序 //LCD显示空白边框子程序 void LCDShowTable() { uch i; SlectScreen(1); //写左半屏 SetLine(0); //起使页 SetColumn(0); //起使列 for(i=0;i //显示固定字符子程序 void LCDShowGudingWord() { Show8X16_2(0,24,s0); Show8X16_2(0,32,s0); Show8X16(2,1,s0); Show8X16(2,9,s0); Show16X16_3(6,40,ri); Show16X32(2,24,ss0); Show16X32(2,40,ss0); Show8X16_2(0,64,s0); Show8X16_2(0,72,s0); Show8X16_2(0,80,maohao); Show8X16_2(0,88,s0); Show8X16_2(0,96,s0); Show8X16_2(0,104,maohao); Show8X16_2(0,112,s0); Show8X16_2(0,119,s0); Show8X16(2,80,s0); Show8X16(2,88,s0); Show16X16_2(4,64,shiyi); Show16X16_2(4,80,yue); Show16X16_2(4,95,chu); Show16X16_2(4,111,yi); Show16X16_3(6,72,sheng); Show16X16_3(6,88,xiao); Show16X16_3(6,104,shu);

Show16X16_2(0,40,nian); Show16X16(4,2,yue); Show16X16_3(6,8,xing); Show16X16_3(6,24,qi); Show16X16(2,96,danwei1); Show8X16_2(0,8,s2); Show8X16_2(0,16,s0); } /*----------------------------------------------------------*/ //TRM1初始化子程序 void TMR1init() { //TRM1 INITIAL T1CON=0X30; //8分频 TMR1IF=0; //清中断标志 TMR1IE=1; //使能定时器1中断 TMR1L=0XDB; //初始值(定时0.5S) TMR1H=0X0B;