电子万年历最终程序.docx
- 文档编号:18501984
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:39
- 大小:147.91KB
电子万年历最终程序.docx
《电子万年历最终程序.docx》由会员分享,可在线阅读,更多相关《电子万年历最终程序.docx(39页珍藏版)》请在冰点文库上搜索。
电子万年历最终程序
电子万年历的设计
主要功能:
万年历、时钟、温度、闹钟、计算器
2012/6/6
以下程序为main.h文档内的内容。
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRW=P1^0;
sbitRS=P1^1;
sbitE=P1^2;
#defineuint32unsignedlongint
//#defineucharunsignedchar
#defineuint8unsignedint
#defineDataP0//数据端口
sbitSCLK=P1^3;
sbitD1302=P1^4;
sbitRST=P1^5;
//uchartable2[]={"THUFRISATSUNMONTUEWES"};
//sbitDQ=P3^5;
sbitds=P3^5;
sbitLED1=P1^6;
sbitLED2=P1^7;
sbitSetTimer=P3^2;
sbitStarCalculator=P3^3;
sbitKeyOut=P3^6;
sbitKeyLoad=P2^1;
sbitKeyCLK=P2^0;
voiddelayms(uintt);
voiddelayus(uchart);
voiddelay8us();
voidds_writebyte(ucharbyte);
uchards_readbyte();
voidds_read_temperature();
voidprint(ucharpos,uchar*str);
voidds_read_temperature();
voidprint(ucharpos,uchar*str);
voidshow_temperature();
voidDelayUs(ucharus);
voidDelayMs(ucharms);
voidWriteCommand(unsignedcharc);
voidWriteData(unsignedcharc);
voidShowChar(unsignedcharpos,unsignedcharc);
voidShowString(unsignedcharline,char*ptr);
voidInitLcd();
voidWrite_1302_Data(ucharDat);
voidWrite_Set1302(ucharCmd,ucharDat);
ucharRead_1302_Data(void);
ucharRead_Set1302(ucharCmd);
voidInit_DS1302(void);
voidDisplaySecond(ucharx);
voidread_date(void);
voidChangTimer();
ucharRead_Key(void);
unsignedlongRead_HC165(void);
voidcalculator();
以下程序为LCS_1602.c文档内的内容。
#include"main.h"
/******************************************************************/
/*微秒延时函数*/
/******************************************************************/
voidDelayUs(ucharus)//delayus
{
unsignedcharuscnt;
//for(uscnt=us;uscnt>0;uscnt--);/*12MHz频率*/
//while(us--);
uscnt=us>>1;/*12MHz频率*/
while(--uscnt);
}
/******************************************************************/
/*毫秒函数声明*/
/******************************************************************/
voidDelayMs(ucharms)
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
/******************************************************************/
/*写入命令函数*/
/******************************************************************/
voidWriteCommand(unsignedcharc)
{
DelayMs
(2);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
//_nop_();
DelayUs(5);
E=1;
Data=c;
E=0;
DelayUs(5);
}
/******************************************************************/
/*写入数据函数*/
/******************************************************************/
voidWriteData(unsignedcharc)
{
DelayMs
(2);//操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
//_nop_();
DelayUs(5);
E=1;
Data=c;
E=0;
RS=0;
DelayUs(5);
}
/******************************************************************/
/*写入字节函数*/
/******************************************************************/
/*voidShowChar(unsignedcharpos,unsignedcharc)
{
unsignedcharp;
if(pos>=0x10)
p=pos+0xc0;//是第二行则命令代码高4位为0xc
else
p=pos+0x80;//是第二行则命令代码高4位为0x8
WriteCommand(p);//写命令
WriteData(c);//写数据
}*/
/******************************************************************/
/*写入字符串函数*/
/******************************************************************/
/*voidShowString(unsignedcharline,char*ptr)
{
unsignedcharl,i;
l=line<<4;
for(i=0;i<16;i++)
ShowChar(l++,*(ptr+i));//循环显示16个字符
}*/
/******************************************************************/
/*初始化函数*/
/******************************************************************/
voidInitLcd()
{
DelayMs
(1);
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x06);//显示光标移动位置
WriteCommand(0x0c);//显示开及光标设置
WriteCommand(0x01);//显示清屏
}
/*main()
{
InitLcd();
WriteCommand(0x80);
WriteData(0x41);
}*/
以下程序是aj.c文档内的内容。
#include"main.h"
unsignedlongRead_HC165(void)
{
uint32keynum=0,i;
KeyLoad=0;
//delay
(1);
DelayUs(5);
KeyLoad=1;
for(i=0;i<24;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);
}
ucharRead_Key(void)
{
uint32Key;
Key=Read_HC165();
if(Key==0xffffff)return(0);
DelayUs(5);
DelayMs(130);
//keyDelays(10);//去抖
Key=Read_HC165();
if(Key==0xffffff)return(0);
switch(Key){
case0xfffdff:
Key=1;break;
case0xf7ffff:
Key=2;break;
case0xfbffff:
Key=3;break;
case0xfdffff:
Key=4;break;
case0xfeffff:
Key=5;break;
case0xfffeff:
Key=6;break;
case0xefffff:
Key=7;break;
case0xdfffff:
Key=8;break;
case0xbfffff:
Key=9;break;
case0x7fffff:
Key=10;break;
case0xfffffe:
Key=11;break;
case0xffefff:
Key=12;break;
case0xffdfff:
Key=13;break;
case0xffbfff:
Key=14;break;
case0xffff01:
Key=15;break;
case0xff7fff:
Key=16;break;
case0xfff7ff:
Key=17;break;
case0xfffbff:
Key=18;break;
default:
Key=0;break;
}
returnKey;
}
以下程序是clock.c文档内的内容。
#include"main.h"
voidWrite_1302_Data(ucharDat)//写入数据dat
{
uchari;
SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备
DelayUs
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续写8个二进制位数据
{
D1302=Dat&0x01;//取出data的第0位数据写入1302
DelayUs
(2);//稍微等待,使硬件做好准备
SCLK=1;//上升沿写入数据
DelayUs
(2);//稍微等待,使硬件做好准备
SCLK=0;//重新拉低SCLK,形成脉冲
Dat>>=1;//将data的各数据位右移1位,准备写入下一个数据位
}
}
voidWrite_Set1302(ucharCmd,ucharDat)//向cmd中写入数据dat
{
RST=0;//禁止数据传递
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
DelayUs
(2);//稍微等待,使硬件做好准备
Write_1302_Data(Cmd);//写入命令字
Write_1302_Data(Dat);//写数据
SCLK=1;//将时钟电平置于已知状态
RST=0;//禁止数据传递
}
ucharRead_1302_Data(void)//读字节
{
uchari,dat;
DelayUs
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续读8个二进制位数据
{
dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位
if(D1302==1)//如果读出的数据是1
dat|=0x80;//将1取出,写在dat的最高位
SCLK=1;//将SCLK置于高电平,为下降沿读出
DelayUs
(2);//稍微等待
SCLK=0;//拉低SCLK,形成脉冲下降沿
DelayUs
(2);//稍微等待
}
returndat;//将读出的数据返回
}
ucharRead_Set1302(ucharCmd)//在cmd中读取数据
{
uchardat;
RST=0;//拉低RST
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
Write_1302_Data(Cmd);//写入命令字
dat=Read_1302_Data();//读出数据
SCLK=1;//将时钟电平置于已知状态
RST=0;//禁止数据传递
returndat;//将读出的数据返回
}
voidInit_DS1302(void)//1302初始化
{uchark=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)));
}
//时间显示
voidDisplaySecond(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
WriteCommand(0xc7);
WriteData(0x30+i);
WriteData(0x30+j);
}
voidDisplayMinute(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
WriteCommand(0xc4);
WriteData(0x30+i);
WriteData(0x30+j);
WriteData(0x3a);
}
voidDisplayHour(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
WriteCommand(0xc1);
WriteData(0x30+i);
WriteData(0x30+j);
WriteData(0x3a);
}
voidDisplayDay(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
WriteCommand(0x88);
WriteData(0x30+i);
WriteData(0x30+j);
}
voidDisplayMonth(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
WriteCommand(0x85);
WriteData(0x30+i);
WriteData(0x30+j);
WriteData(0x2d);
}
voidDisplayYear(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
WriteCommand(0x80);
WriteData(0x32);
WriteData(0x30);
WriteData(0x30+i);
WriteData(0x30+j);
WriteData(0x2d);
}
voidDisplayWeek(ucharx)
{
uchartable2[]={"MONTUEWESTHUFRISATSUN"};
uchari;
x=x*3;
WriteCommand(0x8c);
for(i=0;i<3;i++)
{
WriteData(table2[x]);
x++;
}
}
//读显程序
voidread_date(void)
{
ucharReadValue,second,minute,hour,day,month,year,week,q;
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;
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);
}
voidChangTimer()
{ucharReadValue,second,minute,hour,day,month,year,week;
ucharkey=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)
{
case11:
WriteCommand(0x01);k=1;WriteCommand(0x85);WriteData(0x59);
WriteData(0x65);WriteData(0x61);WriteData(0x72);
WriteCommand(0xc0);WriteData(0x3d);
while(k){key=Read_Key();
if(key<11&&key>0){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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 万年历 最终 程序