📄 liquid.c
字号:
{
enable_add=0;
day_counter=1;
}
}
else
{
if(month_counter==2&&day_counter==29)
{
enable_add=0;
day_counter=1;
}
}
if(month_counter==3&&day_counter==31)/////三月
{
enable_add=0;
day_counter=1;
}
if(month_counter==4&&day_counter==30)/////四月
{
enable_add=0;
day_counter=1;
}
if(month_counter==5&&day_counter==31)/////五月
{
enable_add=0;
day_counter=1;
}
if(month_counter==6&&day_counter==30)/////六月
{
enable_add=0;
day_counter=1;
}
if(month_counter==7&&day_counter==31)/////七月
{
enable_add=0;
day_counter=1;
}
if(month_counter==8&&day_counter==31)/////八月
{
enable_add=0;
day_counter=1;
}
if(month_counter==9&&day_counter==30)/////九月
{
enable_add=0;
day_counter=1;
}
if(month_counter==10&&day_counter==31)/////十月
{
enable_add=0;
day_counter=1;
}
if(month_counter==11&&day_counter==30)/////十一月
{
enable_add=0;
day_counter=1;
}
if(month_counter==12&&day_counter==31)/////十二月
{
enable_add=0;
day_counter=1;
}
if(enable_add==1)day_counter++;////////正常情况下的加法计数
break;
case 4:///调整时的值
if(hour_counter==23)
hour_counter=0;
else
hour_counter++;
break;
case 5:////调整分的值
if(minute_counter==59)
minute_counter=0;
else
minute_counter++;
break;
case 6:///调整秒的值
if(second_counter==59)
second_counter=0;
else
second_counter++;
break;
case 7:////调整闹钟的使能
if(ring_enable==1)
ring_enable=0;
else
ring_enable=1;
break;
case 8:////调整闹钟的时
if(ring_hour==23)
ring_hour=0;
else
ring_hour++;
break;
case 9:////调整闹钟的分
if(ring_min==59)
ring_min=0;
else
ring_min++;
case 10:
if(week_counter==6)
week_counter=0;
else
week_counter++;
break;
}
break;
case 3://///读到的开关状态功能键开关加1
function++;
if(function==11)function=0;
break;
default:break;
}
//////**开关的处理函数结束***////////
}
void time_process(){
/////****读开关处理*****////
int tmp;
tmp=read_key();//////读开关的状态编号
key_process(tmp);////处理开关的状态
if(counter>=200)//////看50ms的计数器是不是记到了20次,即达到一秒
{
counter=0;
second_counter++;
}
///***达到60秒的情况**///////
if(second_counter>=60)
{
second_counter=0;
minute_counter++;
}
///***达到60分的情况**///////
if(minute_counter>=60)
{
minute_counter=0;
hour_counter++;
}
///***达到24小时的情况**///////
if(hour_counter>=24)
{
hour_counter=0;
day_counter++;/////天数变多
week_counter++;////星期数加1
week_counter=week_counter%7;
}
////////***达到一个月30天的情况***///////////
if(month_counter==1&&day_counter>31)////一月大
{
day_counter=1;
month_counter++;
}
if(year_counter%4==0)/////闰年的情况
{
if(month_counter==2&&day_counter>28)////二月一个月28天
{
day_counter=1;
month_counter++;
}
}
else/////平年的情况
{
if(month_counter==2&&day_counter>29)////二月一个月29天
{
day_counter=1;
month_counter++;
}
}
if(month_counter==3&&day_counter>31)////三月大
{
day_counter=1;
month_counter++;
}
if(month_counter==4&&day_counter>30)////四月小
{
day_counter=1;
month_counter++;
}
if(month_counter==5&&day_counter>31)////五月大
{
day_counter=1;
month_counter++;
}
if(month_counter==6&&day_counter>30)////六月小
{
day_counter=1;
month_counter++;
}
if(month_counter==7&&day_counter>31)////七月大
{
day_counter=1;
month_counter++;
}
if(month_counter==8&&day_counter>31)////八月大
{
day_counter=1;
month_counter++;
}
if(month_counter==9&&day_counter>30)////九月小
{
day_counter=1;
month_counter++;
}
if(month_counter==10&&day_counter>31)////十月大
{
day_counter=1;
month_counter++;
}
if(month_counter==11&&day_counter>30)////十一月小
{
day_counter=1;
month_counter++;
}
if(month_counter==12&&day_counter>31)////十二月大
{
day_counter=1;
month_counter=1;
year_counter++;//////
}
/*
if(day_counter>30)
{
day_counter=0;
month_counter++;
}
*/
////////////****达到12个月的情况****/////////////
if(month_counter>12)
{
month_counter=1;
year_counter++;
}
}
void chk_busy (void);
/***************************************************************************************************
//////////////////以下为读键盘显示的程序///////////
/***************************************************************************************************/
///键盘中,P0口的低四位为行位,接地,相当于在开关的下一面,一直为低电平
//////P0口的高四位为列位,通过电阻连接到5V的电源上,通常情况下为高电平,在开关摁下为低电平
//sbit data_out=P0^6;
//sbit clock=P0^7;
/////led 数组里存放的是数码管的八段显示的值,初始为全灭的状态////////////////
unsigned char led[]={0xff,0xff,0xff,0xff,0xff,0xff};
///////flag标志位的作用是标记当前的亮的数码管是第几个,取值范围为0到5,分别表示六个数码管
unsigned char flag=0;
/*void delay(unsigned char i)
{
while(--i);
}
//精确延时,,,,(i-1)*2+5微秒
///开关防抖动通常延时10MS,取I的值为4*/
/*
void delay (uint us)
{
while(us--);
}
/*---------------延时子程序----------------*/
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++)
;
}
/*------------写数据或命令到LCD--------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy ();
di=dat_comm;
rw=0;
data_ora=content;
e=1;
;
e=0;
}
/*--------------读LCD数据---------------*/
uchar rd_lcd ()
{
uchar rddata;
chk_busy ();
di=1;
rw=1;
e=1;
;
rddata=data_ora;
e=0;
return rddata;
}
///////**chk_busy函数的作用是测试液晶现在是不是处于忙的状态**/////////
void chk_busy (void)
{
data_ora=0xff;
di=0;
rw=1;
;
e=1;
e=0;
}
/*--------------写点阵------------------*/
void lat_disp (uchar data1,uchar data2)
{
uchar i,j;
cs1=1;cs2=1;
wr_lcd (comm,disp_on);
for(j=0;j<8;j++)
{
wr_lcd (comm,disp_x+j);////disp_x为页地址,起始页为第0页,页数不会自动加1,所以要软件设置一下
wr_lcd (comm,disp_z);//////disp_z为起始行,起始行为第0行,行数会自动加1,软件不要加值
wr_lcd (comm,disp_y);//////dis_y为起始列,起始为第0列,列数会自动加1,软件不要加值
for(i=0;i<32;i++)
{
//////对于
wr_lcd (dat,data1);
wr_lcd (dat,data2);
}
}
}
/*---指定位置(x,y)显示row_xl行(每行row_yl个)汉字(大小8xl*yl)---*/
//8*x1是每个汉字的行数,一般为2,y1为列数,一般为16
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn)
{
uchar i,j,k,l,a;
wr_lcd (comm,disp_on);
for(l=0;l<row_xl;l++)
{
for(k=0;k<row_yl;k++)
{
for(j=0;j<xl;j++)
{
wr_lcd (comm,disp_x+x+l*xl+j);
wr_lcd (comm,disp_z);
wr_lcd (comm,disp_y+y+k*yl);
a=l*xl*yl*row_yl+k*xl*yl+j*yl;
for(i=0;i<yl;i++)
wr_lcd (dat,chn[a+i]);
}
}
}
}
/*------------------初始化-----------------*/
void init_lcd (void)
{
rst=0;
delay(50);
rst=1;
cs1=1;cs2=1;
wr_lcd (comm,disp_off);
wr_lcd (comm,disp_on);
}
/*---------------显示不变的一些字符-----------------*/
void disp_static(void)
{
lat_disp(0x00,0x00);////实现清屏的功能////
delay1(100);
cs1=1;cs2=0;//////显示左半屏幕的不变的值
chn_disp (0,32,2,16,1,1,year);
chn_disp (2,32,2,16,1,1,hour);
chn_disp (4,0,2,16,1,2,naozhong);
chn_disp (6,16,2,16,1,1,hour);
chn_disp (6,48,2,16,1,1,miniute);
cs1=0;cs2=1;
chn_disp (0,0,2,16,1,1,month);
chn_disp (0,32,2,16,1,1,day);
chn_disp (2,0,2,16,1,1,miniute);
chn_disp (2,32,2,16,1,1,second);
chn_disp (4,0,2,16,1,2,week);
}
void clear_year()/////刷屏年所在的位置
{
char tmp;
cs1=1;cs2=0;
for(tmp=0;tmp<4;tmp++)
chn_disp(0,8*tmp,2,8,1,1,clear);
}
/////////////刷屏2*16区域的大小/////////////
void clear_two(char sel1,char sel2,char x_pos,char y_pos)
{
char tmp;
cs1=sel1;cs2=sel2;
for(tmp=0;tmp<2;tmp++)
chn_disp(x_pos,y_pos+tmp*8,2,8,1,1,clear);
}
void disp_changeable(int nian,char yue,char ri,char shi,char fen,char miao,char ring_state,char ring_shi,char ring_fen,char fun)
{
char tmp;
char tmp1;
cs1=1;cs2=0;////////首先显示左半屏
////*** 显示年份,首先要刷屏 **////
if(fun==1)
{clear_year();////刷屏
delay(100);
}
for(tmp=0;tmp<4;tmp++)
{
tmp1=nian%10;
chn_disp(0,24-tmp*8,2,8,1,1,conv_point(tmp1));
nian=nian/10;
}
/////** 显示月份, ***/////
if(fun==2)clear_two(1,0,0,48);
for(tmp=0;tmp<2;tmp++)
{
tmp1=yue%10;
chn_disp(0,56-tmp*8,2,8,1,1,conv_point(tmp1));
yue=yue/10;
}
/////////**** 显示时 ***////////////
if(fun==4)clear_two(1,0,2,16);////刷屏
for(tmp=0;tmp<2;tmp++)
{
tmp1=shi%10;
chn_disp(2,24-tmp*8,2,8,1,1,conv_point(tmp1));
shi=shi/10;
}
//////////*** 显示分的值 ****/////////////
if(fun==5)clear_two(1,0,2,48);
for(tmp=0;tmp<2;tmp++)
{
tmp1=fen%10;
chn_disp(2,56-tmp*8,2,8,1,1,conv_point(tmp1));
fen=fen/10;
}
////////*** 显示闹钟的使能(开or关) ****//////////
if(fun==7)clear_two(1,0,4,32);////刷屏
if(ring_state==1)
chn_disp(4,32,2,16,1,1,open);
else
chn_disp(4,32,2,16,1,1,close);
/////////**** 显示闹钟时 ***////////////
if(fun==8)clear_two(1,0,6,0);////刷屏
for(tmp=0;tmp<2;tmp++)
{
tmp1=ring_shi%10;
chn_disp(6,8-tmp*8,2,8,1,1,conv_point(tmp1));
ring_shi=ring_shi/10;
}
//////////*** 显示闹钟的分 ***////////////
if(fun==9)clear_two(1,0,6,32);////刷屏
for(tmp=0;tmp<2;tmp++)
{
tmp1=ring_fen%10;
chn_disp(6,40-tmp*8,2,8,1,1,conv_point(tmp1));
ring_fen=ring_fen/10;
}
cs1=0;cs2=1;////显示右半屏的数值
////////*** 显示日期 ***///////
if(fun==3)clear_two(0,1,0,16);////刷屏
for(tmp=0;tmp<2;tmp++)
{
tmp1=ri%10;
chn_disp(0,24-tmp*8,2,8,1,1,conv_point(tmp1));
ri=ri/10;
}
////////**** 显示秒的值 ****////////
if(fun==6)clear_two(0,1,2,16);////刷屏
for(tmp=0;tmp<2;tmp++)
{
tmp1=miao%10;
chn_disp(2,24-tmp*8,2,8,1,1,conv_point(tmp1));
miao=miao/10;
}
//////** 显示星期的值 ***//////
if(fun==10)clear_two(0,1,4,32);
chn_disp(4,32,2,16,1,1,week_point(week_counter%7));
}
void ring_process(void)
{
if(hour_counter==ring_hour&&minute_counter==ring_min&&ring_enable==1)///如果定时到了时间
{
cs1=0;cs2=1;
chn_disp(6,16,2,16,1,3,time_up);
}
else
{
cs1=0;cs2=1;
clear_two(0,1,6,16);
clear_two(0,1,6,32);
clear_two(0,1,6,48);
}
}
/*------------------主程序--------------------*/
void main ()
{
init_lcd ();/////初始化液晶
initial_timer();/////初始化定时器
disp_static();////显示静态的字符
while(1){
enable_add=1;
enable_sub=1;
time_process();
disp_changeable(year_counter,month_counter,day_counter,hour_counter,minute_counter,second_counter,ring_enable,ring_hour,ring_min,function);
ring_process();////处理闹钟的状态
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -