万年历制作带生肖.doc_第1页
万年历制作带生肖.doc_第2页
万年历制作带生肖.doc_第3页
万年历制作带生肖.doc_第4页
万年历制作带生肖.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #include #include #define uint unsigned int#define uchar unsigned char/*LCM12864*/#define LCM_data P0sbit LCM_RS=P26; /定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit LCM_RW=P25; /定义12864液晶RW端,读/写信号 H:读 L:写 sbit LCM_EN=P27; /定义12864液晶LCDEN端, 片选信号 下降沿触发,锁存数据 sbit LCM_PSB=P32; /定义12864液晶PSB端, H:并行 L:串行sbit LCM_RST=P37;sbit KEY_1 = P10; /确认sbit KEY_2 = P11; /设置sbit KEY_3 = P12; /加sbit KEY_4 = P13; /减 /定义DS1302时钟接口sbit DS1302_CLK = P36; /实时时钟时钟线引脚 sbit DS1302_IO = P34; /实时时钟数据线引脚 sbit DS1302_RST = P35; /实时时钟复位线引脚/定义累加器A中的各位sbit ACC0 = ACC0;sbit ACC7 = ACC7;/*/sbit beep = P36;sbit BL = P00; /定义背光控制口/*/温度传感器定义sbit DQ = P35; /ds18B20/*/定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss,e;/定义时间映射全局变量(专用寄存器)unsigned char nz_shi=12,nz_fen=0,nz_miao=0; /闹钟时分秒变量bit alam_on=1;/默认开启闹钟bit c_moon;unsigned char year_moon,month_moon,day_moon,week;bit w = 0; /调时标志位unsigned char menu = 0;/定义静态小时更新用数据变量unsigned char keys = 0;/定义静态小时更新用数据变量unsigned char timecount = 0;/定义静态软件计数器变量unsigned char count0,BLsecond;uchar code tab1=-万年历-制作人: 指导人: 阳光总在风雨后 ;/*/void DelayM(unsigned int a) /延时函数 1MS/次unsigned char i;while( -a != 0)for(i = 0; i 125; i+); /一个 ; 表示空语句,CPU空转从0加到125,CPU大概就耗时1毫秒? /*/函数声明void LCM_WriteString(unsigned char *str) ; /写字符 例:LCM_WriteString(您好!);void LCM_WriteDatOrCom(bit ,unsigned char ); /(0,指令) (1,数据)void LCM_w_byte(unsigned char bbyte); /写一个字节给LCMvoid delaynms(unsigned int di); /延时void LCM_init(void); /LCM初始化void LCM_clr(void); /清屏void Delay(int num);bit get_moon_day(uchar month_p,uint table_addr);void Conversion(bit c,uchar year,uchar month,uchar day);void nl(); /*/初始化LCMvoid LCM_init(void) LCM_PSB=1; /并口方式LCM_RST=0;/复位Delay(50);LCM_RST=1;LCM_WriteDatOrCom (0,0x30); /*30-基本指令动作*/ LCM_WriteDatOrCom (0,0x01); /*清屏,地址指针指向00H*/Delay (100);LCM_WriteDatOrCom (0,0x06); /*光标的移动方向*/LCM_WriteDatOrCom(0,0x0c); /*开显示,关游标*/ /=/LCD忙检测函数bit lcm_busy() bit result; LCM_RS=0; LCM_RW=1; LCM_EN= 1; result=(bit)(LCM_data & 0x80); LCM_EN=0; return result;/*/写指令或数据 (0,指令) (1,数据)void LCM_WriteDatOrCom(bit dat_com,uchar content)/=/液晶写命令函数if(dat_com=0) while(lcm_busy(); LCM_RS=0; /选择指令寄存器 LCM_RW=0; /写 LCM_EN=0; LCM_data=content; /指令值赋给数据口 Delay(5); LCM_EN=1; Delay(5); LCM_EN=0; /=/液晶写一个字符数据函数else while(lcm_busy(); LCM_RS=1; /选择数据寄存器 LCM_RW=0; /写 LCM_EN=0; LCM_data=content; /数据值赋给数据口 Delay(5); LCM_EN=1; Delay(5); LCM_EN=0;/*/void chn_disp (uchar code *chn) uchar i,j; LCM_WriteDatOrCom (0,0x30); LCM_WriteDatOrCom (0,0x80); for (j=0;j4;j+) for (i=0;i0;i-)DQ = 0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;Delay(4);return(dat);/*/void WriteOneChar(unsigned char dat)/写一个字节unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat=1;/*/声明void LCM_w_ss(void);void LCM_w_ss_wd(void);void LCM_w_mm(void);void LCM_w_hh(void);void LCM_w_dd(void);void LCM_w_mo(void);void LCM_w_yy(void);void LCM_w_xq(void);void LCM_w_NZ(void);void DS1302InputByte(unsigned char d) ;unsigned char DS1302OutputByte(void) ;void Init_1302(void);unsigned char Read1302(unsigned char);void Set_time(unsigned char sel);void Write1302(unsigned char , unsigned char );void updata (void);/*/调时用加1程序void Set_time(unsigned char sel) /根据选择调整的相应项目加1并写入DS1302 signed char address,item;signed char max,mini;LCM_WriteDatOrCom(0,0x9a);if(selmax) item=mini;/查看数值有效范围 if(itemmax) item=mini;/查看数值有效范围 if(item0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);/*/向LCM中填写 年 数据void LCM_w_yy(void)/if(Read1302(0x8d) != yy)yy = Read1302(0x8d);LCM_WriteDatOrCom(0,0x80);LCM_WriteString(20);LCM_WriteDatOrCom(0,0x81);LCM_WriteDatOrCom(1,(yy/16)+0x30);LCM_WriteDatOrCom(1,yy%16+0x30);LCM_WriteDatOrCom(0,0x82);LCM_WriteString(年); nl(); /*/向LCM中填写 月 数据void LCM_w_mo(void)/if(Read1302(0x89) != mo)mo = Read1302(0x89);LCM_WriteDatOrCom(0,0x83);if(mo/16 != 0)LCM_WriteDatOrCom(1,(mo/16)+0x30);/十位消隐elseLCM_WriteDatOrCom(1,0x20);/同上LCM_WriteDatOrCom(1,mo%16+0x30);LCM_WriteDatOrCom(0,0x84);LCM_WriteString(月); nl();/*/向LCM中填写 日 数据void LCM_w_dd(void)/if(Read1302(0x87) != dd)dd = Read1302(0x87);LCM_WriteDatOrCom(0,0x85);if(dd/16 != 0)LCM_WriteDatOrCom(1,(dd/16)+0x30);/十位消隐elseLCM_WriteDatOrCom(1,0x20);/同上LCM_WriteDatOrCom(1,dd%16+0x30);LCM_WriteDatOrCom(0,0x86);LCM_WriteString(日 );nl();/*/星期处理并送入LCM的指定区域void LCM_w_xq(void)unsigned char sel;/if(Read1302(0x8b) != xq)xq = Read1302(0x8b);sel = (Read1302(0x8b)%16; /字节低4位的BCD码放入selLCM_WriteDatOrCom(0,0x97);/写入指定区域(97H 第二行第8个字)if(sel=7) LCM_WriteString(日); / if(sel=6) LCM_WriteString(六); / if(sel=5) LCM_WriteString(五); / if(sel=4) LCM_WriteString(四); / if(sel=3) LCM_WriteDatOrCom(1,0xc8);LCM_WriteDatOrCom(1,0xfd); /此指令等于LCM_WriteString(三); 因为三的内码失效。 if(sel=2) LCM_WriteString(二); / if(sel=1) LCM_WriteString(一); /星期一LCM_WriteDatOrCom(0,0x95);LCM_WriteString(星周);/*/向LCM中填写 闹钟 时分秒void LCM_w_NZ(void)LCM_WriteDatOrCom(0,0x88);LCM_WriteString(闹钟 );/LCM_WriteDatOrCom(1,0x3a); /:LCM_WriteDatOrCom(1,(nz_shi/10)+0x30);/闹钟时LCM_WriteDatOrCom(1,(nz_shi%10)+0x30);LCM_WriteDatOrCom(1,0x3a); /:LCM_WriteDatOrCom(1,(nz_fen/10)+0x30);/闹钟分LCM_WriteDatOrCom(1,(nz_fen%10)+0x30);LCM_WriteDatOrCom(1,0x3a); /:LCM_WriteDatOrCom(1,(nz_miao/10)+0x30); /闹钟秒LCM_WriteDatOrCom(1,(nz_miao%10)+0x30); /*/向LCM中填写 小时 数据void LCM_w_hh(void)if(Read1302(0x85) != hh)hh = Read1302(0x85);if (hh 0x07 & hh 0x22 & w = 0)beep = 0; DelayM(100);beep = 1; LCM_WriteDatOrCom(0,0x88);LCM_WriteDatOrCom(1,(hh/16)+0x30);LCM_WriteDatOrCom(1,hh%16+0x30);/*/向LCM中填写 分钟 数据void LCM_w_mm(void)if(Read1302(0x83) != mm)mm = Read1302(0x83);if( w = 0)updata ();/刷新数据LCM_WriteDatOrCom(0,0x89);LCM_WriteDatOrCom(1,0x3a); /:LCM_WriteDatOrCom(1,(mm/16)+0x30);LCM_WriteDatOrCom(1,mm%16+0x30);LCM_WriteDatOrCom(1,0x3a); /./*/向LCM中填写 秒 数据void LCM_w_ss(void)if(Read1302(0x81) != ss)ss = Read1302(0x81);if( w = 0)updata ();/刷新数据LCM_WriteDatOrCom(0,0x8B);LCM_WriteDatOrCom(1,(ss/16)+0x30);LCM_WriteDatOrCom(1,ss%16+0x30);LCM_w_mm();/刷新 分/*/刷新数据void updata (void)LCM_w_hh();/刷新 小时 LCM_w_dd();/刷新 日LCM_w_xq();/更新星期值LCM_w_mo();/刷新 月LCM_w_yy();/刷新 年nl();/*/向LCM中填写 秒 数据void LCM_w_ss_wd(void)unsigned int i=0;unsigned char a=0,b=0,c=0;if(Read1302(0x81) != ss)/判断是否需要更新ss = Read1302(0x81);/更新数据LCM_WriteDatOrCom(0,0x8b);/秒值在LCM上的写入位置LCM_WriteDatOrCom(1,(ss/16)+0x30);/写十位LCM_WriteDatOrCom(1,ss%16+0x30);/写个位LCM_w_mm();/刷新 分 nl();i=ReadTemperature();/读温度并送显a=i/100;/温度的十位b=i/10-a*10;/温度的个位c=i-a*100-b*10;/温度的十分位LCM_WriteDatOrCom(0,0x8d);/温度在LCM上的写入位置LCM_WriteDatOrCom(1,a+0x30);/显示温度十位LCM_WriteDatOrCom(1,b+0x30);/个位LCM_WriteDatOrCom(1,0x2e); /.LCM_WriteDatOrCom(1,c+0x30); /小位1位LCM_WriteString();/度C/*阳历转换阴历*/code uchar year_code597= 0x04,0xAe,0x53, /1901 0 0x0A,0x57,0x48, /1902 3 0x55,0x26,0xBd, /1903 6 0x0d,0x26,0x50, /1904 9 0x0d,0x95,0x44, /1905 12 0x46,0xAA,0xB9, /1906 15 0x05,0x6A,0x4d, /1907 18 0x09,0xAd,0x42, /1908 21 0x24,0xAe,0xB6, /1909 0x04,0xAe,0x4A, /1910 0x6A,0x4d,0xBe, /1911 0x0A,0x4d,0x52, /1912 0x0d,0x25,0x46, /1913 0x5d,0x52,0xBA, /1914 0x0B,0x54,0x4e, /1915 0x0d,0x6A,0x43, /1916 0x29,0x6d,0x37, /1917 0x09,0x5B,0x4B, /1918 0x74,0x9B,0xC1, /1919 0x04,0x97,0x54, /1920 0x0A,0x4B,0x48, /1921 0x5B,0x25,0xBC, /1922 0x06,0xA5,0x50, /1923 0x06,0xd4,0x45, /1924 0x4A,0xdA,0xB8, /1925 0x02,0xB6,0x4d, /1926 0x09,0x57,0x42, /1927 0x24,0x97,0xB7, /1928 0x04,0x97,0x4A, /1929 0x66,0x4B,0x3e, /1930 0x0d,0x4A,0x51, /1931 0x0e,0xA5,0x46, /1932 0x56,0xd4,0xBA, /1933 0x05,0xAd,0x4e, /1934 0x02,0xB6,0x44, /1935 0x39,0x37,0x38, /1936 0x09,0x2e,0x4B, /1937 0x7C,0x96,0xBf, /1938 0x0C,0x95,0x53, /1939 0x0d,0x4A,0x48, /1940 0x6d,0xA5,0x3B, /1941 0x0B,0x55,0x4f, /1942 0x05,0x6A,0x45, /1943 0x4A,0xAd,0xB9, /1944 0x02,0x5d,0x4d, /1945 0x09,0x2d,0x42, /1946 0x2C,0x95,0xB6, /1947 0x0A,0x95,0x4A, /1948 0x7B,0x4A,0xBd, /1949 0x06,0xCA,0x51, /1950 0x0B,0x55,0x46, /1951 0x55,0x5A,0xBB, /1952 0x04,0xdA,0x4e, /1953 0x0A,0x5B,0x43, /1954 0x35,0x2B,0xB8, /1955 0x05,0x2B,0x4C, /1956 0x8A,0x95,0x3f, /1957 0x0e,0x95,0x52, /1958 0x06,0xAA,0x48, /1959 0x7A,0xd5,0x3C, /1960 0x0A,0xB5,0x4f, /1961 0x04,0xB6,0x45, /1962 0x4A,0x57,0x39, /1963 0x0A,0x57,0x4d, /1964 0x05,0x26,0x42, /1965 0x3e,0x93,0x35, /1966 0x0d,0x95,0x49, /1967 0x75,0xAA,0xBe, /1968 0x05,0x6A,0x51, /1969 0x09,0x6d,0x46, /1970 0x54,0xAe,0xBB, /1971 0x04,0xAd,0x4f, /1972 0x0A,0x4d,0x43, /1973 0x4d,0x26,0xB7, /1974 0x0d,0x25,0x4B, /1975 0x8d,0x52

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论