微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 1602液晶显示DS1302+S51时钟+温度显示

1602液晶显示DS1302+S51时钟+温度显示

时间:11-10 来源:互联网 点击:

TMOD=0x01; //选择定时模式
TH0=(65535-50000)/256;//取定时初值
TL0=(65535-50000)%256;
EA=1; //开中断
TR0=1;
ET0=1;
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
W1302(0x8e,0x80); //写保护,禁止写操作
adjust_res(0x5f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125

while(1)
{
if ((P1_4|P1_5)==0) // 初始化 同时按下P1_4、P1_5
{
Delay5Ms(); // 适当延时,消除抖动
if ((P1_4|P1_5)==0) Set1302(inittime); // 显示初始值
}
if (P1_6==0) // 设置和选择项目键
{
Delay5Ms(); // 适当延时,消除抖动
if(P1_6==0){id++;if(id>7) id=0;} // 7个可调节项目循环调节
while(P1_6==0);
}
switch(id) // 跳转到对应的项目进行设置
{
case 0:
sec=0;
Disp_line1(); Disp_line2();
break;
case 1: //调节年
year=1;//设置年闪烁标志位
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 2: //调节月
year=0;mon=1;//设置月闪烁标志位
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 3: //调节日
mon=0;day=1;//设置日闪烁标志位
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 4: //调节星期
day=0;weekk=1;//设置星期闪烁标志位
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 5: //调节小时
weekk=0;hour=1;//设置小时闪烁标志位
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 6: //调节分钟
hour=0;min=1;//设置分钟闪烁标志位
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 7: //调节秒
min=0;sec=1;//设置秒钟闪烁标志位
Disp_line1(); Disp_line2();
id_case1_key();
break;
}
}
}
//================================== 定时中断 =============================================

/*****************************************************
函 数 名:void t0()
功 能:时间工作时,冒号闪烁
说 明:T0中断入口,方式1
入口参数:无
返 回 值:无
*****************************************************/
void t0(void) interrupt 1 using 0
{
TH0=(65535-50000)/256; //取50ms定时初值
TL0=(65535-50000)%256;
timecount++;
if(timecount>9)
{
timecount=0; //计时到,从先开始
flag=~flag; //标志位取反
}
}
//==================================== 项目设置 ===========================================

/*****************************************************
函 数 名:void id_case1_key()
功 能:项目设置加减控制
说 明:P1.5和P1.4 <==> +和-
入口参数:无
返 回 值:无
*****************************************************/
//id为1时的下一级选择
void id_case1_key()
{
if (P1_5==0) //P1_5有按下,则数值增加(+)
{
Delay5Ms(); //适当延时,消除抖动
if(P1_5==0) Set(id,0); //根据选择调整相应项目
if(id!=7) while(P1_5==0);
}
if (P1_4==0) //P1_4有按下,则数值减少(-)
{
Delay5Ms(); //适当延时,消除抖动
if(P1_4==0) Set(id,1); //根据选择调整相应项目
if(id!=7) while(P1_4==0);
}
}
/*****************************************************
函 数 名:void Set()
功 能:项目设置
说 明:sel_1=0时,数值加;sel_1=1时,数值减
入口参数:sel和sel_1
返 回 值:无
*****************************************************/
//根据选择调整相应项目并写入DS1302
void Set(uchar sel,uchar sel_1)
{
signed char address,item;
signed char max,mini;
//偶数指令是写,奇数指令是读
//最大值与最小值限定
if(sel==7) {address=0x80; max=00;mini=0;} //秒
if(sel==6) {address=0x82; max=59;mini=0;} //分钟
if(sel==5) {address=0x84; max=23;mini=0;} //小时
if(sel==3) {address=0x86; max=31;mini=1;} //日
if(sel==2) {address=0x88; max=12;mini=1;} //月
if(sel==1) {address=0x8c; max=99;mini=0;} //年
if(sel==4) {address=0x8a; max=07;mini=1;} //星期
//先从1302中读出数据,把数据转换成十进制进行加减设置;后从先转换回来写入1302中
item=R1302(address+1)/16*10+R1302(address+1)%16;//从1302中读出1字节,再转换成十进制
if (sel_1==0) item++; else item--; //sel_1=0则加,sel_1=1则减
if(item>max) item=mini; //大于最大值,则赋最小值(循环)
if(item
W1302(0x8e,0x00); //允许写操作
W1302(address,item/10*16+item%10);//把调节好的十进制数据转换成十六进制后写入1302中
W1302(0x8e,0x80); //写保护,禁止写操作
}
//=======================================================================================

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top