找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3178|回复: 2
打印 上一主题 下一主题
收起左侧

怎么把万年历程序中加农历?

[复制链接]
跳转到指定楼层
楼主
ID:79561 发表于 2015-6-1 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*------------LCD12864相关声明-----------------------------*/
#define com 0
#define dat 1
sbit cs =P1^0;
sbit sid=P1^1;
sbit sck=P1^2;
uchar code TAB1[]={"电字钟Q154938862"};//第一行初始化
uchar code TAB2[]={"20 年 月 日"}; //第二行
uchar code TAB3[]={"星期    :   : "}; //第三行
uchar code TAB4[]={"室温:       ℃"}; //第四行
/*----------------------DS1302相关声明-------------------------*/
char TAB_1302[]={ 0x00,0x29,0x02,       //秒:分:时
   0x18,0x06,0x06,0x08}; //日:月:星期:年
uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302数字日期转换为中文字符
sbit T_CLK=P2^2; /* 实时时钟的时钟线引脚*/
sbit T_IO=P2^1;   /* 实时时钟的数据线*/
sbit T_RST=P2^0; /* 实时时钟的复位线引脚*/
uchar bdata datbyte;
sbit datbyte0=datbyte^0;
sbit datbyte7=datbyte^7;
/*--------------18B20相关声明-------------------------------*/
uchar dis1[16];
sbit    DQ=P1^0;    /*DS18B20温度检测*/
/*----------键盘相关声明-------------------------------------*/
sbit key=P0^0;     //功能键
sbit key1=P0^1;     //只有加1键
uchar sum,keyflag=0;   //调用时,分,秒,标志,调用键盘处理标志.
/*--------------以下为LCD12864相关函数--------------------------*/
/**************************************************************
函数名称:void delay1ms(uint x)
函数功能: 延时1MS
***************************************************************/
void delay1ms(uint x)
{
uint i,j;
for(i=0;i<x;i++)   
for(j=0;j<120;j++);
}
/**************************************************************
函数名称:void w_12864byte(uchar byte)
函数功能: 写字节  
*************************************************************/
void w_12864byte(uchar byte)
{
  uchar i;
  for(i=0;i<8;i++)
  {   
   sck=0;  
   byte<<=1;   
   sid=CY;   
   sck=1;
  }
}
/**************************************************************
函数名称:uchar r_12864byte(void)
函数功能: 读字节
***************************************************************/
uchar r_12864byte(void)
{      
  uchar i,temp1,temp2;
  temp1 = 0;      
  temp2 = 0;      
  for(i=0;i<8;i++)
{            
  temp1=temp1<<1;            
  sck = 0;            
  sck = 1;                        
  sck = 0;            
  if(sid) temp1++;      
}
for(i=0;i<8;i++)      
{            
    temp2=temp2<<1;            
    sck = 0;            
    sck = 1;                       
    sck = 0;            
    if(sid) temp2++;      
}           
return ((0xf0&temp1)+(0x0f&temp2));
}
/**************************************************************
函数名称:void c_12864busy( void )
函数功能: 检测忙函数
**************************************************************/
void c_12864busy( void )
{
do      
  w_12864byte(0xfc);      //11111,RW(1),RS(0),0
  while(0x80&r_12864byte());  
}
/**************************************************************
函数名称:void w_12864(bit dat_com,uchar byt)
函数功能: 写入函数
***************************************************************/
void w_12864(bit dat_com,uchar byt)
{  
uchar temp;
if(dat_com==0) //为零,写入指令   
temp=0xf8; //11111,RS(0),RW(0),0
else    //否则,写入数据   
temp=0xfa; //11111,RS(1),RW(0),0
cs=1;
c_12864busy();
w_12864byte(temp);  
w_12864byte(byt&0xf0); //写入高四位
w_12864byte(byt<<4);   //写入低四位
cs=0;
}
/**************************************************************
函数名称:void init_12864(void)
函数功能:初始化12864  
***************************************************************/
void init_12864(void)
{  
w_12864(com,0x30); //基本指令功能.  
w_12864(com,0x0c); //显示打开,关光标,反白关.
w_12864(com,0x01); //清屏指令.
w_12864(com,0x06); //AC自动加一
}
/*----------------以下为DS1302相关函数-------------------------*/
/**************************************************************
函数名称:void w_1302byte(uchar date)
函数功能:写一个字节(上升沿)  
***************************************************************/
void w_1302byte(uchar date)
{ uchar i;   
datbyte=date;
for(i=0;i<8;i++)
{ T_IO=datbyte0; //写最低位  
  T_CLK=0;  
  T_CLK=1;  
  datbyte>>=1;
}
}
/************************************************************** 函数名称:uchar r_1302byte(void) 函数功能:读一个字节(下降沿)  ***************************************************************/
uchar r_1302byte(void)
{ uchar i;
  datbyte=0;
  for(i=0;i<8;i++)  
{ datbyte7=T_IO; //读最低位  
  T_CLK=1;  
  T_CLK=0;  
  datbyte>>=1;
}  
return(datbyte);
}
/*************************************************************** 函数名称:void write_1302(uchar addr,uchar date) 函数功能: 指定位置写数据  ****************************************************************/
void write_1302(uchar addr,uchar date)
{ T_RST=0;
T_CLK=0;
T_RST=1;
w_1302byte(addr);
w_1302byte(date);
T_CLK=0;
T_RST=0;
}
/**************************************************************函数名称:uchar read_1302(uchar addr) 函数功能: 指定位置读数据  ****************************************************************/
uchar read_1302(uchar addr)
{ uchar dat1,dat2,temp;     
T_RST=0;
T_CLK=0;
T_RST=1;
w_1302byte(addr);
temp=r_1302byte();
T_RST=0;
T_CLK=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return(temp);
}
/*************************************************************** 函数名称:void init_1302(void) 函数功能: 初始化  *****************************************************************/
void init_1302(void)
{ uchar i;
uchar addr=0x80;
write_1302(0x8e,0x00);
for(i=0;i<7;i++)
{   
   write_1302(addr,TAB_1302[i]);
   addr+=2;
}  
  write_1302(0x8e,0x80);
}
/**************************************************************** 函数名称:void get_1302(void)      功能说明:读取DS1302时钟信息.*****************************************************************/
void get_1302(void)
{ uchar i,addr=0x81;
for(i=0;i<7;i++)
  { TAB_1302[i]=read_1302(addr);      
    addr+=2;
   }
}
/*---------------以下为18B20相关函数-----------------------------*/
/****************************************************************** 函数名称:void delay (uint x)       功能说明:若机器周期为1us,则本延时程序为延时 4*x(us)  ******************************************************************/
void delay (uint x) //本板延时8us
{  
  while (--x);
  }
/***************************************************************** 函数名称:uchar bus_rest(void)       功能说明:产生单总线系统信号的总线复位信号,并返回 总线上是否存在单总线器件信息   ******************************************************************/
uchar bus_rest(void)
{  uchar presence;
  DQ=0;    //将DQ信号线拉低
  delay(29);   //持续48US
  DQ=1;    //释放总线
  delay(3);   //等待从设备将总线拉低
  presence=DQ; //保存当前总线状态
  delay(25);    //等待总线初始化过程结束
  return presence;//返回是否有从设备将总线拉低   
}
/**************************************************************** 函数名称:uchar r_1820BYTE(void)      功能说明:向单总线读取一个数据字节   *****************************************************************/
uchar r_1820BYTE(void)
{  uchar i=0;
   uchar date = 0;
   for (i=8;i>0;i--)
   {     DQ = 0;    // 将DQ信号线拉低启动读时隙  
         DQ=1;// 释放总线,等待从机动车辆返回数据位   
         delay(1); //越接近15us越好; 准备采样总线上的信号   
         date>>=1;  
         if (DQ)   
         date=date|0x80;   
         delay(6);   
   }  
   return(date);
   }
/***************************************************************** 函数名称:void w_1280Byte(uchar bytevalue)      功能说明:向单总线写一个数据字节   ******************************************************************/
void w_1280Byte(uchar bytevalue)
{            
uchar i;
for(i=0;i<8;i++)
{         
DQ=0; // 将DQ信号线拉低启动读时隙
DQ=bytevalue&0x01;   //   
delay(5);//等待写时隙结束   
DQ=1; //释放   
bytevalue>>=1;  
}
delay(5); //等待写时隙结束
}
/***************************************************************** 函数名称:uint read_T(void)      功能说明:读取1820温度   *******************************************************************/
uint read_T(void)
{  uchar a=0;
uchar b=0;
uint t=0;
bus_rest();  
w_1280Byte(0xCC); // 跳过读序号列号的操作 ;
w_1280Byte(0x44); // 启动温度转换,模数转化;
bus_rest();         
w_1280Byte(0xCC); //跳过读序号列号的操作 ;  
w_1280Byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 ;
a=r_1820BYTE();// 低8位
b=r_1820BYTE();// 高8位
t=(b*256)+a;
return(t);  
}
/************************************************************** 函数名称:void show_T(uint temp) 函数功能:显示温度  **************************************************************/
void show_T(uint temp)
{ int i;
float ftemp;  
ftemp = temp* 0.0625;  
sprintf(dis1,"%f",ftemp);//把温度值写入数组内存     
w_12864(com,0x98+3);
for(i=0;i<5;i++)      
w_12864(dat,dis1[i]); //写入温度
}
/*---------------以下为显示相关函数--------------------------*/
/******************************  函数名称: void fenli(uchar x,uchar y,uchar val) 功能描述: 指定位置写入数据 ********************************/
void fenli(uchar x,uchar y,uchar val)
{ uchar ge,shi,addr,i=0;  
  if(val==5)//这里把星期数字显示的转换为中文
{      
w_12864(com,0x88+2);   
for(i=0;i<2;i++)   
{ //一个汉字写两次      
if(TAB_1302[5]==0)w_12864(dat,TAB_XQ[i]);      
if(TAB_1302[5]==1)w_12864(dat,TAB_XQ[2+i]); //      
if(TAB_1302[5]==2)w_12864(dat,TAB_XQ[3+i]); //!!??星期三显示没规律,不知咋回事.     
if(TAB_1302[5]==3)w_12864(dat,TAB_XQ[5+i]);     
if(TAB_1302[5]==4)w_12864(dat,TAB_XQ[7+i]);     
if(TAB_1302[5]==5)w_12864(dat,TAB_XQ[9+i]);     
if(TAB_1302[5]==6)w_12864(dat,TAB_XQ[11+i]);     
}
}
else {      
shi=TAB_1302[val]/10;//分离十位   
ge=TAB_1302[val]%10;   
if(x==1)x=0x80;   
if(x==2)x=0x90;   
if(x==3)x=0x88;   
if(x==4)x=0x98;   
addr=x+y;     
w_12864(com,addr);//指定位置   
w_12864(dat,0x30+shi);//写入   
w_12864(dat,0x30+ge);
}
}  
/************************************************************* 函数名称:void display(void) 功能描述: 显示函数  **************************************************************/
void display(void)
{
//uchar month,year,day;
get_1302();    //读1302
fenli(3,7,0);     //读秒
fenli(3,5,1);   //读分
fenli(3,3,2);   //读时
fenli(2,5,3);   //读日
fenli(2,3,4);   //读月
fenli(3,2,5);   //读星期
fenli(2,1,6);   //读年
//month=fenli(2,3,4);
//year=fenli(2,1,6);
//day=fenli(2,5,3);
//conversion(year,month,day);

}
/*---------------按键处理相关函数--------------------------*/  
/************************************************************ 函数名称:void scanner() 功能描述: 按键函数  *************************************************************/
void scanner()
{ uchar i,j;   
if(!key)     //功能键按下  
{ delay1ms(500);    //延时500MS   
if(!key)    //还按下,退出时间调整   
{ keyflag=0;   //标志位为0     
sum=0;    //清0      
w_12864(com,0x0c);//清闪烁     
for(i=0;i<7;i++)//十进制转十六进制     
{ j=TAB_1302[i]/10;           
TAB_1302[i]=TAB_1302[i]%10;         
TAB_1302[i]=TAB_1302[i]+16*j;     
}      
init_1302(); //写入1302     
while(!key); //等待释放
delay1ms(10);   //延时消抖   
}     
else     //500MS内放开     
{ keyflag=1;   //标志为1,进行时间调整     
sum++;    //功能键加1     
if(sum==8)        
sum=0;     
switch(sum)     
{ case 1:   //            
{ w_12864(com,0x98+7);      
w_12864(com,0x0f);      
break;      
}      
case 2:   //为2,年闪烁      
w_12864(com,0x90+1);      
break;      
case 3:   //月闪烁      
w_12864(com,0x90+3);        
break;      
case 4:   //日闪烁      
w_12864(com,0x90+5);        
break;      
case 5:   //星期闪烁      
w_12864(com,0x88+2);      
break;      
case 6:   //分闪烁      
w_12864(com,0x88+5);         
break;      
case 7:   //时闪烁      
w_12864(com,0x88+3);      
break;     
  }   
  }
}  
if(sum)      //功能键按下
{        
  if(!key1)   
{ delay1ms(10);   
  if(!key1)     
{ while(!key1);//等待加1键释放   
  delay1ms(10);   
  if(sum==1)     
  { //备用      }      
   if(sum==2)   
  { TAB_1302[6]++;     
  if(TAB_1302[6]==100)      
  TAB_1302[6]=0;      
  fenli(2,1,6);        
  w_12864(com,0x90+1);//闪烁归位   
  }     
  if(sum==3)
  { TAB_1302[4]++;      
  if(TAB_1302[4]==13)        
  TAB_1302[4]=1;      
  fenli(2,3,4);      
  w_12864(com,0x90+3);     
  }      
  if(sum==4)     
  {TAB_1302[3]++;     
  if(TAB_1302[3]==32)      
  TAB_1302[3]=1;     
  fenli(2,5,3);      
  w_12864(com,0x90+5);   
  }
   if(sum==5)     
  {TAB_1302[5]++;      
  if(TAB_1302[5]==7)      
  TAB_1302[5]=0;     
  fenli(3,2,5);
  w_12864(com,0x88+2);   
  }      
  if(sum==6)   
  { TAB_1302[1]++;     
  if(TAB_1302[1]==60)      
  TAB_1302[1]=0;     
  fenli(3,5,1);      
  w_12864(com,0x88+5);     
  }
  if(sum==7)     
  {TAB_1302[2]++;      
  if(TAB_1302[2]==24)      
  TAB_1302[2]=0;     
  fenli(3,3,2);      
  w_12864(com,0x88+3);   
  }   
}   
}
}
}
}
//=============================================================
void init(void)
{
uchar i;
init_12864();
init_1302();   
while(TAB1[i]!='\0')
{   
  w_12864(dat,TAB1[i]);   
  i++;
}
i=0;      
w_12864(com,0x90);
while(TAB2[i]!='\0')
{   
w_12864(dat,TAB2[i]);   
i++;
}
i=0;      
w_12864(com,0x88);
while(TAB3[i]!='\0')
{     
w_12864(dat,TAB3[i]);   
i++;
}
i=0;      
w_12864(com,0x98);
while(TAB4[i]!='\0')
{     
w_12864(dat,TAB4[i]);   
i++;
}
}
/************************************************************* 函数名称:主函数  函数功能:  **************************************************************/
void main()
{  
init();
while(1)
{   
scanner();    //检测键盘     
if(!keyflag)   //标志为0   
{ display();   //调用显示     
show_T(read_T()); //显示温度     
delay1ms(500);   
}
}
}  
         
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:81806 发表于 2015-6-2 10:15 | 只看该作者
不错哦
回复

使用道具 举报

板凳
ID:1 发表于 2015-6-4 02:12 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表