⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liquid.c

📁 使用的是8951单片机实现万年历的程序,并且有液晶显示..还有proteus文件可以直接仿真 ...请求加分,原创.
💻 C
📖 第 1 页 / 共 2 页
字号:
{
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 + -