发一个目前功能和性能最全的时钟!

2020-02-04 09:14发布

多种界面可储存切换,AD转换,
红外遥控,农历节气,整点报时或音乐
农历节气和生日,图形温度,和绘
图程序时钟,温度控制和闹钟,
农历查询和背光自动和手动控制集一体的
大程序......................................................
void Baiguang(void){
uint temper;
uchar temper_ge,temper_shi,temper_bai,temper_qai;
temper=DSS()*(10.625);//读取温度
temper_ge=temper%10+0x30;
temper_shi=temper%100/10+0x30;
temper_bai=temper/100+0x30;
temper_qai=temper/1000;
set16162pic(1,2,0,3); //在第1列第2行不反白的显示温度标记标志T和一个小三角
_nop_();
set16162pic(5,2,0,9); //在第5列第2行不反白的显示温度标记标志
_nop_();
//set16162pic(5,3,1,9); //在第5列第3行反白的显示温度标记标志
_nop_();
set16162pic(1,3,1,3); //在第1列第3行反白的显示温度标记标志T和一个小三角
_nop_();
write_12864_cmd(0x30);
if(t/2%2==0) {
dispString(0, 0, 1, "白光烙铁温度控制"); }
else {
dispString(0, 0, 1, "¤加热进程 %..");

write_12864_cmd(0x85);
++th5;
if(th5>100||th5<0)th5=0;
lcm_w_test(1,th5/100+0x30);//
lcm_w_test(1,th5%100/10+0x30);//
lcm_w_test(1,th5%10+0x30);
}
dispString(2, 4, 1, "Tm");
/*--------第二行设定温度的显示————————*/
write_12864_cmd(0x91);

lcm_w_word(" ");
lcm_w_test(1,th/100+0x30);//
lcm_w_test(1,th%100/10+0x30);//
lcm_w_test(1,th%10+0x30);//
lcm_w_word("℃");
/*--------第三行左边烙铁温度的显示————————*/
write_12864_cmd(0x89);
lcm_w_word(" ");
lcm_w_test(1,th1+0x30);//
lcm_w_test(1,th2+0x30);//
lcm_w_test(1,th3+0x30);//
lcm_w_word("℃");
/*--------第三行右边时分的显示————————*/
read_clockS();
write_12864_cmd(0x98);
lcm_w_test(1,mo/16+0x30);
lcm_w_test(1,mo%16+0x30);
lcm_w_word("月");
lcm_w_test(1,days/16+0x30);
lcm_w_test(1,days%16+0x30);
lcm_w_word("日");
lcm_w_test(1,hh/16+0x30);
lcm_w_test(1,hh%16+0x30);
m = read_clock(0x81)&0x01;//冒号":"以秒闪烁
if(m == 1){//秒点闪烁
lcm_w_word(":");
}else{lcm_w_word(" ");}
lcm_w_test(1,mm/16+0x30);
lcm_w_test(1,mm%16+0x30);
if(m == 1){//秒点闪烁
lcm_w_word(":");
}else{lcm_w_word(" ");}
lcm_w_test(1,ss/16+0x30);
lcm_w_test(1,ss%16+0x30);
//*********小于于0C时的温度处理******************
if(DSS < 0)
{write_12864_cmd(0x9c);
lcm_w_word(" -");
}
else
//*********大于100C时的温度处理******************
{ if(temper_qai==0x01) {
temper_bai=temper%1000/100+0x30; //取除以1000的余数再除100
temper_shi=temper%1000%100/10+0x30;
temper_ge=temper%1000%100%10+0x30;
write_12864_cmd(0x95);
write_data(0x31);
write_data(temper_bai);
write_data(temper_shi);
write_data('.');
write_data(temper_ge);
write_data(0x43);
write_12864_cmd(0x36);}
}
//*********小于于100C时的温度处理******************
if(temper_qai==0x00) {
write_12864_cmd(0x95);
write_data(temper_bai);
write_data(temper_shi);
write_data('.');
write_data(temper_ge);
lcm_w_word("℃");
write_12864_cmd(0x36);}
}
/*---------12864LCD---------------*/
/*
第一行0X80-0X81-0X82-0X83-0X84-0X85-0X86-0X87
第三行0X88-0X89-0X8A-0X8B-0X8C-0X8D-0X8E-0X8F
第二行0X90-0X91-0X92-0X93-0X94-0X95-0X96-0X97
第四行0X98-0X99-0X9A-0X9B-0X9C-0X9D-0X9E-0X9F
-------1----2----3----4----5----6----7----8--
/*********************************************************************************************
函数名:校时处理程序
调 用:CK();
参 数:无
返回值:无
结 果:在00时00分30秒时进行时间校准,加/减一定时间作为补偿。
备 注:校时程序用RAM,0xFA用于存放加或减(1/0),0XFC用于存放加减的秒数(0~20秒)
/**********************************************************************************************/
void CK (void){ // write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
unsigned char cktemp;
cktemp=read_clock(0xfd);
/***********让减秒操作过了时间段才恢复标记,才能始校时不重复操作*****************************/
if((read_clock(0x85)==0)&&(read_clock(0x83)==0x01)&&(read_clock(0x81)==0)){//凌晨0点1分0秒时恢复
CKTIME_1=0; //为下一天校时恢复标记
}
if((read_clock(0x85)==0)&&(read_clock(0x83)==0)&&(read_clock(0x81)==0x30)&&CKTIME_1==0){//凌晨3点0分30秒时校正
if( read_clock(0xFB) == 1){ //减调整
write_clock(0x8e,0x00);//允许写操作
write_clock(0x80,0x30+cktemp);//对秒进行调整。26-temp:让本来+2.+1.+0.-25.-24...变成+2.+1.+0.-1.-2...
write_clock(0x8e,0x80);//禁止写操作
Beep_key();//按键音
CKTIME_1=1;
}
if( read_clock(0xFB) == 0){ //减调整
write_clock(0x8e,0x00);//允许写操作
write_clock(0x80,0x30-cktemp);//对秒进行调整
write_clock(0x8e,0x80);//禁止写操作
CKTIME_1=1;
}
}
}
/*------------------------外部中断0程序-------------------------*/
/*--------- interrupt 0外部中断0
interrupt 1定时器0
interrupt 2外部中断1
interrupt 3定时器1
interrupt 4串口中断 */
void LCDLOGO(void) {
unsigned char InitLine;
Beep(); //扬声器--开机音
lcm_init(); //初始化液晶显示器
CH_L(); //渐暗+清屏
dispString(0, 0, 100, "欢迎使用智能时钟");
dispString(1, 0, 100, " STC12C5A60S2 ");
dispString(2, 1, 100, "请稍等片刻");
dispString(3, 0, 100, "系统启动中......");
CH_H(); //渐亮
for (InitLine = 0; InitLine < 17; InitLine++)
{convertChar(3, 0, InitLine);DELAY_MS(3);} //显示等留3秒
Beep(); //扬声器--开机音
CH_L(); //渐暗+清屏
dispString(0, 0, 100, "●PMW 调光+ 闹钟");
dispString(1, 0, 100, "农历+ 节日+ 生日");
dispString(2, 0, 100, "△整点报时+ 音乐");
dispString(3, 0, 100, "△多种界面切换..");
CH_H(); //渐亮
for (InitLine = 0; InitLine < 17; InitLine++)
{convertChar(0, 0, InitLine);DELAY_MS(230);} //显示等留3秒
/*---------------------------------*/
for (InitLine = 0; InitLine < 17; InitLine++)
{convertChar(1, 0, InitLine);DELAY_MS(230); }//显示等留3秒
/*----------------------------------*/
for (InitLine = 0; InitLine < 17; InitLine++)
{convertChar(2, 0, InitLine);DELAY_MS(230);} //显示等留3秒
/*-----------------------------------*/
for (InitLine = 0; InitLine < 17; InitLine++)
{convertChar(3, 0, InitLine);DELAY_MS(230);} //显示等留3秒
Beep(); //扬声器--开机音
CH_L(); //渐暗+清屏
/*---------1-----------------------------------------*/
dispString(0, 0, 1, "┏━━━━━━┓");
dispString(1, 0, 1, "┃文杰工作室--┃");
dispString(2, 0, 1, "┃ WELL**COME ┃");
dispString(3, 0, 1, "┗━━━━━━┛");
CH_H(); //渐亮
DELAY_MS(300); //显示等留3秒
Beep(); //扬声器--开机音
lcm_clr();//清屏
Disp_Img(TU_TAB1); //显示一幅图片(我的电脑)
CH_H(); //渐亮
DELAY_MS(300); //显示等留3秒
InitialSound(); //唱歌文件初始化
Beep_al(); //扬声器--闹钟
Play(Music_lz,0,3,360);
CH_H(); //渐亮
Beep(); //扬声器--开机音
lcm_clr(); //清屏
Disp_Img(BMP11); //显示一幅图片(龙的图案) buffer
CH_H(); //渐亮
DELAY_MS(300); //显示等留3秒
Beep(); //扬声器--开机音
lcm_clr();//清屏
Disp_Img(tab5); //显示一幅图片(公鸡图案) buffer
CH_H(); //渐亮
DELAY_MS(300); //显示等留3秒
Beep(); //扬声器--开机音
lcm_clr();//清屏
Disp_Img(Photo2); //显示一幅图片(我的QQ图案) buffer
CH_H(); //渐亮
DELAY_MS(500); //显示等留3秒
lcm_clr();//清屏
lcm_w_word("出品于文杰工作室 欢迎使用 FutureTimer4 LiWenJie&&Home ");//
//------|-------1-------|-------------|-----2--------|-------4-------|----//尺
CH_H(); //渐亮
DELAY_MS(200); //显示等留3秒
Beep_set();//扬声器--确定设置
Play(Music_wo,0,3,360);
/*--------------3---------------------------------*/
lcm_clr();//清屏
displayPhoto(powerOnPhoto, 0);
DELAY_MS(300); //显示等留3秒
lcm_clr();//清屏
lcm_w_word(" 精确时钟 分享每一分钟 V8.003 * 按住任意键校时");//
//------|-------1-------|-------3-------|-------2---|-------4-------|-----//标尺
CH_H(); //渐亮
DELAY_MS(200); //显示等留3秒
Beep_key(); //扬声器--按键音
/*-----------------------------------------------*/
// Timer_init(); //中断初始化一下
}

/*显示模式3的界面*/
/*********特大号时钟界面*************************************************/
void dis_mode3int(void)
{
uchar i,j,h,l,x_0=0x80,y_0=0x90;
hh=read_clock(0x85);
h=hh>>4; // 分离十位 个位
l=hh&0x0f;
for(j=0;j<2;j++)
{ for(i=0;i<32;i++) // 十位个位一起读入
{ wr_lcd(0,0x34);
wr_lcd(0,y_0++);
wr_lcd(0,x_0);
wr_lcd(0,0x30);
wr_lcd(1,mode_3num[h][i*3]); // 连续写数据,X坐标自动加1
wr_lcd(1,mode_3num[h][i*3+1]);
wr_lcd(1,mode_3num[h][i*3+2]);
wr_lcd(1,mode_3num[l][i*3]);
wr_lcd(1,mode_3num[l][i*3+1]);
wr_lcd(1,mode_3num[l][i*3+2]);
if(y_0==0xa0){x_0=x_0+8;y_0=0x80;}
}
x_0=0x84,y_0=0x90;
mm=read_clock(0x83);
h=mm>>4; // 分离十位 个位
l=mm&0x0f;}
}

// 模式3向LCM中填写 秒 数据
void disSecond2(void)
{ char second[3];
read_clockS();
write_12864_cmd(0x30);
second[0]=ss/16+0x30;
second[1]=ss%16+0x30;
second[2]='';
dispS2tring(2,7,second);
if(read_clock(0xc7) == 1){
set16162pic(8,2,0,0);} //在第8列第2行不反白的显示喇叭标记
else if(read_clock(0xc7) == 0) //没闹钟时在标记处写入空白
dispString(1, 1, 1, " ");
write_12864_cmd(0x36);
if(t/1%2==0)
{display(3,11);}
else
{display(3,10);}
}
/*显示模式3的界面*/
void dis_mode3(void)
{ write_12864_cmd(0x30);
Tempuer_sfm(); //温度显示和图片时钟共用
set16162pic(4,4,0,3);} //在第4列第4行不反白的显示温度标记

/****在界面6LCD12864的第三行写入农历信息**************************************************/
void displcd128D()
{ dispS2tring(3,2,"农历");
lcmnongli();}

void disDate()
{ char dateBuff[9];
read_clockS();

xinq =read_clock(0x8b);
dateBuff[0]=yy/16+0x30;
dateBuff[1]=yy%16+0x30;
dateBuff[2]=0x2f;
dateBuff[3]=mo/16+0x30;
dateBuff[4]=mo%16+0x30;
dateBuff[5]=0x2f;
dateBuff[6]=days/16+0x30;
dateBuff[7]=days%16+0x30;
dateBuff[8]='';
dispS2tring(0,2,dateBuff);//写入月日信息
Conver_week(0,yy,mo,days);//调用公历换算星期子函数
//seweek=week;//week是公历转换星期子函数的运行结果,结果为0-6,0是星期日
switch(week) //第一行6--7列写入周几即星期X
{
case 1:dispS2tring(0,6,"周一");break;
case 2:dispS2tring(0,6,"周二");break;
case 3:dispS2tring(0,6,"周三");break;
case 4:dispS2tring(0,6,"周四");break;
case 5:dispS2tring(0,6,"周五");break;
case 6:dispS2tring(0,6,"周六");break;
case 7:dispS2tring(0,6,"周日");break;
}}
// 向LCM中填写 秒 数据
void disSecond(void)
{ char second[3];
second[0]=ss/16+0x30;
second[1]=ss%16+0x30;
second[2]='';
dispS2tring(2,7,second);
displcd128D(); //更新农历
disDate(); //更新日期
if(read_clock(0xc7) == 1){
set16162pic(8,2,0,0);}//在第8列第2行不反白的显示喇叭标记
else if(read_clock(0xc7) == 0) //没闹钟时在标记处写入空白
dispString(1, 1, 1, " ");
write_12864_cmd(0x36);
if(t/1%2==0)
{display(4,11);}
else
{display(4,10);}
}
//向LCM中填写 时&分 数据
void disHaMint(void)
{ mm = read_clock(0x83);//读取分,只要有改变液晶显示也改变
if(min_temp!=mm)
{min_temp=mm;
Dispdeal(mm); //处理一下分的个位和十位
display(5,shi);
display(6,ge);}
hh = read_clock(0x85);//读取小时,只要有改变液晶显示也改变
if(hour_temp!=hh)
{hour_temp=hh;
Dispdeal(hh); //处理一下时的个位和十位
display(2,shi);
display(3,ge);
}
}
void disTemint(void)
{
uchar j;
uchar dat1,dat2,dat3,dat4;
//温度柱状显示和横线刻度显示

for(j=0;j<32;j++)
{ dat1=wendu1[j*2];
dat2=wendu1[j*2+1];
if(temperature+j==62) dat1|=0x07;
if(temperature+j >62) dat1|=0x02;
dispLine(0,j,dat1,dat2);
}
for(j=0;j<32;j++)
{ dat1=wendu1[j*2+64];
dat2=wendu1[j*2+65];
if(temperature+j==30) dat1|=0x07;
if(temperature+j >30) dat1|=0x02;
dispLine(8,j,dat1,dat2);}

//数字刻度显示和温度个位显示
if(temperature>=20) //温度为零上
{
for(j=0;j<32;j++)
{
dat3=wendu2[j*2];
dat4=wendu2[j*2+1];
switch(temperature+j)
{
case 60: dat4|=wendu3[temperature%10][0];break;
case 61: dat4|=wendu3[temperature%10][1];break;
case 62: dat4|=wendu3[temperature%10][2];break;
case 63: dat4|=wendu3[temperature%10][3];break;
case 64: dat4|=wendu3[temperature%10][4];break;
}
dispLine(1,j,dat3,dat4);
}
for(j=0;j<32;j++)
{
dat3=wendu2[j*2+64];
dat4=wendu2[j*2+65];
switch(temperature+j)
{
case 30: dat4|=wendu3[temperature%10][0];break;
case 31: dat4|=wendu3[temperature%10][1];break;
case 32: dat4|=wendu3[temperature%10][2];break;
case 33: dat4|=wendu3[temperature%10][3];break;
case 34: dat4|=wendu3[temperature%10][4];break;
}
dispLine(9,j,dat3,dat4);
}
}
else //温度为零下
{
temperature=0x14-temperature;
for(j=0;j<32;j++)
{
dat3=wendu2[j*2];
dat4=wendu2[j*2+1];
dispLine(1,j,dat3,dat4);
}
for(j=0;j<32;j++)
{
dat3=wendu2[j*2+64];
dat4=wendu2[j*2+65];
switch(j-temperature)
{
case 8: dat4|=wendu3[temperature%10][0];break;
case 9: dat4|=wendu3[temperature%10][1];break;
case 10: dat4|=wendu3[temperature%10][2];break;
case 11: dat4|=wendu3[temperature%10][3];break;
case 12: dat4|=wendu3[temperature%10][4];break;
}
dispLine(9,j,dat3,dat4);
}}}

void disTem(void)
{if(temperature == (DSS()*10.625)/10+0x14) return ;
temperature=(( DSS()*10.625)/10+0x14); //实际温度加20°
//温度柱状显示和横线刻度显示
disTemint();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
lee345
1楼-- · 2020-02-05 06:35
是啊,如果有图的话效果更加好
电子蔡鸟
2楼-- · 2020-02-05 08:09
上个图看看,正想做个闹钟,最近手机神神的,调了闹钟不响,今天又不响了,本来9点上班的,睡到9点才起床,干脆今天早上休个年假,现在在家想在淘宝上买个复古的闹钟,谁知道那复古的闹钟只有整点报时功能,卖家叫我买LED那些,我想了想,买LED的还不如自己做一个,所以正好用得上,哈哈。。。
liuhengpeng123
3楼-- · 2020-02-05 11:03
无图无真相,嘿嘿
xi2051
4楼-- · 2020-02-05 12:35
非常需要,谢谢。
BXAK
5楼-- · 2020-02-05 15:39
 精彩回答 2  元偷偷看……
terribilis
6楼-- · 2020-02-05 21:00
要加GPS自动对时,才算功能最全

一周热门 更多>