电子万年历最终程序.doc_第1页
电子万年历最终程序.doc_第2页
电子万年历最终程序.doc_第3页
电子万年历最终程序.doc_第4页
电子万年历最终程序.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

电子万年历的设计程序电子万年历的设计主要功能:万年历、时钟、温度、闹钟、计算器2012/6/6以下程序为main.h文档内的内容。#include#include #include #define uchar unsigned char#define uint unsigned intsbit RW=P10;sbit RS=P11;sbit E=P12;#define uint32 unsigned long int/#define uchar unsigned char#define uint8 unsigned int#define Data P0/数据端口sbit SCLK=P13;sbit D1302=P14;sbit RST=P15;/uchar table2= THUFRISATSUNMONTUEWES;/sbit DQ = P35;sbit ds=P35;sbit LED1=P16;sbit LED2=P17;sbit SetTimer=P32;sbit StarCalculator=P33;sbit KeyOut = P36;sbit KeyLoad = P21;sbit KeyCLK = P20;void delayms(uint t);void delayus(uchar t);void delay8us();void ds_writebyte(uchar byte);uchar ds_readbyte();void ds_read_temperature();void print(uchar pos,uchar *str);void ds_read_temperature();void print(uchar pos,uchar *str);void show_temperature(); void DelayUs(uchar us);void DelayMs(uchar ms);void WriteCommand(unsigned char c);void WriteData(unsigned char c);void ShowChar(unsigned char pos,unsigned char c);void ShowString(unsigned char line,char *ptr);void InitLcd();void Write_1302_Data(uchar Dat);void Write_Set1302(uchar Cmd,uchar Dat);uchar Read_1302_Data(void);uchar Read_Set1302(uchar Cmd);void Init_DS1302(void);void DisplaySecond(uchar x) ;void read_date(void) ;void ChangTimer();uchar Read_Key(void);unsigned long Read_HC165(void);void calculator();以下程序为LCS_1602.c文档内的内容。#include main.h/*/* 微秒延时函数 */*/void DelayUs(uchar us)/delay us unsigned char uscnt;/ for(uscnt=us;uscnt0;uscnt-) ; /*12MHz频率*/ /while(us-); uscnt=us1; /*12MHz频率*/ while(-uscnt);/*/* 毫秒函数声明 */*/void DelayMs(uchar ms) while(-ms) DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); /*/* 写入命令函数 */*/void WriteCommand(unsigned char c) DelayMs(2);/操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; /_nop_(); DelayUs(5); E=1; Data=c; E=0; DelayUs(5);/*/* 写入数据函数 */*/void WriteData(unsigned char c) DelayMs(2); /操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; /_nop_(); DelayUs(5); E=1; Data=c; E=0; RS=0; DelayUs(5);/*/* 写入字节函数 */*/*void ShowChar(unsigned char pos,unsigned char c) unsigned char p; if (pos=0x10) p=pos+0xc0; /是第二行则命令代码高4位为0xc else p=pos+0x80; /是第二行则命令代码高4位为0x8 WriteCommand (p);/写命令 WriteData (c); /写数据*/*/* 写入字符串函数 */*/*void ShowString(unsigned char line,char *ptr) unsigned char l,i; l=line4; for (i=0;i16;i+) ShowChar (l+,*(ptr+i);/循环显示16个字符*/*/* 初始化函数 */*/void InitLcd() DelayMs(1); WriteCommand(0x38); /display mode WriteCommand(0x38); /display mode WriteCommand(0x38); /display mode WriteCommand(0x06); /显示光标移动位置 WriteCommand(0x0c); /显示开及光标设置 WriteCommand(0x01); /显示清屏/*main()InitLcd();WriteCommand(0x80);WriteData(0x41); */以下程序是aj.c文档内的内容。#include main.hunsigned long Read_HC165(void) uint32 keynum =0,i; KeyLoad=0;/ delay(1); DelayUs(5); KeyLoad=1; for(i=0;i24;i+) keynum = 1;/ delay(1); DelayUs(5); if(KeyOut=1) keynum |= 0x000001; else keynum &= 0xfffffe; KeyCLK=0;/ delay(1); DelayUs(5); KeyCLK=1; return(keynum);uchar Read_Key(void) uint32 Key; Key = Read_HC165(); if(Key =0xffffff) return(0); DelayUs(5); DelayMs(130);/ keyDelays(10); /去抖 Key = Read_HC165(); if(Key =0xffffff) return(0); switch(Key) case 0xfffdff: Key = 1; break; case 0xf7ffff: Key = 2; break; case 0xfbffff: Key = 3; break; case 0xfdffff: Key = 4; break; case 0xfeffff: Key = 5; break; case 0xfffeff: Key = 6; break; case 0xefffff: Key = 7; break; case 0xdfffff: Key = 8; break; case 0xbfffff: Key = 9; break; case 0x7fffff: Key = 10; break; case 0xfffffe: Key = 11; break; case 0xffefff: Key = 12; break; case 0xffdfff: Key = 13; break; case 0xffbfff: Key = 14; break; case 0xffff01: Key = 15; break; case 0xff7fff: Key = 16; break; case 0xfff7ff: Key = 17; break; case 0xfffbff: Key = 18; break; default: Key = 0; break; return Key;以下程序是clock.c文档内的内容。#include main.hvoid Write_1302_Data(uchar Dat)/写入数据datuchar i; SCLK=0; /拉低SCLK,为脉冲上升沿写入数据做好准备DelayUs(2); /稍微等待,使硬件做好准备for(i=0;i=1; /将data的各数据位右移1位,准备写入下一个数据位void Write_Set1302(uchar Cmd,uchar Dat)/向cmd中写入数据datRST=0; /禁止数据传递SCLK=0; /确保写数居前SCLK被拉低RST=1; /启动数据传输DelayUs(2); /稍微等待,使硬件做好准备Write_1302_Data(Cmd); /写入命令字Write_1302_Data(Dat); /写数据SCLK=1; /将时钟电平置于已知状态RST=0; /禁止数据传递uchar Read_1302_Data(void)/读字节uchar i,dat;DelayUs(2); /稍微等待,使硬件做好准备for(i=0;i=1; /将dat的各数据位右移1位,因为先读出的是字节的最低位if(D1302=1) /如果读出的数据是1dat|=0x80; /将1取出,写在dat的最高位SCLK=1; /将SCLK置于高电平,为下降沿读出DelayUs(2); /稍微等待SCLK=0; /拉低SCLK,形成脉冲下降沿DelayUs(2); /稍微等待 return dat; /将读出的数据返回uchar Read_Set1302(uchar Cmd)/在cmd中读取数据uchar dat;RST=0; /拉低RSTSCLK=0; /确保写数居前SCLK被拉低RST=1; /启动数据传输Write_1302_Data(Cmd); /写入命令字dat=Read_1302_Data(); /读出数据SCLK=1; /将时钟电平置于已知状态RST=0; /禁止数据传递return dat; /将读出的数据返回void Init_DS1302(void)/1302初始化uchar k=16; Write_Set1302(0x8E,0x00); /根据写状态寄存器命令字,写保护关 Write_Set1302(0x80,(0/10)4|(0%10); /根据写秒寄存器命令字,写入秒的初始值Write_Set1302(0x82,(45/10)4|(45%10); /根据写分寄存器命令字,写入分的初始值Write_Set1302(0x84,(15/10)4|(15%10); /根据写小时寄存器命令字,写入小时的初始值Write_Set1302(0x86,(29/10)4|(29%10); /根据写日寄存器命令字,写入日的初始值Write_Set1302(0x88,(11/10)4|(11%10); /根据写月寄存器命令字,写入月的初始值Write_Set1302(0x8c,(k); /年Write_Set1302(0x8a,(0/10)4|(0%10);/时间显示void DisplaySecond(uchar x)uchar i,j; i=x/10;j=x%10;WriteCommand(0xc7); WriteData(0x30+i); WriteData(0x30+j); void DisplayMinute(uchar x)uchar i,j; i=x/10;j=x%10; WriteCommand(0xc4); WriteData(0x30+i); WriteData(0x30+j); WriteData(0x3a); void DisplayHour(uchar x)uchar i,j; i=x/10;j=x%10;WriteCommand(0xc1); WriteData(0x30+i); WriteData(0x30+j); WriteData(0x3a); void DisplayDay(uchar x)uchar i,j; i=x/10;j=x%10; WriteCommand(0x88); WriteData(0x30+i); WriteData(0x30+j); void DisplayMonth(uchar x)uchar i,j; i=x/10;j=x%10; WriteCommand(0x85); WriteData(0x30+i); WriteData(0x30+j); WriteData(0x2d); void DisplayYear(uchar x)uchar i,j; i=x/10;j=x%10; WriteCommand(0x80);WriteData(0x32);WriteData(0x30); WriteData(0x30+i);WriteData(0x30+j);WriteData(0x2d); void DisplayWeek(uchar x) uchar table2= MONTUEWESTHUFRISATSUN;uchar i;x=x*3;WriteCommand(0x8c); for(i=0;i4)*10 + (ReadValue&0x0F);ReadValue = Read_Set1302(0x83); minute=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x85); hour=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x87); day=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x89); month=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x8d); year=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue=Read_Set1302(0x8b); /读星期week=ReadValue&0x07;if(minute=0&minute=0) q=4;while(q-) LED1=0;DelayMs(200);LED1=1;DelayMs(200);DisplaySecond(second); DisplayMinute(minute); DisplayHour(hour); DisplayDay(day); DisplayMonth(month); DisplayYear(year); DisplayWeek(week); void ChangTimer() uchar ReadValue,second,minute,hour,day,month,year,week;uchar key=19,k=0,time=0,setag=1,w=1;if(SetTimer=0)DelayMs(10);if(SetTimer=0)InitLcd();ReadValue = Read_Set1302(0x81); second=(ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read_Set1302(0x83); minute=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x85); hour=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x87); day=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x89); month=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read_Set1302(0x8d); year=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue=Read_Set1302(0x8b); /读星期week=ReadValue&0x07;while(setag)key=Read_Key();switch(key)case 11: WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x59);WriteData(0x65);WriteData(0x61);WriteData(0x72);WriteCommand(0xc0);WriteData(0x3d);while(k)key=Read_Key();if(key0)if(key=10) key=0;if(time=0) year=key;time+;WriteCommand(0xc5);WriteData(0x30+key);key=19;else year=year*16+key;time+;WriteCommand(0xc6);WriteData(0x30+key);key=19;if(time1) k=0;time=0;w=0;break;case 12: WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x4d);WriteData(0x6f);WriteData(0x6e);WriteData(0x74);WriteData(0x68);WriteCommand(0xc0);WriteData(0x3d);while(k)key=Read_Key();if(key0)if(key=10) key=0;if(time=0) month=key;time+;WriteCommand(0xc5);WriteData(0x30+key);key=19;else month=month*16+key;time+;WriteCommand(0xc6);WriteData(0x30+key);key=19;if(time1) k=0;time=0;w=0;break;case 13: WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x4d);WriteData(0x69);WriteData(0x6e);WriteData(0x75);WriteData(0x74);WriteData(0x65);WriteCommand(0xc0);WriteData(0x3d);while(k)key=Read_Key();if(key0)if(key=10) key=0;if(time=0) minute=key;time+;WriteCommand(0xc5);WriteData(0x30+key);key=19;else minute=minute*16+key;time+;WriteCommand(0xc6);WriteData(0x30+key);key=19;if(time1) k=0;time=0;w=0;break;case 14: WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x53);WriteData(0x65);WriteData(0x63);WriteData(0x6f);WriteData(0x6e);WriteData(0x64);WriteCommand(0xc0);WriteData(0x3d);while(k)key=Read_Key();if(key0)if(key=10) key=0;if(time=0) second=key;time+;WriteCommand(0xc5);WriteData(0x30+key);key=19;else second=second*16+key;time+;WriteCommand(0xc6);WriteData(0x30+key);key=19;if(time1) k=0;time=0;w=0;break;case 15: WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x48);WriteData(0x6f);WriteData(0x75);WriteData(0x72);WriteCommand(0xc0);WriteData(0x3d);while(k)key=Read_Key();if(key0)if(key=10) key=0;if(time=0) hour=key;time+;WriteCommand(0xc5);WriteData(0x30+key);key=19;else hour=hour*16+key;time+;WriteCommand(0xc6);WriteData(0x30+key);key=19;if(time1) k=0;time=0;w=0;break;case 16: setag=0;key=0;k=0;time=0;Write_Set1302(0x8E,0x00); /根据写状态寄存器命令字,写保护关 Write_Set1302(0x80,(second); /根据写秒寄存器命令字,写入秒的初始值Write_Set1302(0x82,(minute); /根据写分寄存器命令字,写入分的初始值Write_Set1302(0x84,(hour); /根据写小时寄存器命令字,写入小时的初始值Write_Set1302(0x86,(day); /根据写日寄存器命令字,写入日的初始值Write_Set1302(0x88,(month); /根据写月寄存器命令字,写入月的初始值Write_Set1302(0x8c,(year); /年Write_Set1302(0x8a,(week);WriteCommand(0x01);break;case 17: WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x44);WriteData(0x61);WriteData(0x79);WriteCommand(0xc0);WriteData(0x3d);while(k)key=Read_Key();if(key0)if(key=10) key=0;if(time=0) day=key;time+;WriteCommand(0xc5);WriteData(0x30+key);key=19;else day=day*16+key;time+;WriteCommand(0xc6);WriteData(0x30+key);key=19;if(time1) k=0;time=0;w=0;break;case 18: WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x57);WriteData(0x65);WriteData(0x65);WriteData(0x6b);WriteCommand(0xc0);WriteData(0x3d);while(k)key=Read_Key();if(key0)if(key=10) key=0;if(time=0) week=key;time+;WriteCommand(0xc5);WriteData(0x30+key);key=19;else week=week*16+key;time+;WriteCommand(0xc6);WriteData(0x30+key);key=19;if(time1) k=0;time=0;w=0;break;default:break;以下程序是temperature.c文档内的内容。#include main.h/*/void dlms(uint t) /11.0592MHZ 1ms uchar i; while(t-) for(i=110;i0;i-);/*/void dlus(uchar t) /11.0592MHZ 21us while(t-) _nop_();/*/void delay8us() / 8us _nop_();_nop_();_nop_();_nop_();/*/bit ds_reset() /复位和存在脉冲检查 bit responsion; ds=1; _nop_(); ds=0; dlus(60); /580us ds=1; dlus(2); dlus(2); responsion=ds; ds=1; dlus(40); /402us return responsion;/*/void ds_writebyte(uchar byte) /写一个字节 ,都是最低位先发送和接收吗? uchar temp,i; bit test; /CY不能右移吗? temp=byte; for(i=0;i1; if(test=1) ds=1; _nop_(); ds=0; _nop_(); _nop_(); _nop_(); ds=1; dlus(1); dlus(1); else ds=1; _nop_(); ds=0; dlus(1); dlus(1); ds=1; _nop_(); _nop_(); _nop_(); uchar ds_readbyte() /读一个字节 uchar result,i,j; bit dat; for(i=0;i1; /右移不能移入CY,C语言中没有带进位的移位操作吗? j=dat; result=(j1); return result;/*void ds_read_temperature() uchar T_L=0; uchar T_H=0; uchar k,temp1; while(ds_reset(); ds_writebyte(0xcc); /不是用寄生电源 ds_writebyte(0x44); while(ds_reset(); ds_writebyte(0xcc); ds_writebyte(0xbe); T_L=ds_readbyte(); T_H=ds_readbyte(); k=T_H&0x80; if(k=0x80) T_sign=1; temp1=(T_L+1)&0xf0)/16+(T_H)&0x07)*16; /负数温度是整数取反加一,不知道对不对? t_bai=temp1/100; t_shi=temp1%100/10; t_ge=temp1%10; temp1=(T_L+1)&0x0f)*625/100; t_fen=temp1/10; t_miao=temp1%10; else T_sign=0; temp1=(T_L&0xf0)/16+(T_H&0x0f)*16; t_bai=temp1/100; t_shi=temp1%100/10; t_ge=temp1%10; temp1=(T_L&0x0f)*625/100; /不能乘以小数,为什么? t_fen=temp1/10; t_miao=temp1%10; void print(uchar pos,uchar *str) WriteCommand(pos); while(*str!=0) WriteData(*str+); *str=0; */void show_temperature() /uchar i; /lcd_init(); /init(); /dlms(10);/ lcd_wcom(0x01);/ print(0,ds18b20); /指针方式写字符串/ print(0x40,temp); /lcd_pos(0);/ for(i=0;i10;i+) / / lcd_wdat(ds18b20); / dlms(1);/ / lcd_pos(0x40);/ for(i=0;i5;i+)/ / lcd_wdat(temp);/ dlms(1); / lcd_pos(0x4e); /lcd_wdat(0xdf); /lcd_wdat(0x43); /写入单位摄氏度 / ds_read_temperature(); bit T_sign; uchar t_bai,t_shi,t_ge,t_fen,t_miao; uchar T_L=0; uchar T_H=0; uchar k,temp1; while(ds_reset(); ds_writebyte(0xcc); /不是用寄生电源 ds_writebyte(0x44); while(ds_reset(); ds_writebyte(0xcc); ds_writebyte(0xbe); T_L=ds_readbyte(); T_H=ds_readbyte(); k=T_H&0x80; if(k=0x80) T_sign=1; temp1=(T_L+1)&0xf0)/16+(T_H)&0x07)*16; /负数温度是整数取反加一,不知道对不对? t_bai=temp1/100; t_shi=temp1%100/10; t_ge=temp1%10; temp1=(T_L+1)&0x0f)*625/100; t_fen=temp1/10; t_miao=temp1%10; else T_sign=0; temp1=(T_L&0xf0)/16+(T_H&0x0f)*16; t_bai=temp1/100; t_shi=temp1%100/10; t_ge=temp1%10; temp1=(T_L&0x0f)*625/100; /不能乘以小数,为什么? t_fen=temp1/10; t_miao=temp1%10; if(T_sign=1) /零上,写入+ WriteCommand(0xca); WriteData(0x2d); else /零下,写入- WriteCommand(0xca); WriteData(0x2b); /* if(t_bai=0) /如果百位为零,不显示 WriteCommand(0x81); WriteData(0x20); else WriteCommand(0x81); WriteData(t_

温馨提示

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

评论

0/150

提交评论