📄 digitalclock.c
字号:
void conversion_t(void)
{
uchar save=0,save1=0;
if(temp.temp_data<0) // 判断数值符号
{temp_pn=1;temp.temp_data=~temp.temp_data+1;}
else temp_pn=0;
if(temp.t_data[1]&0x01==1) save+=6; // 小数点后的值转变
if((temp.t_data[1]>>1)&0x01==1) save+=12;
if((temp.t_data[1]>>2)&0x01==1) save+=25;
if((temp.t_data[1]>>3)&0x01==1) save+=50;
temp.temp_data>>=4;
save1=temp.temp_data&0x00ff; // 整数部分数值
temp.t_data[0]=save1;
temp.t_data[1]=save;
thl_als=1;
if(save1>=(als_temp[0]&0x7f)) // 温度比较
{
if(!temp_pn||(temp_pn&(als_temp[0]&0x80)!=0)){ als_th=open;als_tl=close;}
}
else if(save1<(als_temp[1]&0x7f)&&als_temp[1]!=255)
{
if(!temp_pn||(temp_pn&(als_temp[1]&0x80)!=0)) {als_tl=open;als_th=close;}
}
else {als_th=als_tl=close;thl_als=0;buzstop=0;buzzer=close;}
}
/*18b20功能*/
void ds18b20_func(void)
{
EA=0;
TR0=0;
temp.temp_data=0;
init_ds18b20();
send18b20_byte(0xcc); // 跳过ROM
send18b20_byte(0x44); // 温度转换
delay_pw();
init_ds18b20();
send18b20_byte(0xcc);
send18b20_byte(0xbe); // 读RAM
receive18b20(); // 读取温度值
conversion_t(); // 数值转换
EA=1;
TR0=1;
}
/*=====================================================================================
函数名称:画面构造
功能描述:界面1、2、3,图片菜单,反白,标头,16*16(32)图片
全局变量:无
参数说明:函数说明
返回说明:无
设 计 人:LIJH
版 本:1.0
说 明:X坐标每一格每次16点
======================================================================================*/
/*反白或显示图片 参数格式:(H)8bit数据,(L)8bit数据,X0坐标(16bit),Y0坐标(1bit),X坐标(16bit),Y坐标(1bit)*/
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
uchar i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;i++)
{
wr_lcd(comm,0x34); // 扩展功能
wr_lcd(comm,y0+j); // 写Y坐标
wr_lcd(comm,x0+i); // 写X坐标
wr_lcd(comm,0x30); // 普通功能
wr_lcd(dat,data1);
wr_lcd(dat,data2);
}
}
wr_lcd(comm,0x36); // 开绘图显示
}
/*显示字体 参数格式: 显示位置(0x80-0x9f),显示个数,显示内容指针*/
void display_cnasc(uchar dis_bit,uchar num,uchar *cnasc)
{
wr_lcd(comm,0x30); // 普通功能
wr_lcd(comm,dis_bit); // 写地址
while(num>0)
{
wr_lcd(dat,*(cnasc++));
wr_lcd(dat,*(cnasc++));
num--;
}
}
/*导航标头显示*/
void dis_title(void)
{
display_cnasc(0x80,1,"\x15 ");
display_cnasc(0x90,1,"┏");
display_cnasc(0x97,1,"┓");
display_cnasc(0x98,1,"┗");
display_cnasc(0x9f,1,"┛");
display_cnasc(0x92,1,"\x1e ");
display_cnasc(0x9a,1,"\x1f ");
con_disp(0xff,0xff,0x80,0x80,3,16);
con_disp(0xef,0xef,0x83,0x80,1,16);
con_disp(0xde,0xf7,0x84,0x80,1,16);
con_disp(0x76,0xdb,0x85,0x80,1,16);
con_disp(0x55,0x55,0x86,0x80,1,16);
con_disp(0x55,0x55,0x87,0x80,1,16);
}
/*图片显示标头*/
void dis_title_pic(void)
{
display_cnasc(0x80,2,"〓〓");
display_cnasc(0x86,2,"〓〓");
}
/*功能实现显示标头*/
void dis_title_e(void)
{
display_cnasc(0x80,1," \x15");
con_disp(0xff,0xff,0x80,0x80,1,16);
con_disp(0xff,0xc7,0x81,0x80,1,16);
con_disp(0xff,0xff,0x82,0x80,3,16);
con_disp(0xe3,0xff,0x85,0x80,1,16);
con_disp(0xff,0xff,0x86,0x80,2,16);
}
/*显示菜单图片 格式:图片反显(1)或正常显示(0),显示图片的号码*/
void anti_nor_pic (uchar cpl_sign,uchar menu_num)
{
uchar i,j,x,y;
x=menu_num*3; // 计算图片显示坐标
if(x>6) x--;
if(menu_num<3) y=16; // 上下半屏显示
else y=8;
if(cpl_sign==1) display_cnasc(0x82,4,menu_cn[menu_num]);
for(j=0;j<24;j++)
{
for(i=0;i<2;i++)
{
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+y);
wr_lcd(comm,0x80+x+i); // 分两次显示 16bit
wr_lcd(comm,0x30);
if(cpl_sign==1) // 图片反选
{
wr_lcd(dat,~menu_pic[menu_num][j*4+i*2]);
wr_lcd(dat,~menu_pic[menu_num][j*4+i*2+1]);
}
else // 正常显示
{
wr_lcd(dat,menu_pic[menu_num][j*4+i*2]);
wr_lcd(dat,menu_pic[menu_num][j*4+i*2+1]);
}
}
y++;
if(y==32&&menu_num<3) {x+=8;y=0;} // 上下屏切换
}
wr_lcd(comm,0x36);
}
/*状态16*16图片 格式:反色(1)或正常0,X坐标,Y坐标,状态编码(16*16)*/
void dis_run_state(uchar cpl,uchar x0,uchar y0,uchar state_num)
{
uchar j;
for(j=0;j<16;j++)
{
wr_lcd(comm,0x34); // 扩展功能
wr_lcd(comm,y0++); // 写Y地址
wr_lcd(comm,x0); // 写X地址
wr_lcd(comm,0x30); // 普通功能
if(cpl==1) // 写数据
{
wr_lcd(dat,~running[state_num][j*2]);
wr_lcd(dat,~running[state_num][j*2+1]);
}
else
{
wr_lcd(dat,running[state_num][j*2]);
wr_lcd(dat,running[state_num][j*2+1]);
}
}
wr_lcd(comm,0x36);
}
/*显示菜单按钮 参数格式:反色(1)或正常(0)*/
void dis_menu_key(uchar d)
{
if(d==1)
{
for(d=0;d<8;d++) // 显示菜单按钮
con_disp(~menu_key[d*2],~menu_key[d*2+1],0x9f,0x97+d,1,1);
}
else
{
for(d=0;d<8;d++) // 显示菜单按钮
con_disp(menu_key[d*2],menu_key[d*2+1],0x9f,0x97+d,1,1);
}
}
/*显示模式3的界面*/
void dis_mode3(void)
{
uchar i,j,h,l,x_0=0x80,y_0=0x90;
h=now.hour>>4; // 分离十位 个位
l=now.hour&0x0f;
for(j=0;j<2;j++)
{
for(i=0;i<32;i++) // 十位个位一起读入
{
wr_lcd(comm,0x34);
wr_lcd(comm,y_0++);
wr_lcd(comm,x_0);
wr_lcd(comm,0x30);
wr_lcd(dat,mode_3num[h][i*3]); // 连续写数据,X坐标自动加1
wr_lcd(dat,mode_3num[h][i*3+1]);
wr_lcd(dat,mode_3num[h][i*3+2]);
wr_lcd(dat,mode_3num[l][i*3]);
wr_lcd(dat,mode_3num[l][i*3+1]);
wr_lcd(dat,mode_3num[l][i*3+2]);
if(y_0==0xa0){x_0=x_0+8;y_0=0x80;}
}
x_0=0x84,y_0=0x90;
h=now.minute>>4; // 分离十位 个位
l=now.minute&0x0f;
}
dis_run_state(0,0x83,0x90,4); // 显示点
dis_run_state(0,0x8b,0x80,4);
y_0=0x80; // 显示状态标记
if(keb) {dis_run_state(0,0x87,y_0,2);y_0+=16;}
if(alm) {dis_run_state(0,0x87,y_0,1);y_0+=16;}
if(y_0<0xa0&&!als){dis_run_state(0,0x87,y_0,0);}
if(y_0==0xa0&&!als){dis_run_state(0,0x8f,0x80,0);}
dis_menu_key(0);
}
/*显示模式1和2的共用部分*/
void mode1_2_union(void)
{
uchar x=0x9b;
display_cnasc(0x98,2,"星期");
if(nba_tim) dis_run_state(0,x,0x90,6);
if(keb) {dis_run_state(0,x,0x90,2);x++;} // 显示标记
if(alm) {dis_run_state(0,x,0x90,1);x++;}
if(!als){dis_run_state(0,x,0x90,0);}
dis_menu_key(0); // 显示菜单按钮
}
/*显示模式2的日期*/
void dis_date_mode2(uchar d)
{
uchar save[2];
display_cnasc(d+2,1,"年");
display_cnasc(d+4,1,"月");
display_cnasc(d+6,1,"日");
display_cnasc(0x9a,1,weeks[today.week]); // 显示星期
save[0]=char_num[today.year>>4]; // 将显示的数值存到数组中
save[1]=char_num[today.year&0x0f];
display_cnasc(d+1,1,save);
save[0]=char_num[today.month>>4];
save[1]=char_num[today.month&0x0f];
display_cnasc(d+3,1,save);
save[0]=char_num[today.day>>4];
save[1]=char_num[today.day&0x0f];
display_cnasc(d+5,1,save);
}
/*显示模式2的时间数字显示 16*32*/
void num2_asc_dis(uchar num,uchar x_0)
{
uchar i,y_0=0x90;
for(i=0;i<32;i++) // 十位个位一起读入
{
wr_lcd(comm,0x36);
wr_lcd(comm,y_0++);
wr_lcd(comm,x_0);
wr_lcd(comm,0x30);
wr_lcd(dat,mode_2num[num][i*2]);
wr_lcd(dat,mode_2num[num][i*2+1]);
if(i==15){x_0+=8;y_0=0x80;}
}
wr_lcd(comm,0x36);
}
/*显示模式2的时间*/
void dis_time_mode2(void)
{
uchar h,l;
if(now.hour!=save_time.hour||init_d2)
{
h=now.hour>>4; // 分离十位 个位
l=now.hour&0x0f;
num2_asc_dis(h,0x80);
num2_asc_dis(l,0x80+1);
}
if(now.minute!=save_time.minute||init_d2)
{
h=now.minute>>4; // 分离十位 个位
l=now.minute&0x0f;
num2_asc_dis(h,0x83);
num2_asc_dis(l,0x83+1);
}
if(now.second!=save_time.second||init_d2)
{
h=now.second>>4; // 分离十位 个位
l=now.second&0x0f;
num2_asc_dis(h,0x86);
num2_asc_dis(l,0x86+1);
}
if(init_d2)
{
dis_run_state(0,0x82,0x90,5); // 显示点
dis_run_state(0,0x8a,0x80,5);
dis_run_state(0,0x85,0x90,5); // 显示点
dis_run_state(0,0x8d,0x80,5);
}
}
/*显示模式2的界面*/
void dis_mode2(void)
{
dis_date_mode2(0x81); // 显示日期
display_cnasc(0x81,1,"20");
dis_time_mode2(); // 显示时间
mode1_2_union();
}
/*显示模式1的日期*/
void dis_date_mode1(void)
{
uchar save[2];
display_cnasc(0x80,3,"日期:");
display_cnasc(0x90,3,"时间:");
display_cnasc(0x88,3,"温度:");
display_cnasc(0x9a,1,weeks[today.week]); // 显示星期
display_cnasc(0x83,1,"20");
save[0]=char_num[today.year>>4];
save[1]=char_num[today.year&0x0f];
display_cnasc(0x84,1,save);
save[0]='/';
save[1]=char_num[today.month>>4];
display_cnasc(0x85,1,save);
save[0]=char_num[today.month&0x0f];
save[1]='/';
display_cnasc(0x86,1,save);
save[0]=char_num[today.day>>4];
save[1]=char_num[today.day&0x0f];
display_cnasc(0x87,1,save);
mode1_2_union();
}
/*显示模式1的时间*/
void dis_time_mode1(void)
{
uchar save[2];
save[0]=char_num[now.hour>>4];
save[1]=char_num[now.hour&0x0f];
display_cnasc(0x93,1,save);
save[0]=':';
save[1]=char_num[now.minute>>4];
display_cnasc(0x94,1,save);
save[0]=char_num[now.minute&0x0f];
save[1]=':';
display_cnasc(0x95,1,save);
save[0]=char_num[now.second>>4];
save[1]=char_num[now.second&0x0f];
display_cnasc(0x96,1,save);
}
/*显示模式1的温度*/
void dis_temp_mode1(void)
{
uchar save[2];
if(ds18b20)
{
if(temp.t_data[0]>99)
{
save[0]=char_num[temp.t_data[0]/100];
save[1]=char_num[(temp.t_data[0]/10)%10];
display_cnasc(0x8b,1,save);
save[0]=char_num[temp.t_data[0]%10];
save[1]='.';
display_cnasc(0x8c,1,save);
save[0]=char_num[temp.t_data[1]/10];
save[1]=' ';
display_cnasc(0x8d,1,save);
display_cnasc(0x8e,1,"℃");
}
else
{
if(temp_pn) display_cnasc(0x8a,1,":-");
else display_cnasc(0x8a,1,":");
save[0]=char_num[temp.t_data[0]/10];
save[1]=char_num[temp.t_data[0]%10];
display_cnasc(0x8b,1,save);
save[0]='.';
save[1]=char_num[temp.t_data[1]/10];
display_cnasc(0x8c,1,save);
display_cnasc(0x8d,1,"℃");
}
}
else display_cnasc(0x8b,3,"FF.F℃");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -