|
#include<reg51.h>
#include <intrins.h>
sbit rs= P3^0;
sbit rw= P3^1;
sbit ep= P3^2;
void delay(unsigned char n) //延時n毫秒
{
while(n--);
}
bit lcd_bz() //檢測LCD是否忙
{
bit result;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P2&0x80);
ep=0;
return(result);
}
void lcd_wcmd(unsigned char cmd) //寫指令到LCD子程序
{
while(lcd_bz());
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P2=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;}
void lcd_pos(unsigned char pos) //寫顯示位置子程序
{
lcd_wcmd(pos|0x80);
}
void lcd_wdat(unsigned char dat) //寫顯示數據到LCD子程序
{
while(lcd_bz());
rs=1;
rw=0;
ep=0;
P2=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
void lcd_init() //LCD初始化子程序
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
delay(1);
}
#include<reg51.h>
sbit IO=P3^5;
sbit CLK=P3^4;
sbit RST=P3^3;
void writebyte(unsigned char Data) //寫數據到1302程序
{
unsigned char i;
for(i=8;i>0;i--)
{
Data>>=1;
IO=CY;
CLK=1;
CLK=0;
}
}
unsigned char readbyte() //讀數據
{
unsigned char i,t=0;
for(i=0;i<8;i++)
{
CLK=0;
if(IO!=0)
t|=(1<<i);
CLK=1;
}
return t;
}
void write(unsigned char address,unsigned char DATA) //寫地址,寫數據
{
RST=0;
CLK=0;
RST=1;
writebyte(address);
writebyte(DATA);
CLK=1;
RST=0;
}
unsigned char read(unsigned char address) //讀某地址的數據
{
unsigned char DATA;
RST=0;
CLK=0;
RST=1;
writebyte(address);
DATA=readbyte();
CLK=1;
RST=0;
return DATA;
}
void gettime(unsigned char timedata[]) //讀取時間
{
unsigned char i;
unsigned char address=0x81;
for(i=0;i<7;i++)
{
timedata[i]=read(address);
address+=2;
}
}
void settime(unsigned char timedata[]) //設置時間
{
unsigned char i;
unsigned char address=0x80;
write(0x8e,0x00);
for(i=0;i<7;i++)
{
write(address,timedata[i]);
address+=2;
}
write(0x8e,0x80);
}
#include<reg51.h>
sbit DQ=P0^7;
int k=1;
void delay2(unsigned char us) //延時
{
while(us--);
}
bit init(void) //初始化
{
bit x=0;
DQ=1;
delay2(8);
DQ=0;
delay2(80);
DQ=1;
delay2(14);
x=DQ;
delay2(20);
return ~x;
}
unsigned char read2(void) //讀數據
{
unsigned char i,d=0;
for(i=8;i>0;i--)
{
DQ=0;
d>>=1;
DQ=1;
delay2(1);
if(DQ)
d|=0x80;
delay2(4);
}
return(d);
}
void write2(unsigned char d) //寫數據
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=d&0x01;
delay2(5);
DQ=1;
d>>=1;
}
}
unsigned int readt(void) //讀溫度
{ float tt;
unsigned char tl,th;
unsigned int t=0;
init();
write2(0xCC);
write2(0x44);
init();
write2(0xCC);
write2(0xBE);
tl=read2();
th=read2();
t=th;
t=(t<<8)+tl;
if(t&0x8000)
{
k=0;
t=~t;
t++;
}
else k=1;
tt=t*0.0625;
t=tt*10+0.5;
return t;
}
#include<reg51.h>
#define Adjust(Item,Max,Min)do{unsigned char temp;temp=(Item>>4)*10;temp+=Item&0x0f;if(++temp==Max)temp=Min;Item=temp/10*16;Item+=temp%10;}while(0)
sbit K1=P3^6;
sbit K2=P3^7;
unsigned char code du[]={0x10,6,9,8,8,9,6,0};
unsigned char code year[]={8,31,2,15,10,31,2,0};
unsigned char code mouth[]={15,9,15,9,15,9,19,0};
unsigned char code day[]={15,9,9,15,9,9,15,0};
unsigned char s,c;
bit f;
unsigned char datatime[7];
unsigned char displaybuffer[32];
unsigned char week[7][3]={"SUN","MON","TUS","WED","THR","FRI","SAT"};
unsigned int t;
extern void gettime(unsigned char *);
extern void settime(unsigned char *);
extern void lcd_init();
extern void lcd_wdat(unsigned char);
extern void lcd_wcmd(unsigned char);
extern void delay(unsigned char);
extern unsigned int readt(void);
extern int k;
void display()
{
unsigned char i;
displaybuffer[0]='0'+2;
displaybuffer[1]='0'+0;
displaybuffer[2]='0'+datatime[6]/16;
displaybuffer[3]='0'+datatime[6]%16;
displaybuffer[4]=1;
displaybuffer[5]='0'+datatime[4]/16;
displaybuffer[6]='0'+datatime[4]%16;
displaybuffer[7]=2;
displaybuffer[8]='0'+datatime[3]/16;
displaybuffer[9]='0'+datatime[3]%16;
displaybuffer[10]=3;
displaybuffer[11]=' ';
displaybuffer[12]=week[datatime[5]-1][0];
displaybuffer[13]=week[datatime[5]-1][1];
displaybuffer[14]=week[datatime[5]-1][2];
displaybuffer[15]=' ';
displaybuffer[16]='0'+datatime[2]/16;
displaybuffer[17]='0'+datatime[2]%16;
displaybuffer[18]=':';
displaybuffer[19]='0'+datatime[1]/16;
displaybuffer[20]='0'+datatime[1]%16;
displaybuffer[21]=':';
displaybuffer[22]='0'+datatime[0]/16;
displaybuffer[23]='0'+datatime[0]%16;
displaybuffer[24]=' ';
if(s&&f)
{
if(s==1)
displaybuffer[0]=displaybuffer[1]=displaybuffer[2]=displaybuffer[3]=' ';
else if(s==2)
displaybuffer[5]=displaybuffer[6]=' ';
else if(s==3)
displaybuffer[8]=displaybuffer[9]=' ';
else if(s==4)
displaybuffer[12]=displaybuffer[13]=displaybuffer[14]=' ';
else if(s==5)
displaybuffer[16]=displaybuffer[17]=' ';
else if(s==6)
displaybuffer[19]=displaybuffer[20]=' ';
else if(s==7)
displaybuffer[22]=displaybuffer[23]=' ';
}
displaybuffer[25]=' ';
displaybuffer[26]=displaybuffer[27]=' ';
displaybuffer[28]='0'+t%100/10;
displaybuffer[29]='.';
displaybuffer[30]='0'+t%10;
displaybuffer[31]=0x00;
if(!k)
{
displaybuffer[25]='-';
}
if(t/1000)
displaybuffer[26]='0'+t/1000;
if(t/100)
displaybuffer[27]='0'+t%1000/100;
lcd_wcmd(0x80);
for(i=0;i<16;i++)
lcd_wdat(displaybuffer[i]);
lcd_wcmd(0xC0);
for(;i<32;i++)
lcd_wdat(displaybuffer[i]);
}
void delayms(unsigned char n)
{
unsigned char i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
void key()
{
if(K1)
return;
delayms(20);
if(K1)
return;
if(++s==8)
s=0;
while(!K1);
}
void key2()
{
if(K2)
return;
delayms(20);
if(K2)
return;
switch(s)
{
case 1: Adjust(datatime[6],100,0);
break;
case 2: Adjust(datatime[4],13,1);
break;
case 3: Adjust(datatime[3],32,1);
break;
case 4: Adjust(datatime[5],8,1);
break;
case 5: Adjust(datatime[2],24,0);
break;
case 6: Adjust(datatime[1],60,0);
break;
case 7: datatime[0]=0;
break;
}
settime(datatime);
while(!K2);
}
void main()
{
unsigned char i;
lcd_init();
delay(100);
for(i=0;i<32;i++)
{lcd_wcmd(0x40+i),
lcd_wdat(du[i]); }
TMOD=1;
ET0=1;
EA=1;
TR0=1;
while(1)
{
key();
key2();
}
}
void t0s() interrupt 1
{
TH0=15536/256;
TL0=15536%256;
if(++c==5)
{
c=0;
f=~f;
gettime(datatime);
t=readt();
display();
}
}
|
|