LCD1602显示时间温度.docx

上传人:b****6 文档编号:13711018 上传时间:2023-06-16 格式:DOCX 页数:23 大小:18.56KB
下载 相关 举报
LCD1602显示时间温度.docx_第1页
第1页 / 共23页
LCD1602显示时间温度.docx_第2页
第2页 / 共23页
LCD1602显示时间温度.docx_第3页
第3页 / 共23页
LCD1602显示时间温度.docx_第4页
第4页 / 共23页
LCD1602显示时间温度.docx_第5页
第5页 / 共23页
LCD1602显示时间温度.docx_第6页
第6页 / 共23页
LCD1602显示时间温度.docx_第7页
第7页 / 共23页
LCD1602显示时间温度.docx_第8页
第8页 / 共23页
LCD1602显示时间温度.docx_第9页
第9页 / 共23页
LCD1602显示时间温度.docx_第10页
第10页 / 共23页
LCD1602显示时间温度.docx_第11页
第11页 / 共23页
LCD1602显示时间温度.docx_第12页
第12页 / 共23页
LCD1602显示时间温度.docx_第13页
第13页 / 共23页
LCD1602显示时间温度.docx_第14页
第14页 / 共23页
LCD1602显示时间温度.docx_第15页
第15页 / 共23页
LCD1602显示时间温度.docx_第16页
第16页 / 共23页
LCD1602显示时间温度.docx_第17页
第17页 / 共23页
LCD1602显示时间温度.docx_第18页
第18页 / 共23页
LCD1602显示时间温度.docx_第19页
第19页 / 共23页
LCD1602显示时间温度.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

LCD1602显示时间温度.docx

《LCD1602显示时间温度.docx》由会员分享,可在线阅读,更多相关《LCD1602显示时间温度.docx(23页珍藏版)》请在冰点文库上搜索。

LCD1602显示时间温度.docx

LCD1602显示时间温度

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineLCDIOP2

sbitDQ=P1^3;//ds18b20与单片机连接口

sbitrs=P1^0;

sbitrd=P1^1;

sbitlcden=P1^2;

sbitacc0=ACC^0;//移位时的第0位

sbitacc7=ACC^7;//移位时用的第7位

ucharsecond,minute,hour,day,month,year,week,count=0;

ucharReadValue,num,time;

uinttvalue;//温度值

uchartflag;

ucharcodetable[]={"2010-11-29MON"};

ucharcodetable1[]={"15:

45:

00000.0C"};

ucharcodetable2[]="THUFRISATSUNMONTUEWES";

uchardatadisdata[5];

sbitDATA=P0^1;//时钟数据接口

sbitRST=P0^2;

sbitSCLK=P0^0;

sbitmenu=P3^5;//菜单

sbitadd=P3^6;//加一

sbitdec=P3^7;//减一

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voiddelay1(uintz)

{

for(;z>0;z--);

}

voidwrite_com(ucharcom)

{

rs=0;

rd=0;

lcden=0;

P2=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidwrite_date(uchardate)

{

rs=1;

rd=0;

lcden=0;

P2=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidinit()

{

ucharnum;

lcden=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

delay(5);

write_com(0x80);

for(num=0;num<15;num++)

{

write_date(table[num]);

delay(5);

}

write_com(0x80+0x40);

for(num=0;num<15;num++)

{

write_date(table1[num]);

delay(5);

}

}

voidWrite1302(uchardat)

{

uchari;

SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备

delay1

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续写8个二进制位数据

{

DATA=dat&0x01;//取出dat的第0位数据写入1302

delay

(2);//稍微等待,使硬件做好准备

SCLK=1;//上升沿写入数据

delay1

(2);//稍微等待,使硬件做好准备

SCLK=0;//重新拉低SCLK,形成脉冲

dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位

}

}

voidWriteSet1302(ucharCmd,uchardat)

{

RST=0;//禁止数据传递

SCLK=0;//确保写数居前SCLK被拉低

RST=1;//启动数据传输

delay1

(2);//稍微等待,使硬件做好准备

Write1302(Cmd);//写入命令字

Write1302(dat);//写数据

SCLK=1;//将时钟电平置于已知状态

RST=0;//禁止数据传递

}

ucharRead1302(void)

{

uchari,dat;

delay

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续读8个二进制位数据

{

dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位

if(DATA==1)//如果读出的数据是1

dat|=0x80;//将1取出,写在dat的最高位

SCLK=1;//将SCLK置于高电平,为下降沿读出

delay1

(2);//稍微等待

SCLK=0;//拉低SCLK,形成脉冲下降沿

delay1

(2);//稍微等待

}

returndat;//将读出的数据返回

}

ucharReadSet1302(ucharCmd)

{

uchardat;

RST=0;//拉低RST

SCLK=0;//确保写数居前SCLK被拉低

RST=1;//启动数据传输

Write1302(Cmd);//写入命令字

dat=Read1302();//读出数据

SCLK=1;//将时钟电平置于已知状态

RST=0;//禁止数据传递

returndat;//将读出的数据返回

}

voidInit_DS1302(void)

{

WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令

WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((45/10)<<4|(45%10)));//根据写分寄存器命令字,写入分的初始值

WriteSet1302(0x84,((15/10)<<4|(15%10)));//根据写小时寄存器命令字,写入小时的初始值

WriteSet1302(0x86,((29/10)<<4|(29%10)));//根据写日寄存器命令字,写入日的初始值

WriteSet1302(0x88,((11/10)<<4|(11%10)));//根据写月寄存器命令字,写入月的初始值

WriteSet1302(0x8c,((10/10)<<4|(10%10)));//nian

WriteSet1302(0x8a,((4/10)<<4|(4%10)));

}

voidDisplaySecond(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_com(0xc7);

write_date(0x30+i);

write_date(0x30+j);

}

voidDisplayMinute(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_com(0xc4);

write_date(0x30+i);

write_date(0x30+j);

}

voidDisplayHour(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_com(0xc1);

write_date(0x30+i);

write_date(0x30+j);

}

voidDisplayDay(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_com(0x89);

write_date(0x30+i);

write_date(0x30+j);

}

voidDisplayMonth(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_com(0x86);

write_date(0x30+i);

write_date(0x30+j);

}

voidDisplayYear(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_com(0x83);

write_date(0x30+i);

write_date(0x30+j);

}

voidDisplayWeek(ucharx)

{uchari;

x=x*3;

write_com(0x8c);

for(i=0;i<3;i++)

{

write_date(table2[x]);

x++;

}

}

voidread_date(void)

{

ReadValue=ReadSet1302(0x81);

second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x83);

minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x85);

hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x87);

day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x89);

month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x8d);

year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x8b);//读星期

week=ReadValue&0x07;

DisplaySecond(second);

DisplayMinute(minute);

DisplayHour(hour);

DisplayDay(day);

DisplayMonth(month);

DisplayYear(year);

DisplayWeek(week);

}

voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num)

{

newval=ReadSet1302(newaddr);//读取当前时间

newval=((newval&0x70)>>4)*10+(newval&0x0f);//将bcd码转换成十进制

if(flag)//判断是加一还是减一

{

newval++;

switch(s1num)

{case1:

if(newval>99)newval=0;

DisplayYear(newval);

break;

case2:

if(newval>12)newval=1;

DisplayMonth(newval);

break;

case3:

if(newval>31)newval=1;

DisplayDay(newval);

break;

case4:

if(newval>6)newval=0;

DisplayWeek(newval);

break;

case5:

if(newval>23)newval=0;

DisplayHour(newval);

break;

case6:

if(newval>59)newval=0;

DisplayMinute(newval);

break;

case7:

if(newval>59)newval=0;

DisplaySecond(newval);

break;

default:

break;

}

}

else

{

newval--;

switch(s1num)

{case1:

if(newval==0)newval=99;

DisplayYear(newval);

break;

case2:

if(newval==0)newval=12;

DisplayMonth(newval);

break;

case3:

if(newval==0)newval=31;

DisplayDay(newval);

break;

case4:

if(newval<0)newval=6;

DisplayWeek(newval);

break;

case5:

if(newval<0)newval=23;

DisplayHour(newval);

break;

case6:

if(newval<0)newval=59;

DisplayMinute(newval);

break;

case7:

if(newval<0)newval=59;

DisplaySecond(newval);

break;

default:

break;

}

}

WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));//将新数据写入寄存器

}

//键盘扫描程序

//*******************************************

voidkey_scan(void)

{ucharmiao,s1num=0;

if(menu==0)

{

delay(5);

if(menu==0)

{

while(!

menu);

s1num++;

while

(1)

{

if(menu==0)

{

delay(5);

if(menu==0)

{

while(!

menu);

s1num++;

}

}

rd=0;

miao=ReadSet1302(0x81);

second=miao;

WriteSet1302(0x80,miao|0x80);

write_com(0x0f);//光标闪射

if(s1num==1)

{year=ReadSet1302(0x8d);

write_com(0x80+4);//年光标

if(add==0)

{

delay(3);

if(add==0)

{while(!

add);

turn_val(year,1,0x8d,1);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{while(!

dec);

turn_val(year,0,0x8d,1);

}

}

}

if(s1num==2)

{

month=ReadSet1302(0x89);

write_com(0x80+7);//月光标

if(add==0)

{

delay(3);

if(add==0)

{while(!

add);

turn_val(month,1,0x89,2);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{while(!

dec);

turn_val(month,0,0x89,2);

}

}

}

if(s1num==3)

{day=ReadSet1302(0x87);

write_com(0x80+10);//日光标

if(add==0)

{

delay(3);

if(add==0)

{while(!

add);

turn_val(day,1,0x87,3);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{while(!

dec);

turn_val(day,0,0x87,3);//写入日寄存器

}

}

}

if(s1num==4)

{week=ReadSet1302(0x8b);

write_com(0x80+14);//星期光标

if(add==0)

{

delay(3);

if(add==0)

{while(!

add);

turn_val(week,1,0x8b,4);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{while(!

dec);

turn_val(week,0,0x8b,4);

}

}

}

if(s1num==5)

{hour=ReadSet1302(0x85);

write_com(0x80+0x40+2);//时光标

if(add==0)

{

delay(3);

if(add==0)

{while(!

add);

turn_val(hour,1,0x85,5);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{while(!

dec);

turn_val(hour,0,0x85,5);

}

}

}

if(s1num==6)//调时间分

{minute=ReadSet1302(0x83);

write_com(0x80+0x40+5);

if(add==0)

{

delay(5);

if(add==0)

{while(!

add);

turn_val(minute,1,0x83,6);//写入分寄存器

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{while(!

dec);

turn_val(minute,0,0x83,6);//写入分寄存器

}

}

}

if(s1num==7)//调时间秒

{second=ReadSet1302(0x81);

write_com(0x80+0x40+8);//秒光标

if(add==0)

{

delay(3);

if(add==0)

{while(!

add);

if(second==0x60)

second=0x00;

turn_val(second,1,0x81,7);

}

}

if(dec==0)

{

delay(3);

if(dec==0)

{while(!

dec);

turn_val(second,0,0x81,7);

}

}

}

if(s1num==8)

{miao=ReadSet1302(0x81);

second=miao;

WriteSet1302(0x80,second&0x7f);

s1num=0;//s1num清零//

write_com(0x0c);//光标不闪烁//

break;

}

}

}

}

}

voiddelay_18B20(unsignedinti)//延时1微秒

{

while(i--);

}

voidds1820rst()/*ds1820复位*/

{unsignedcharx=0;

DQ=1;//DQ复位

delay_18B20(4);//延时

DQ=0;//DQ拉低

delay_18B20(100);//精确延时大于480us

DQ=1;//拉高

delay_18B20(40);

}

uchards1820rd()/*读数据*/

{unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

voidds1820wr(ucharwdata)/*写数据*/

{unsignedchari=0;

for(i=8;i>0;i--)

{DQ=0;

DQ=wdata&0x01;

delay_18B20(10);

DQ=1;

wdata>>=1;

}

}

read_temp()/*读取温度值并转换*/

{uchara,b;

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0x44);//*启动温度转换*/

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();

b=ds1820rd();

tvalue=b;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2