您的位置 首页 芯闻

用51写的带键控带温度的万年历在LCD12864上显现

1,温度只显示整数部份,简单了许多;2,之前星期不可调,问题出在读DS1302后数值没转换成十进制数;3,因为主函数始终要更新LCD的座标,所

1,温度只显示整数部份,简略了许多;
2,之前星期不可调,问题出在读DS1302后数值没转换成十进制数;
3,因为主函数一直要更新LCD的座标,所以光标会随之更新;这个对自已不做要求,有爱好的能够试一下;
4,网站代码下载:http://www.51hei.com/f/124wnl.rar

#include

#define uchar unsigned char
#define uint unsigned int
#define LCMdata P0
#define Busy 0x80
//——–Lcd_part —————-
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit REST = P2^5;
sbit PSB = P2^3;
//———Key_part—————-
sbit Key_1 = P1^4;
sbit Key_2 = P1^5;
sbit Key_3 = P1^6;
sbit Key_4 = P1^7;
//———-Ds1302_part—————-
sbit Sclk = P1^0;
sbit IO = P1^1;
sbit Rst = P1^2;
sbit Buz = P3^7;
sbit DQ = P3^6;
uchar Key_Select,Key_Flag,Key_Count,Set1,Temp;
uchar Time_Flag,TimeCount,Week_Count=0;
uchar Sec=0;uchar Min=30;uchar Hour=7;
uchar Date=8;uchar Mouth=4;uchar Year=12;uchar Week=5;
uchar Display_number[14] = {“0123456789: -“};

uchar Rd_addr[] = {0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar Wr_addr[] = {0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar Display[] = {“2012年04月06日//”};
uchar Display_1[]={“19时36分00秒////”};
uchar Display_T[]={“室温25℃”};
uchar Display_2[]={“星期”};
uchar code string_2[] = {” —-时钟—- “};
uchar code string_3[] = {” —-日历—- “};

void Wr_Data(uchar wrdata);
void Wr_Word(uchar *s);
void Wr_Command(uchar wrcommand,busyc);
void Display_String(uchar line,uchar Y,uchar *string);
void Delay5Ms(void) //延时 5ms
{
unsigned int TempCyc=5552;
while(TempCyc–);
}
//——————————————————-
void Delay_Ms(uint Mtime)
{
uint i,j;
for(i=Mtime;i>0;i–)
for(j=122;j>0;j–)
{;}
}
//——————————————————–
void Delay_Us(uchar Utime)//*2us
{
while(–Utime);
}
void Delay(uint utime) //9Us
{
while(utime–);
}
/////////////////////////////////////////////////////////
void Inint_ds18b20(void)
{
uchar DQZT=0;
DQ=1;
Delay(8);
DQ=0;
Delay(50);
DQ=1;
Delay(5);
DQZT=DQ;
Delay(10);
}
uchar Read_ds18b(void)
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat=dat|0x80;
Delay(5);
}
return dat;
}
void Write_ds18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
void Read_Temp(void)
{
uchar a,b;
Inint_ds18b20();
Write_ds18b20(0xcc);
Write_ds18b20(0x44);
Delay_Ms(100);
Inint_ds18b20();
Write_ds18b20(0xcc);
Write_ds18b20(0xbe);
Delay_Ms(50);
a=Read_ds18b();
b=Read_ds18b();
a&=0xf0;
a>>=4;
b<<=4;
Temp=a|b;
Display_T[4]=Display_number[Temp/10];
Display_T[5]=Display_number[Temp%10];
Delay_Us(100);
}
/////////////////////////////////////////////////////////
void Wr_ds1302_byte(uchar data_13)
{
uchar i;
for(i=0;i<8;i++)
{
Sclk = 0;
IO = data_13 &0x01;
data_13=data_13>>1;
Sclk = 1;
}
}
///////////////////////////////////////////////////
uchar Rd_ds1302_byte()
{
uchar i,value;
for(i=0;i<8;i++)
{
value=value>>1;
Sclk = 1;
Sclk = 0;
if(IO)
value=value|0x80;
}
return value;
}
///////////////////////////////////////////////////////
void Wr_1302(uchar addr,uchar dat)
{
Rst = 0;
Sclk = 0;
Rst = 1;
Wr_ds1302_byte(addr);
Wr_ds1302_byte(dat);
Rst = 0;
Sclk = 1;
IO = 1;
}
////////////////////////////////////////////////////
Rd_1302(uchar addr)
{
uchar value;
Rst = 0;
Sclk = 0;
Rst = 1;
Wr_ds1302_byte(addr);
value=Rd_ds1302_byte();
Rst = 0;
IO = 1;
Sclk = 1;
return value;
}
////////////////////////////////////////////////////////////////////
void Set_RTC(void)
{
Wr_1302(0x8e,0x00);
Wr_1302(0x80,0x80);
Wr_1302(Wr_addr[6],(Sec/10)<<4|Sec%10); //Sec
Wr_1302(Wr_addr[5],(Min/10)<<4|Min%10); //Min
Wr_1302(Wr_addr[4],(Hour/10)<<4|Hour%10); //Hour
Wr_1302(Wr_addr[3],(Date/10)<<4|Date%10); //Date
Wr_1302(Wr_addr[2],(Mouth/10)<<4|Mouth%10); //Mouth
Wr_1302(Wr_addr[1],(Week/10)<<4|Week%10); //Weak
Wr_1302(Wr_addr[0],(Year/10)<<4|Year%10); //Year
Wr_1302(0x8e,0x80);
}
/////////////////////////////////////////////////////////////////
void Rd_RTC(void)
{
Sec = Rd_1302(0x81); //Sec
Min = Rd_1302(0x83); //Min
Hour = Rd_1302(0x85); //Hour
Date = Rd_1302(0x87); //Date
Mouth = Rd_1302(0x89); //Mouth
Year = Rd_1302(0x8d); //Year
Week = Rd_1302(0x8b); //Week
}
////////////////////////////////////////////////////////////
void change(void)
{
//Year
Display[2] = Display_number[Year/16];
Display[3] = Display_number[Year%16];
//Mouth
Display[6] = Display_number[Mouth/16];
Display[7] = Display_number[Mouth%16];
//Date
Display[10] = Display_number[Date/16];
Display[11] = Display_number[Date%16];
//Hour
Display_1[0] = Display_number[Hour/16];
Display_1[1] = Display_number[Hour%16];
//Min
Display_1[4] = Display_number[Min/16];
Display_1[5] = Display_number[Min%16];
//Sec
Display_1[8] = Display_number[Sec/16];
Display_1[9] = Display_number[Sec%16];

Week = Week%16;
switch(Week)
{
case 1: Display_String(4,2,”一”); break;
case 2: Display_String(4,2,”二”); break;
//case 3: Display_String(4,2,”三”); break;
case 3 :Wr_Command(0x9a,1);Wr_Data(0xc8);Wr_Data(0xfd);break;
case 4: Display_String(4,2,”四”);break;
case 5: Display_String(4,2,”五”); break;
case 6: Display_String(4,2,”六”); break;
case 7: Display_String(4,2,”日”); break;
default:
break;
}
}

//——————————————————–
void RDbf(void) //读忙状况
{
while(1)
{
RS=0;
RW=1;
E=0;
LCMdata=0xFF;
E=1;
if((LCMdata&Busy)==0)
break;
}
}
//——————————————————–
void Wr_Data(uchar wrdata) //写数据
{
RDbf();
RS=1;
RW=0;
E=1;
LCMdata=wrdata;
E=0;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/255336.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部