时钟及温度用74hc164+74ls145数码管显示单片机程序
}
void keyshu()//设定键函数
{
bit b,d,e;
b=MINUS;d=ADD;//变量B,D,E分别读回P0。4~P0。6的状态。分别为加一,减一,确认键
e=ENTER;
if(b==0)//减一按键按下
{
dateshu[seta]--;
if(dateshu[seta]<0)dateshu[seta]=9;//减到零时自动循环回九
b=MINUS;//再读回键值,做松手查检测
while(b==0){b=MINUS;display(dateshu[0],dateshu[1],10,seta+1,dateshu[2],dateshu[3],dateshu[4],dateshu[5]);}//松手检测
}
else if(d==0)//加一按键按下
{
dateshu[seta]++;
if(dateshu[seta]>9)dateshu[seta]=0;//加到九时自动循环回零
d=ADD;//做松手检测
while(d==0){d=ADD;display(dateshu[0],dateshu[1],10,seta+1,dateshu[2],dateshu[3],dateshu[4],dateshu[5]);}//松手检测
}
else if(e==0)//确认键按下
{
seta++;
e=ENTER;
while(e==0){e=ENTER;display(dateshu[0],dateshu[1],10,seta+1,dateshu[2],dateshu[3],dateshu[4],dateshu[5]);}
if(seta>5)//如果六位数值已设定完毕,测退出设定状态
{
seta=0;sec=0;setflag=0;
sec=dateshu[1]*10+dateshu[0];//分别将设定好的值,赋给时秒变量,设定生效
min=dateshu[3]*10+dateshu[2];//分别将设定好的值,赋给分变量,设定生效
hour=dateshu[5]*10+dateshu[4];//分别将设定好的值,赋给时变量,设定生效
}
}
}
void main()本文引用地址:https://www.eepw.com.cn/article/201612/324565.htm
{
init();//各外围元件及CPU初始化
delay10us(150);//进入大循环时的延时
while(1)
{
key();//检测功能键有无按下
if(setflag==0)//如果设定功能未进入,则显示实时时钟
{
timer();//时间运算函数
display(dateshu[0],dateshu[1],10,10,dateshu[2],dateshu[3],dateshu[4],dateshu[5]);//显示实时时钟
}
else//如果进入了功能设定函数
{
keyshu();//读取键值
display(dateshu[0],dateshu[1],10,seta+1,dateshu[2],dateshu[3],dateshu[4],dateshu[5]);//显示实时设定
}
if((dateshu[0]==3)&&(dateshu[1]%2==0))//每隔十秒温度读取显示一次
{uchar i;//显示延时用
dqrsr();//初始化
if(dqflag==1)//检测存在脉冲
{
dqwrite(0xcc);//跳过ROM操作
dqwrite(0x44);//开始温度转换
while(!DS1820DQ);//延时等待温度转换完毕
dqrsr();//初始化
if(dqflag==1)
{
uchar temper;//温度变量
dqwrite(0xcc);//跳过ROM操作
dqwrite(0xbe);//读取数据指令
temperl=dqread();//读取低字节温度值
temperh=dqread();//读取高字节温度值
temperl=temperl>>4;//移去低四位的温度值
temperh=temperh<<4;//移去读回的符号号
temper=temperl+temperh;//将处理后的高字节温度和低字节温度值相加
for(i=250;i>0;i--)display(temper%10,temper/10,temper/100,10,10,10,10,10);//延时显示实时温度
}
}
}
}
}
void time0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时器零重赋初值
tim++;
if(tim==20)
{
tim=0;//tim==20时,为50MS*20=1S
sec++;
}
}
评论