/*********************************************************************************************
设计: 启蒙电子网
网址: 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温度显示
}
}
文章评论(0条评论)
登录后参与讨论