📄 12864 具有菜单显示的电子钟 温度计.txt
字号:
return value;
}
/****************************************************************************
DS1302初始化
****************************************************************************/
void init_ds1302(void)
{
if(read_ds1302(0x0cd)!=0x01)
{
TIMECLK=0;
TIMERST=0;
write_ds1302(0x8e,0x00);
write_ds1302(0x82,INIT_MINUTE);
write_ds1302(0x84,INIT_HOUR);
write_ds1302(0x86,INIT_DAY);
write_ds1302(0x88,INIT_MONTH);
write_ds1302(0x8a,INIT_WEEK);
write_ds1302(0x8c,INIT_YEAR);
write_ds1302(0x90,0xa6);
write_ds1302(0x0cc,0x01);
write_ds1302(0x80,INIT_SECOND);
}
}
/****************************************************************************
从DS1302中读出温度值并将其显示在LCD上
****************************************************************************/
void readtime(void)
{
SECOND=read_ds1302(0x81);
MINUTE=read_ds1302(0x83);
HOUR=read_ds1302(0x85);
DAY=read_ds1302(0x87);
MONTH=read_ds1302(0x89);
WEEK=read_ds1302(0x8b);
YEAR=read_ds1302(0x8d);
}
/****************************************************************************
左屏判忙
****************************************************************************/
void busyl(void)
{
CS1=1;
CS2=0;
DI=0;
RW=1;
P0=1;
ENABLE=1;
delayus(2);
while(BF);
ENABLE=0;
RW=0;
DI=0;
}
/****************************************************************************
左屏写指令
****************************************************************************/
void write_cmdl(unsigned char Commandaddr)
{
busyl();
DI=0;
RW=0;
ENABLE=1;
P0=Commandaddr;
ENABLE=0;
RW=0;
DI=0;
}
/****************************************************************************
左屏写数据
****************************************************************************/
void write_datal(unsigned char Dataaddr)
{
busyl();
DI=1;
RW=0;
ENABLE=1;
P0=Dataaddr;
ENABLE=0;
RW=0;
DI=0;
}
/****************************************************************************
右屏判忙
****************************************************************************/
void busyr(void)
{
CS1=0;
CS2=1;
DI=0;
RW=1;
P0=1;
ENABLE=1;
delayus(2);
while(BF);
ENABLE=0;
RW=0;
DI=0;
}
/****************************************************************************
右屏写指令
****************************************************************************/
void write_cmdr(unsigned char Commandaddr)
{
busyr();
DI=0;
RW=0;
ENABLE=1;
P0=Commandaddr;
ENABLE=0;
RW=0;
DI=0;
}
/****************************************************************************
右屏写数据
****************************************************************************/
void write_datar(unsigned char Dataaddr)
{
busyr();
DI=1;
RW=0;
ENABLE=1;
P0=Dataaddr;
ENABLE=0;
RW=0;
DI=0;
}
/****************************************************************************
LCD初始化
****************************************************************************/
void init_12864(void)
{
write_cmdl(0xc0);
write_cmdl(0x3f);
write_cmdr(0xc0);
write_cmdr(0x3f);
}
/****************************************************************************
LCD清屏
****************************************************************************/
void clear(void)
{
unsigned char i,j;
unsigned char Page,Row;
for(i=0;i<8;i++)
{
Page=i|0xb8;
write_cmdl(Page);
write_cmdr(Page);
Row=0x40;
write_cmdl(Row);
write_cmdr(Row);
for(j=0;j<64;j++)
{
write_datal(0x00);
write_datar(0x00);
}
}
}
/****************************************************************************
写入ASCII字符
****************************************************************************/
void write_ascii(unsigned char x,unsigned char y,unsigned char time,bit fanhei)
{
unsigned char i,j;
unsigned char k=0;
unsigned char fanheizi=0;
unsigned char Page,Row;
Page=x|0xb8;
if((y>=0)&&(y<8))
{
Row=(y*8)|0x40;
write_cmdl(Page);
write_cmdl(Row);
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
if(fanhei==1)
{
fanheizi=255-nAsciiDot[time*16+k];
}
else
{
fanheizi=nAsciiDot[time*16+k];
}
write_datal(fanheizi);
k++;
}
write_cmdl(Row);
write_cmdl(Page+1);
}
}
if((y>=8)&&(y<16))
{
y=y-8;
Row=(y*8)|0x40;
write_cmdr(Page);
write_cmdr(Row);
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
if(fanhei==1)
{
fanheizi=255-nAsciiDot[time*16+k];
}
else
{
fanheizi=nAsciiDot[time*16+k];
}
write_datar(fanheizi);
k++;
}
write_cmdr(Row);
write_cmdr(Page+1);
}
}
}
/****************************************************************************
写入星期
****************************************************************************/
void write_week(unsigned char x,unsigned char y,unsigned char weektime,bit fanhei)
{
unsigned char i,j;
unsigned char k=0;
unsigned char fanheizi=0;
unsigned char Page,Row;
Page=x|0xb8;
if((y>=0)&&(y<8))
{
Row=(y*8)|0x40;
write_cmdl(Page);
write_cmdl(Row);
for(j=0;j<2;j++)
{
for(i=0;i<16;i++)
{
if(fanhei==1)
{
fanheizi=255-characterweek[(weektime-1)*32+k];
}
else
{
fanheizi=characterweek[(weektime-1)*32+k];
}
write_datal(fanheizi);
k++;
}
write_cmdl(Row);
write_cmdl(Page+1);
}
}
if((y>=8)&&(y<16))
{
y=y-8;
Row=(y*8)|0x40;
write_cmdr(Page);
write_cmdr(Row);
for(j=0;j<2;j++)
{
for(i=0;i<16;i++)
{
if(fanhei==1)
{
fanheizi=255-characterweek[(weektime-1)*32+k];
}
else
{
fanheizi=characterweek[(weektime-1)*32+k];
}
write_datar(fanheizi);
k++;
}
write_cmdr(Row);
write_cmdr(Page+1);
}
}
}
/****************************************************************************
写入汉字
****************************************************************************/
void write_character(unsigned char x,unsigned char y,unsigned char *ptr,bit fanhei)
{
unsigned char i,j;
unsigned char number,k=0;
unsigned char cl,ch;
unsigned char fanheizi=0;
unsigned char Page,Row;
cl=ptr[0];
ch=ptr[1];
for(number=0;;number++)
{
if((cl==GB_16[number].Index[0])&&(ch==GB_16[number].Index[1]))
{
Page=x|0xb8;
if((y>=0)&&(y<8))
{
Row=(y*8)|0x40;
write_cmdl(Page);
write_cmdl(Row);
for(j=0;j<2;j++)
{
for(i=0;i<16;i++)
{
if(fanhei==1)
{
fanheizi=255-GB_16[number].Msk[k];
}
else
{
fanheizi=GB_16[number].Msk[k];
}
write_datal(fanheizi);
k++;
}
write_cmdl(Row);
write_cmdl(Page+1);
}
}
if((y>=8)&&(y<16))
{
y=y-8;
Row=(y*8)|0x40;
write_cmdr(Page);
write_cmdr(Row);
for(j=0;j<2;j++)
{
for(i=0;i<16;i++)
{
if(fanhei==1)
{
fanheizi=255-GB_16[number].Msk[k];
}
else
{
fanheizi=GB_16[number].Msk[k];
}
write_datar(fanheizi);
k++;
}
write_cmdr(Row);
write_cmdr(Page+1);
}
}
break;
}
}
}
/****************************************************************************
DS18B20初始化
****************************************************************************/
bit reset_ds18b20(void)
{
bit presence;
DQ=0;
delayus(70);
DQ=1;
delayus(3);
presence=DQ;
delayus(25);
return presence;
}
/****************************************************************************
读一字节温度值
****************************************************************************/
unsigned char read_ds18b20(void)
{
unsigned char i;
unsigned char value = 0;
for(i=8;i>0;i--)
{
value=value>>1;
DQ=0;
DQ=1;
delayus(1);
if(DQ)
{
value=value|0x80;
}
delayus(6);
}
return(value);
}
/****************************************************************************
写一字节命令
****************************************************************************/
void write_ds18b20(unsigned char value)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=value&0x01;
delayus(5);
DQ=1;
value=value>>1;
}
delayus(5);
}
/****************************************************************************
读出温度值
****************************************************************************/
unsigned char read_temp(void)
{
unsigned char i,count;
unsigned int temp_v;
unsigned int x;
unsigned char temp[2];
reset_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
reset_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe);
temp[1]=read_ds18b20();
temp[0]=read_ds18b20();
tempflag=0;
if((temp[0]&0xf8)!=0x00)
{
tempflag=1;
temp[1]=~temp[1];
temp[0]=~temp[0];
temp_v=temp[1]+1;
temp[1]=temp_v;
if(temp_v>255)
{
temp[0]++;
}
}
x=((temp[0]&0x07)*256+temp[1])>>4;
temp[1]=temp[1]&0x0f;
temp[1]=divdisplay[temp[1]];
for(i=0;i<8;i++)
{
bcddis[i]=0;
}
i=0;
bcddis[0]=temp[1];
i++;
bcddis[1]=10;
i++;
while(x/10)
{
bcddis[i]=x%10;
x=x/10;
i++;
}
bcddis[i]=x;
i++;
count=i;
if(tempflag==1)
{
bcddis[i]=13;//-
}
else
{
bcddis[i]=12;//+
}
return count;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -