📄 5.c
字号:
write_1302_reg(add,timeBCD[i]); //将时间数据写入1302对应的寄存器
add+=2; //地址移动,确保地址为偶数
}
write_1302_reg(0x8e,0x80); //允许写
}
/*================================================================= =*/
/* 读取当前时间 */
/*======================= ===========================================*/
void read_1302_time(unsigned char time[])
{
unsigned char i;
unsigned char add=0x81; //设置地址add初值(秒),奇数为只读
bdata unsigned char l,h; //单位变量,分别存放时间数据(8421BCD码)的低4位和高4位,用以进行十进制转换
write_1302_reg(0x8e,0x00); //禁止写
for(i=0;i<7;i++)
{
time[i]=read_1302_reg(add); //将时间数据(8421BCD码)从1302对应的寄存器中读出
l=time[i]&0x0f; //l存放time的低4位,即个位
h=(time[i]>>4)&0x0f; //h存放time的高4位,即十位
time[i]=h*10+l; //时间数据以十进制形式放进time[i]中
add+=2; //地址移动,确保地址为奇数
}
}
/*======================================================================================*/
/* 启动/停止计时,gate=0时启动计时,gate!=0时停止计时 */
/*=====================================================================================*/
void on_off_1302(unsigned char ch)
{
unsigned char temp;
if(ch)
{
temp=read_1302_reg(0x80); //将秒当前值读入temp暂存
temp=temp|0x80; //将秒数据最高位置1
write_1302_reg(0x80,temp); //将置1后的秒数据写入秒寄存器,以定止计时
}
else
{
temp=read_1302_reg(0x80); //将秒当前值读入temp暂存
temp=temp&0x80; //将秒数据最高位置0
write_1302_reg(0x80,temp); //将最高位置0后的秒数据写入秒寄存器,以启动计时
}
}
/*=====================================================================================*/
/* 时间显示方式设置,ch=0时为24小时格式,ch!=0时为12小时格式 */
/*=========================================================================================*/
void hour_mode_1302(unsigned char ch)
{
unsigned char temp;
if(ch)
{
temp=read_1302_reg(0x85); //将小时当前值读入temp暂存
temp=temp|0x80; //将小时数据最高位置1
write_1302_reg(0x84,temp); //将置1后的小时数据写入小时寄存器,变为12小时格式
}
else
{
temp=read_1302_reg(0x85); //将小时当前值读入temp暂存
temp=temp&0x80; //将小时数据最高位置0
write_1302_reg(0x84,temp); //将最高位置0后的小时数据写入小时寄存器,变为24小时格式
}
}
/*=========================================================================================*/
/*=========================================================================================*/
//**********转换计算***************
/*
void cover()
{
led[0]=times[0]%10;
led[1]=times[0]/10;
//led[0]=times[0]&0x0f;
// led[1]=times[0]>>4;
led[2]=times[1]&0x0f;
led[3]=times[1]>>4;
led[4]=times[2]&0x0f;
led[5]=times[2]>>4;
led[6]=times[3]&0x0f;
led[7]=times[3]>>4;
led[8]=times[4]&0x0f;
led[9]=times[4]>>4;
led[10]=times[5];
led[11]=times[6]&0x0f;
led[12]=times[6]>>4;
}
*/
//**********转换计算***************
void cover()
{
led[0]=times[0]%10;
led[1]=times[0]/10;
led[2]=times[1]%10;
led[3]=times[1]/10;
led[4]=times[2]%10;
led[5]=times[2]/10;
led[6]=times[3]%10;
led[7]=times[3]/10;
led[8]=times[4]%10;
led[9]=times[4]/10;
led[10]=times[5];
led[11]=times[6]%10;
led[12]=times[6]/10;
}
//********显示时间的函数**************//
void display_dat() //显示时间和温度的函数
{
LCD_write_int(12,0,led[10]);//显示星期
LCD_write_int(0,0,2000+times[6]); //显示年份
LCD_en_dat('-');
LCD_write_int(5,0,led[9]); //显示月份
LCD_write_int(6,0,led[8]);
LCD_en_dat('-');
LCD_write_int(8,0,led[7]); //显示日期
LCD_write_int(9,0,led[6]);
LCD_write_int(0,1,led[5]); //显示小时
LCD_write_int(1,1,led[4]);
LCD_en_dat(':');
LCD_write_int(3,1,led[3]); //显示分钟
LCD_write_int(4,1,led[2]);
LCD_en_dat(':');
LCD_write_int(6,1,led[1]); //显示秒
LCD_write_int(7,1,led[0]);
}
//*================================================*/
void delay(unsigned char i) //延时函数
{
unsigned char j;
while(i--)
for(j=101;j>1;j--);
}
//*******************************
void key_scan()
{
unsigned char X,Y,Z,k=key;
P2=0x0f; //先对P2置数行扫描
if(P2!=0x0f) //判断是否有键按下
{
delay(5); //延时,软件去干扰
if(P2!=0x0f) //确认按键按下X = P3;
{
X=P2; //保存行扫描时有键按下时状态
P2=0xf0; //列扫描
delay(5);
Y=P2; //保存列扫描时有键按下时状态
Z=X|Y; //取出键值
switch ( Z ) //判断键值(那一个键按下)
{
case 0xe7: k=1;break; //秒
case 0xd7: k=5;break; //月
case 0xb7: k=9;break;//设温
case 0x77: k=13;break;//确定
case 0xeb: k=2;break;//分
case 0xdb: k=6;break;//星期
case 0xbb: k=10;break;//定时
case 0x7b: k=14;break; //退出
case 0xed: k=3;break;//时
case 0xdd: k=7;break; //年
case 0xbd: k=11;break; //递增
case 0x7d: k=15;break; //取消
case 0xee: k=4;break; //日
case 0xde: k=8;break; //闹钟
case 0xbe: k=12;break; //递减
case 0x7e: k=16;break; //开关
}
key=k-1;
}
}
P2=0xff;
}
//******************温度定时调整*****************************//
void change_time(unsigned char i)
{
unsigned char tem=0,temp_time=0,low=0,high=0;
if(i<=6)
{
CLEARSCREEN;
if(i==0)
{
LCD_write_string(0,0,"Change second:");
} //修改秒
key=16;
delay(250);
while(1)
{
key_scan();
if(key<8)
{
tem=(tem*10)+key;
if((i==0 || i==1) && tem>59) tem=59;//确保修改的数据不超出限制,
if((i==2 ) && tem>23) tem=23; //比如分不能超过60,月不能超过12等。
if(i==3 && tem>31) tem=31; //如超过限制,则定为最大
if(i==4 && tem>12) tem=12;
if(i==5 && tem>7)
{
if(key<=6 && key!=0)tem=key;
else tem=6;
}
delay(200);
key=16;
}
if(key==12 )
{
CLEARSCREEN;//设置好以后清屏
break; //确定
}
if(key==13) //取消
{
tem/=10;
key=16;
delay(200);
}
if(key==14)return; //退出
if(temp_time!=tem)
{
LCD_write_char(8,1,' '); //实时显示修改的数据
if(i==6)
{
LCD_write_int(9,1,20);
LCD_en_dat(tem/10+0x30);
LCD_en_dat(tem%10+0x30);
}
else
{
LCD_write_int(10,1,tem/10);
LCD_write_int(11,1,tem%10);
}
temp_time=tem;
}
delay(100);
read_1302_time(times);
LCD_write_string(0,1,"Now: ");
if(i==0) //显示秒
{
led[0]=times[0]%10;
led[1]=times[0]/10;
LCD_write_int(4,1,led[1]);
LCD_write_int(5,1,led[0]);
}
}
read_1302_time(times);
times[i]=tem;
write_1302_time(times); //把数据写进1302
}
if(i==8) //设置温度
{
CLEARSCREEN;
LCD_write_string(0,0,"set temperature:");
key=16;
while(1)
{
key_scan();
tem=(tem*10)+key;
if(tem>128)tem=128;
if(low!=tem)
{
low=tem;
LCD_write_string(0,1,"low:");
LCD_write_int(4,1,low);
}
if(low==0)LCD_write_int(4,1,low);
if(key==12 )
{
key=16;
tem=0;
break; //确定
}
if(key==13) //取消
{
tem/=10;
key=16;
delay(200);
}
}
while(1)
{
key_scan();
tem=(tem*10)+key;
if(tem>128)tem=128;
high=tem;
LCD_write_string(8,1,"high:");
if(key==12 )
{
CLEARSCREEN;
tem=0;
key=16;
break; //确定
}
if(key==13) //取消
{
tem/=10;
key=16;
delay(200);
}
}
LCD_write_int(13,1,high);
}
}
//*************************************************
void main() //主函数
{
LCD_init();
write_1302_time(times);
while(1)
{
read_1302_time(times); //读ds1302的时间
key_scan(); //扫描键盘
if(key<10) //如果键盘值小于7则进入修改界面
{
change_time(key);
key=16;
}
delay(30);
alarm_speaker=1;
delay(170);
read_temp(); //读出18B20温度数据
work_temp(); //处理温度数据
cover();
display_dat();//显示时间和温度
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -