原创 12864(串行显示时间温度)

2009-3-24 00:32 2114 3 3 分类: MCU/ 嵌入式

/*********************************************************************************************
  设计:    启蒙电子网
  网址:    www.atc51.com
  作者:    豆豆
  程序功能: 128*64LCD电子时钟程序(串行C语言)
  设计时间:2008-09-13
  采用CPU :STC89SC52RC  12MHZ
  采用面板:启蒙电子 LCD/LED显示驱动板
  型号:    QM001
/*********************************************************************************************
        程序更新说明:
  2008年-09-13:驱动128*64LCD(带字库)显示
  2008年-09-14:加上时间显示
/*********************************************************************************************
        跳线说明:PSB---GND
               RST---VCC
/*********************************************************************************************/
//头文件
#include <REG51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include <IIC.h>//iic总线程序
#include "LCD12864.C"//LCD12864液晶显示程序
sbit beep   = P2^2;//扬声器(V2.1程序中将V1.1程序中的蜂鸣器改为扬声器)
/****************************************************************************/
//定义全局变量
unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位
static unsigned char menu = 0;//定义静态小时更新用数据变量
static unsigned char keys = 0;//定义静态小时更新用数据变量
static unsigned char timecount = 0;//定义静态软件计数器变量
/****************************************************************************/
/****************************************************************************/
uchar data temp_buf[2]={0x00,0x00};    /*温度缓冲区*/
int  temmp;
uint  teemp;
uchar data temp_dis[4]={0x00,0x00,0x00,0x00};    /*温度显示缓冲区保留一位小数的温度*/
uint temp_h[2]={0x03,0x00};
/****************************************************************************/
/****************************************************************************/
//IIC地址声明
#define  WC24C02 0xA0             /*定义24C02器件地址*/
#define  PCF8563  0xA2            /*定义PCF8563器件地址*/
#define  LM75A    0x90            /*定义器件地址*/
#define  WRADDR   0x00
#define  RDADDR   0x02
/*******************定义PCF8563相关参数与寄存器*******************************/
  unsigned char PCF8563_W[9]={0x00,0x12,0x48,0x10,0x22,0x14,0x07,0x09,0x08};
 // 控制状态寄存器1、 控制状态寄存器2、秒、分、时、日、星期、月/世纪、年


  unsigned char PCF8563_R[7];           /*读出时间缓冲区*/
  // 秒、分、时、日、星期、月/世纪、年 
  unsigned char PCF8563_N[7];           /*整理后的时间缓冲区*/
  // 秒、分、时、日、星期、月/世纪、年 
/*******************************时间显示缓冲区***********************/
  unsigned char TIME_DIS[14]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//年月星期日时分秒  
/*******************************PCF8563字节拆分程序*******************************/  
//字节拆分
void zf()
{
uchar i,j;
//年
j=i=PCF8563_R[6];
PCF8563_N[6]=j;
i&=0xf0;
i>>=4;
TIME_DIS[0]=i;
i=j;
i&=0x0f;
TIME_DIS[1]=i;


//月
i=PCF8563_R[5];
i&=0x1f;
j=i;
PCF8563_N[5]=j;
i&=0xf0;
i>>=4;
TIME_DIS[2]=i;
i=j;
i&=0x0f;
TIME_DIS[3]=i;


//星期
i=PCF8563_R[4];
i&=0x0f;
j=i;
PCF8563_N[4]=j;
i&=0xf0;
i>>=4;
TIME_DIS[4]=i;
i=j;
i&=0x0f;
TIME_DIS[5]=i;



//日
i=PCF8563_R[3];
i&=0x3f;
j=i;
PCF8563_N[3]=j;
i&=0xf0;
i>>=4;
TIME_DIS[6]=i;
i=j;
i&=0x0f;
TIME_DIS[7]=i;
//时 


i=PCF8563_R[2];
i&=0x3f;
j=i;
PCF8563_N[2]=j;
i&=0xf0;
i>>=4;
TIME_DIS[8]=i;
i=j;
i&=0x0f;
TIME_DIS[9]=i;


//分
i=PCF8563_R[1];
i&=0x7f;
j=i;
PCF8563_N[1]=j;
i&=0xf0;
i>>=4;
TIME_DIS[10]=i;
i=j;
i&=0x0f;
TIME_DIS[11]=i;


//秒
i=PCF8563_R[0];
i&=0x7f;
j=i;
PCF8563_N[0]=j;
i&=0xf0;
i>>=4;
TIME_DIS[12]=i;
i=j;
i&=0x0f;
TIME_DIS[13]=i;

/******************************************************************************/
void Delay(int num){//延时函数
 while(num--) ;
}
/******************************************************************************/
//公历节日数据库表
/******************************************************************************/
void days (viod) {   //公历节日数据库
  lcm_w_test(0,0x98);//在屏幕第四行
//            ----|----------------|
  if ( mo == 0x01 && dd == 0x01 ){ lcm_w_word("Happy New Year!!"); }//1月
  if ( mo == 0x01 && dd == 0x28 ){ lcm_w_word("  世界麻风日    "); }
  
  if ( mo == 0x02 && dd == 0x02 ){ lcm_w_word("  世界湿地日    "); }//2月
  if ( mo == 0x02 && dd == 0x13 ){ lcm_w_word("  明天情人节了  "); }  
  if ( mo == 0x02 && dd == 0x14 ){ lcm_w_word("  今天是情人节  "); }
    
  if ( mo == 0x03 && dd == 0x01 ){ lcm_w_word("  国际海豹日    "); }//3月  
  if ( mo == 0x03 && dd == 0x03 ){ lcm_w_word("  全国爱耳日    "); }  
  if ( mo == 0x03 && dd == 0x08 ){ lcm_w_word("   3.8妇女节    "); }  
  if ( mo == 0x03 && dd == 0x12 ){ lcm_w_word("    植树节      "); }  
  if ( mo == 0x03 && dd == 0x14 ){ lcm_w_word("  国际警察日    "); }  
  if ( mo == 0x03 && dd == 0x15 ){ lcm_w_word("  消费者权益日  "); }  
  if ( mo == 0x03 && dd == 0x17 ){ lcm_w_word("  国际航海日    "); }  
  if ( mo == 0x03 && dd == 0x21 ){ lcm_w_word("  世界森林日    "); }  
  if ( mo == 0x03 && dd == 0x22 ){ lcm_w_word("    世界水日    "); }  
  if ( mo == 0x03 && dd == 0x23 ){ lcm_w_word("  世界气象日    "); }  
  if ( mo == 0x03 && dd == 0x24 ){ lcm_w_word("世界防治结核病日"); }
    
  if ( mo == 0x04 && dd == 0x01 ){ lcm_w_word("愚人节  小心上当"); }//4  
  if ( mo == 0x04 && dd == 0x07 ){ lcm_w_word("  世界卫生日    "); }  
  if ( mo == 0x04 && dd == 0x08 ){ lcm_w_word("    复活节      "); }  
  if ( mo == 0x04 && dd == 0x13 ){ lcm_w_word("  黑色星期五    "); }
    
  if ( mo == 0x05 && dd == 0x01 ){ lcm_w_word("  劳动节  放假  "); }//5  
  if ( mo == 0x05 && dd == 0x04 ){ lcm_w_word("    青年节      "); }  
  if ( mo == 0x05 && dd == 0x08 ){ lcm_w_word("  世界红十字日  "); }  
  if ( mo == 0x05 && dd == 0x12 ){ lcm_w_word("  国际护士节    "); }  
  if ( mo == 0x05 && dd == 0x05 ){ lcm_w_word("近日注意母亲节  "); }  
  if ( mo == 0x05 && dd == 0x15 ){ lcm_w_word("  国际家庭日    "); }
  if ( mo == 0x05 && dd == 0x31 ){ lcm_w_word("  世界无烟日    "); }  
    
  if ( mo == 0x06 && dd == 0x01 ){ lcm_w_word("  国际儿童节    "); }//6
  if ( mo == 0x06 && dd == 0x05 ){ lcm_w_word("  世界环境日    "); }  
  if ( mo == 0x06 && dd == 0x26 ){ lcm_w_word("  国际禁毒日    "); }  
  if ( mo == 0x06 && dd == 0x06 ){ lcm_w_word("  全国爱眼日    "); }  
  if ( mo == 0x06 && dd == 0x13 ){ lcm_w_word("近日注意父亲节  "); }
  if ( mo == 0x06 && dd == 0x15 ){ lcm_w_word("近日注意父亲节  "); }
    
  if ( mo == 0x07 && dd == 0x01 ){ lcm_w_word("香港回归记念日  "); }//7
  if ( mo == 0x07 && dd == 0x07 ){ lcm_w_word("抗日战争记念日  "); }
  if ( mo == 0x07 && dd == 0x11 ){ lcm_w_word("  世界人口日    "); }


  if ( mo == 0x08 && dd == 0x01 ){ lcm_w_word("  八一建军节    "); }//8
  if ( mo == 0x08 && dd == 0x08 ){ lcm_w_word("  中国男子节    "); }
  if ( mo == 0x08 && dd == 0x15 ){ lcm_w_word("抗战胜利记念日  "); }


  if ( mo == 0x09 && dd == 0x10 ){ lcm_w_word("  中国教师节    "); }//9
  if ( mo == 0x09 && dd == 0x18 ){ lcm_w_word("九·一八事变记念"); }
  if ( mo == 0x09 && dd == 0x20 ){ lcm_w_word("  国际爱牙日    "); }
  if ( mo == 0x09 && dd == 0x27 ){ lcm_w_word("  世界旅游日    "); }


  if ( mo == 0x10 && dd == 0x01 ){ lcm_w_word("  中国国庆节    "); }//10
  if ( mo == 0x10 && dd == 0x04 ){ lcm_w_word("  世界动物日    "); }
  if ( mo == 0x10 && dd == 0x24 ){ lcm_w_word("    联合国日    "); }
  if ( mo == 0x10 && dd == 0x12 ){ lcm_w_word("明天国际教师节  "); }
  if ( mo == 0x10 && dd == 0x13 ){ lcm_w_word("  国际教师节    "); }


  if ( mo == 0x11 && dd == 0x10 ){ lcm_w_word("  世界青年节    "); }//11
  if ( mo == 0x11 && dd == 0x17 ){ lcm_w_word("  世界学生节    "); }


  if ( mo == 0x12 && dd == 0x01 ){ lcm_w_word("  世界艾滋病日  "); }//12
  if ( mo == 0x12 && dd == 0x23 ){ lcm_w_word("  明晚平安夜    "); }
  if ( mo == 0x12 && dd == 0x24 ){ lcm_w_word("  今晚平安夜    "); }
  if ( mo == 0x12 && dd == 0x25 ){ lcm_w_word("    圣诞快乐    "); }
  if ( mo == 0x12 && dd == 0x31 ){ lcm_w_word("    明日新年    "); }


  else{//非节日时显示时晨信息
   if ( hh >= 0x04 && hh <  0x06 ){ lcm_w_word("★★__▲▲__凌晨"); }
   if ( hh >= 0x06 && hh <  0x08 ){ lcm_w_word("☆○__▲△__早晨"); }
   if ( hh >= 0x08 && hh <  0x12 ){ lcm_w_word("__●__▲▲__上午"); }
   if ( hh == 0x12)               { lcm_w_word("____▲●▲__中午"); }
   if ( hh >= 0x13 && hh <  0x18 ){ lcm_w_word("__▲▲__●__下午"); }
   if ( hh >= 0x18 && hh <  0x22 ){ lcm_w_word("△▲__●☆__晚上"); }
   if ( hh >= 0x22 && hh <= 0x23 ){ lcm_w_word("△▲__★☆__夜里"); }
   if ( hh >= 0x00 && hh <  0x04 ){ lcm_w_word("__★▲▲★__深夜"); }
  }
}
/*****************************************************************************/
/*****************************************************************************/
//扬声器驱动程序(闹钟音乐)
/*****************************************************************************/ 
void Beep(void){//BELL-扬声器--整点报时
 unsigned char a;//定义变量用于发声的长度设置
 for(a=60;a>0;a--){//第一个声音的长度
  beep = ~beep;//取反扬声器驱动口,以产生音频
  Delay(100);//音调设置延时
 }
 for(a=100;a>0;a--){//同上
  beep = ~beep;
  Delay(80);//
 }
 for(a=100;a>0;a--){//同上
  beep = ~beep;
  Delay(30);//
 }
 beep = 1;//音乐结束后扬声器拉高关闭
}
/*****************************************************************************/
void Beep_set(void){//BELL -扬声器--确定设置
 unsigned char a;//定义变量用于发声的长度设置
 for(a=50;a>0;a--){//第一个声音的长度
  beep = ~beep;//取反扬声器驱动口,以产生音频
  Delay(100);//音调设置延时
 }
 for(a=100;a>0;a--){//同上
  beep = ~beep;
  Delay(50);//
 }
 for(a=50;a>0;a--){//同上
  beep = ~beep;
  Delay(100);//
 }
 beep = 1;//音乐结束后扬声器拉高关闭
}
/*****************************************************************************/
void Beep_key(void){//-扬声器--按键音
 unsigned char a;//定义变量用于发声的长度设置
 for(a=100;a>0;a--){//声音的长度
  beep = ~beep;
  Delay(50);//音调设置延时
 }
 beep = 1;//音乐结束后扬声器拉高关闭
}  
/*****************************************************************************/
/*****************************************************************************/
//电子钟应用层程序设计
/*****************************************************************************/
//向LCM中填写 年 数据
void lcm_w_yy(void){
  yy =PCF8563_N[6];
  lcm_w_test(0,0x83);
  lcm_w_word("20");
  lcm_w_test(0,0x84);
  lcm_w_test(1,(yy/16)+0x30); 
  lcm_w_test(1,yy%16+0x30);
  lcm_w_word("年");
}
/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
  mo = PCF8563_N[5];
  lcm_w_test(0,0x90);
   if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);} //十位消隐
   else{lcm_w_test(1,0x20);}//同上   
  lcm_w_test(1,mo%16+0x30);
  lcm_w_test(0,0x91);
  lcm_w_word("月");
} //}
/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
 unsigned char sel;
 sel= PCF8563_N[4];
 lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)
 if(sel==7)  {lcm_w_word("日");}    //
   if(sel==6)  {lcm_w_word("六");}    //
   if(sel==5)  {lcm_w_word("五");}    //
   if(sel==4)  {lcm_w_word("四");}    //
   if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
   if(sel==2)  {lcm_w_word("二");}    //
   if(sel==1)  {lcm_w_word("一");}    //星期一
 lcm_w_test(0,0x95);
 lcm_w_word("星期");
} //}
/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){


  dd = PCF8563_N[3];
  lcm_w_test(0,0x92);
   if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);} //十位消隐
   else{lcm_w_test(1,0x20);}//同上 
  lcm_w_test(1,dd%16+0x30);
  lcm_w_test(0,0x93);
  lcm_w_word("日  ");
    
} //}
/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
 if(PCF8563_N[2]!= hh){
  hh = PCF8563_N[2];
   if (hh > 0x07 && hh < 0x22 && w == 0){
    Beep();//整点报时音
   }
  }
  lcm_w_test(0,0x88);
  lcm_w_test(1,(hh/16)+0x30);
  lcm_w_test(1,hh%16+0x30);
    
}
/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
 if(PCF8563_N[1] != mm){  
  mm = PCF8563_N[1];
 }
  if(w == 0){    
   days();//节日显示
  }    
 lcm_w_test(0,0x89); 
 lcm_w_test(1,0x3a);   //":"
 lcm_w_test(1,(mm/16)+0x30);
 lcm_w_test(1,mm%16+0x30);
 lcm_w_test(1,0x3a);   //":" 
}
//向LCM中填写 秒 数据
void lcm_w_ss(void){
 if(PCF8563_N[0] != ss){  
  ss = PCF8563_N[0];
 }
  if(w == 0){    
   days();//节日显示
  }    
 lcm_w_test(0,0x8b); 
 lcm_w_test(1,(ss/16)+0x30);
 lcm_w_test(1,ss%16+0x30); 
}
/*****************************************************************************/
//刷新数据
void updata (void){
  lcm_w_mm();//刷新 分
  lcm_w_hh();//刷新 小时
  lcm_w_dd();//刷新 日
  lcm_w_xq();//更新星期值 
  lcm_w_mo();//刷新 月
  lcm_w_yy();//刷新 年
  lcm_w_ss();//刷新 年
}
/******************************************************************************/ 
//////////////////////////////
void temp_adv()
{
 temmp=temp_buf[0];
    temmp<<=3;
 teemp=temp_buf[1];
    teemp>>=5;
 teemp|=temmp;
 teemp*=1.25;   //温度扩大了10倍
 temp_dis[0]=teemp/1000;//温度的百位位
 temp_dis[1]=teemp%1000/100;//温度的十位位
    temp_dis[2]=teemp%100/10;//温度的个位
 temp_dis[3]=teemp%10;//温度的小数点第一位
}
temp_disp()
{
 lcm_w_test(0,0x8d);
 lcm_w_word("T:");//temp_dis[1]
  lcm_w_test(1,(temp_dis[1]%16)+0x30);
  lcm_w_test(1,(temp_dis[2]%16)+0x30);
 lcm_w_word("℃");//temp_dis[1]


}
main()
{
 lcm_init();//初始化液晶显示器
 lcm_clr();//清屏
    ISendStr(PCF8563,WRADDR,PCF8563_W,0x09);//写入当前时间
   Delay(500);
/*
显示说明://第一行:80-87 第三行:88-8F   第二行90-97  第四行 :98-9F
*/
while(1)
{
IRcvStr(PCF8563,RDADDR,PCF8563_R,0x07);//读取时钟
zf();
updata();
///温度显示程序
  IRcvStr(LM75A,0x00,temp_buf,2);//读取温度
  temp_adv();//LM75A温度处理
  temp_disp();//12864温度显示
}


}        

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条