📄 test00.asm
字号:
#include <stdio.h>
#include <at89x51.h>
#define DI P2_5
#define RW P2_6
#define E P2_7
#define DSDIP P3_2
#define CTRL P3_0
unsigned int k=0;
code unsigned char num[16]={0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0x74,0x3c,0x7c,0x04,0xff};
code unsigned char close[6]={0xc2,0x32,0xf2,0xca,0xa2,0x22};
//unsigned char time[4],time[2],day[2],time[5],tem1[5],tem2[5],mark,sec=0,flag;
unsigned char time[13],tem1[5],tem2[5],mark,sec=0,flag;
void delay()
{
long int i;
for(i=0;i<100;i++);
}
unsigned char creatdata(unsigned char d)
{
unsigned char temp,re=0;
temp=(d%2)*128;
re+=temp;
temp=(d/2)%2*64;
re+=temp;
temp=(d/4)%2*32;
re+=temp;
temp=(d/8)%2*16;
re+=temp;
temp=(d/16)%2*8;
re+=temp;
temp=(d/32)%2*4;
re+=temp;
temp=(d/64)%2*2;
re+=temp;
temp=(d/128)%2*1;
re+=temp;
return re;
}
void lcd_command(unsigned char lcd_data)
{
lcd_data=creatdata(lcd_data);
DI=0;
DI=0;
RW=0;
RW=0;
E=1;
E=1;
P0=lcd_data;
P0=lcd_data;
E=0;
E=0;
delay();
}
void lcd_data(int lcd_data)
{
DI=1;
DI=1;
RW=0;
RW=0;
E=1;
E=1;
P0=lcd_data;
P0=lcd_data;
E=0;
E=0;
delay();
}
void delaytime(unsigned char i)
{
while(--i);
}
unsigned char RestDS(void)
{
unsigned char isexist;
DSDIP=0;
delaytime(140);//526uS
delaytime(140);
DSDIP=1;
//等待15~60us
delaytime(26);
isexist=DSDIP;//取得ds18b20是否存在
delaytime(100);//106uS
return(isexist);
}
unsigned char ReadDS(void)
{
unsigned char i,t,value=0;
for(i=8;i>0;i--)
{
value>>=1;
DSDIP=0;
t++;//2us
DSDIP=1;
t++;//2us
t++;//2us
t++;//2us t++;//2us
if(DSDIP) value|=0x80;
delaytime(25);
}
return(value);
}
void writeDS(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DSDIP=0;
DSDIP=val&0x01;//每次写1位,通过val右移得到
delaytime(20);//延时34us(15~60us采样时间)
DSDIP=1;//释放总线
val>>=1;//计算的同时会产生一个2us的时间间隙
}
delaytime(3);//2次写的时间间隙要大于1us
}
float ReadTemp(void)
{
unsigned int temp;
unsigned char lowbit,highbit;
float dTemp=0;
RestDS();//复位ds18b20
writeDS(0xcc);//跳过ROM
writeDS(0x44);//发出温度转换命令
//------
RestDS();
writeDS(0xcc);//跳过ROM
writeDS(0xBE);//读暂存存贮器
lowbit=ReadDS();//取得低8位
highbit=ReadDS();//取得高8位
temp=highbit<<8;
temp=temp+lowbit;//合成16位的二进制数
/*
判断前5位,是否为:
1:负
0:正
*/
//---------
dTemp=temp*0.0625;//得到带小数点的实际温度
temp=dTemp;//temp为int型,dTemp为float型,强制去掉小数
/*全局变量分别返回个,十,百,符号位*/
tem1[0]=temp/100;//得到百位
tem1[1]=(temp-tem1[0]*100)/10;//得到十位
tem1[2]=temp-tem1[0]*100-tem1[1]*10;//得到个位
tem1[3]=(dTemp-temp)*10;//得到小数位
tem1[4]=(dTemp-temp)*100-tem1[3]*10;
return(dTemp);
}
unsigned char check_key()
{
unsigned char key;
P3_3=1;
P1=0x7f;
P3_4=0;
if(P1!=0x7f)
{
key=P1;
while(P1!=0x7f);
return key;
}
P3_4=1;
P1=0xff;
P3_3=0;
if(P1!=0xff)
{
key=P1;
while(P1!=0xff);
return key;
}
return 0;
}
void gettem()
{
ReadTemp();//取得ds18b20温度
lcd_command(0x03);
lcd_command(0xc0);
lcd_data(num[12]);
lcd_data(num[tem1[0]]);
lcd_data(num[tem1[1]]);
lcd_data(num[tem1[2]]);
lcd_data(num[11]);
lcd_data(num[tem1[3]]);
lcd_data(num[tem1[4]]);
lcd_data(num[13]);
}
void check_time()
{
time[4]=time[4]>1?1:time[4];
if(time[4]==1)
{
time[5]=time[5]>2?2:time[5];
}
if(time[4]==0&&time[5]==2)
{
time[6]=time[6]>2?2:time[6];
if(time[6]==2)
{
time[7]=time[7]>8?8:time[7];
}
}
else
{
time[6]=time[6]>3?3:time[6];
if(time[6]==3)
{
if((time[4]==0&&(time[5]==4||time[5]==6||time[5]==9))||(time[4]==1&&time[5]==1))
{
time[7]=0;
}
else time[7]=time[7]>1?1:time[7];
}
}
time[8]=time[8]>2?2:time[8];
if(time[8]==2)
{
time[9]=time[9]>4?4:time[9];
}
time[11]=time[11]>5?5:time[11];
}
void time_back(unsigned char b[])
{
unsigned char i;
for(i=0;i<12;i++)
{
time[i]=b[i];
}
}
void tem_back(unsigned char b[])
{
unsigned char i;
for(i=0;i<5;i++)
{
tem2[i]=b[i];
}
lcd_command(0x03);
lcd_command(0xc9);
lcd_data(num[tem2[0]]);
lcd_data(num[tem2[1]]);
lcd_data(num[tem2[2]]);
lcd_data(num[11]);
lcd_data(num[tem2[3]]);
lcd_data(num[tem2[4]]);
}
unsigned char set_time()
{
unsigned char j=0,index=0,index_1=0,time_bak[12];
int i=0;
TR0=0;
lcd_command(0x03);
delay();
lcd_command(0x80+index_1);
for(i=0;i<12;i++)
{
time_bak[i]=time[i];
}
while(1)
{
i++;
if(i>=1000)
{
gettem();
lcd_command(0x03);
delay();
lcd_command(0x80+index_1);
i=0;
}
j=0;
switch (check_key())
{
case 0xbf : time[index]=1;
j=1;
break;
case 0xdf : time[index]=3;
j=1;
break;
case 0xef : time[index]=5;
j=1;
break;
case 0xf7 : time[index]=7;
j=1;
break;
case 0xfb : time[index]=9;
j=1;
break;
case 0x3f : time[index]=0;
j=1;
break;
case 0x5f : time[index]=2;
j=1;
break;
case 0x6f : time[index]=4;
j=1;
break;
case 0x77 : time[index]=6;
j=1;
break;
case 0x7b : time[index]=8;
j=1;
break;
case 0x7d:k=0;sec=0;TR0=1;return 0;
case 0xfd:time_back(time_bak);k=0;sec=0;TR0=1;return 0;
}
if(j==1)
{
check_time();
lcd_command(0x03);
delay();
lcd_command(0x80+index_1);
lcd_data(num[time[index]]);
index++;
index_1++;
if(index_1==4||index_1==7||index_1==10||index_1==13)index_1++;
if(index==10)index=11;
else if(index_1==16)
{
index_1=0;
index=0;
}
j=0;
lcd_command(0x03);
delay();
lcd_command(0x80+index_1);
}
}
}
unsigned char set_tem()
{
unsigned char tem_bak[5], j, index=0,index_1=9;
int i=0;
lcd_command(0x03);
delay();
lcd_command(0xc0+index_1);
for(i=0;i<5;i++)
{
tem_bak[i]=tem2[i];
}
while(1)
{
if(time[10]!=flag)
{
flag=time[10];
lcd_command(0x03);
lcd_command(0x8d);
lcd_data(num[time[10]]);
lcd_data(num[time[11]]);
lcd_data(num[time[12]]);
gettem();
lcd_command(0x03);
delay();
lcd_command(0xc0+index_1);
i=0;
}
i++;
//if(i>=1000)
//{
// }
j=0;
switch (check_key())
{
case 0xbf : tem2[index]=1;
j=1;
break;
case 0xdf : tem2[index]=3;
j=1;
break;
case 0xef : tem2[index]=5;
j=1;
break;
case 0xf7 : tem2[index]=7;
j=1;
break;
case 0xfb : tem2[index]=9;
j=1;
break;
case 0x3f : tem2[index]=0;
j=1;
break;
case 0x5f : tem2[index]=2;
j=1;
break;
case 0x6f : tem2[index]=4;
j=1;
break;
case 0x77 : tem2[index]=6;
j=1;
break;
case 0x7b : tem2[index]=8;
j=1;
break;
case 0x7d:k=0;sec=0;return 0;
case 0xfd:tem_back(tem_bak);k=0;sec=0;TR0=1;return 0;
}
if(j==1)
{
lcd_command(0x03);
delay();
lcd_command(0xc0+index_1);
lcd_data(num[tem2[index]]);
index++;
index_1++;
if(index_1==12)index_1++;
else if(index_1==15)
{
index_1=9;
index=0;
}
j=0;
lcd_command(0x03);
delay();
lcd_command(0xc0+index_1);
}
}
}
void tem_ctrl()
{
unsigned int t1,t2;
t1=tem1[0]*100+tem1[1]*10+tem1[2]+tem1[3]*0.1;
t2=tem2[0]*100+tem2[1]*10+tem2[2]+tem2[3]*0.1;
if(t1>=t2)
{
CTRL=1;
}
else
{
CTRL=0;
}
}
void main()
{
int i=0;
unsigned char kk=0;
CTRL=1;
lcd_command(0x01);
lcd_command(0x3c);
//lcd_command(0x17);
lcd_command(0x0f);
lcd_command(0x06);
lcd_command(0x80);
time[0]=2;
time[1]=0;
time[2]=0;
time[3]=5;
time[4]=0;
time[5]=4;
time[6]=2;
time[7]=0;
time[8]=1;
time[9]=7;
time[10]=10;
time[11]=0;
time[12]=3;
flag=time[10];
lcd_command(0x03);
lcd_command(0xc8);
lcd_data(num[12]);
lcd_data(close[0]);
lcd_data(close[1]);
lcd_data(close[2]);
lcd_data(close[3]);
lcd_data(close[4]);
lcd_data(close[5]);
///lcd_data(num[tem2[0]]);
//lcd_data(num[tem2[1]]);
//lcd_data(num[tem2[2]]);
//lcd_data(num[11]);
//lcd_data(num[tem2[3]]);
// lcd_data(num[tem2[4]]);
lcd_data(num[13]);
TMOD=0x00;
TL0=24;
TH0=99;
EA=1;
TR0=1;
ET0=1;
while(1){
switch (check_key())
{
case 0x7d:kk=1;
break;
case 0xfd:kk=0;
CTRL=1;
break;
case 0x7e:set_time();
break;
case 0xfe:
if(kk==1)set_tem();
break;
}
if(kk==1)
{
tem_ctrl();
lcd_command(0x03);
lcd_command(0xc9);
lcd_data(num[tem2[0]]);
lcd_data(num[tem2[1]]);
lcd_data(num[tem2[2]]);
lcd_data(num[11]);
lcd_data(num[tem2[3]]);
lcd_data(num[tem2[4]]);
}
else
{
lcd_command(0x03);
lcd_command(0xc9);
lcd_data(close[0]);
lcd_data(close[1]);
lcd_data(close[2]);
lcd_data(close[3]);
lcd_data(close[4]);
lcd_data(close[5]);
}
if(time[10]!=flag)
{
flag=time[10];
lcd_command(0x03);
lcd_data(num[time[0]]);
lcd_data(num[time[1]]);
lcd_data(num[time[2]]);
lcd_data(num[time[3]]);
lcd_data(num[11]);
lcd_data(num[time[4]]);
lcd_data(num[time[5]]);
lcd_data(num[11]);
lcd_data(num[time[6]]);
lcd_data(num[time[7]]);
lcd_data(num[14]);
lcd_data(num[time[8]]);
lcd_data(num[time[9]]);
lcd_data(num[time[10]]);
lcd_data(num[time[11]]);
lcd_data(num[time[12]]);
}
// gettem();//取得ds18b20温度
}
}
void time0_int(void) interrupt 1
{
k++;
if(k>100&&k<200)time[10]=14;
else time[10]=10;
if(k>=200)
{
k=0;
sec++;
if(sec==60)
{
time[12]++;
if(time[12]==10)
{
time[12]=0;
time[11]++;
if(time[11]==6)
{
time[11]=0;
time[9]++;
if(time[8]!=2&&time[9]==10)
{
time[9]=0;
time[8]++;
lcd_command(0xcc);
lcd_data(num[time[8]]);
}
else if(time[8]==2&&time[9]==4)
{
time[9]=0;
time[8]=0;
time[1]++;
if(time[7]==10)
{
time[7]=0;
time[6]++;
// lcd_command(0x);
}
if(time[4]==0)
{
if((time[5]==1||time[5]==3||time[5]==5||time[5]==7||time[5]==8)&&time[6]==3&&time[7]==2)
{
time[6]=0;
time[7]=1;
time[5]++;
}
if((time[5]==4||time[5]==6||time[5]==9)&&time[6]==3&&time[7]==1)
{
time[6]=0;
time[7]=1;
time[5]++;
}
if((time[5]==2)&&time[6]==2&&time[7]==9)
{
time[6]=0;
time[7]=1;
time[5]++;
}
}
else if(time[4]==1)
{
if((time[5]==1)&&time[6]==3&&time[7]==1)
{
time[6]=0;
time[7]=1;
time[5]++;
}
if((time[5]==2||time[5]==0)&&time[6]==3&&time[7]==2)
{
time[6]=0;
time[7]=1;
time[5]++;
}
}
if(time[5]==10)
{
time[5]=0;
time[4]++;
}
if(time[4]==1&&time[5]==3)
{
time[4]=0;
time[5]=1;
time[3] ++;
if(time[3]==10)
{
time[3]=0;
time[2]++;
if(time[2]==10)
{
time[2]=0;
time[1]++;
if(time[1]==10)
{
time[1]=0;
time[0]++;
if(time[0]==10)
{
time[0]=0;
}
}
}
}
}
}
}
}
sec=0;
}
}
TL0=24;
TH0=99;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -