元器件交易网-中发网全新升级平台
关注我们:
首页 > 解决方案 > 正文

单片机设计实例LCD时钟

  单片机设计LCD数字钟(万年历)程序与电路如下:

  #include

  #include //库函数头文件,代码中引用了_nop_()函数

  // 定义控制信号端口

  sbit RS=P2^4; //P2.4

  sbit RW=P2^5; //P2.5

  sbit E=P2^6; //P2.6

  sbit set=P3^4; //设置键

  sbit enter=P3^5; //确认键

  sbit add1=P3^6; //加1键

  sbit sub1=P3^7; //减1键

  bit k=0,f=0;//k为0表示运行状态,k为1表示设置状态;f为0表示第一行显示,f为1表示第二行显示

  char sec,min,hour,week,day,month,year,n,m;

  unsigned char count,key;

  unsigned char lcdd[]="0123456789";

  /*声明调用函数*/

  void dispd(); //日期显示函数

  void dispt(); //时间显示函数

  unsigned char keys();//按键扫描函数

  void lcd_w_cmd(unsigned char com); //写命令字函数

  void lcd_w_dat(unsigned char dat); //写数据函数

  unsigned char lcd_r_start(); //读状态函数

  void int1(); //LCD初始化函数

  void delay(unsigned char t); //可控延时函数

  void delay1(); //软件实现延时函数,5个机器周期

  /*主函数*/

  void main()

  {

  TMOD=0x01; //设置为定时器模式1

  TH0=0x3c; //晶振6MHz,定时时间100ms

  TL0=0xb0;

  IE=0x82; //开全局中断和定时中断

  TR0=1; //启动定时器

  sec=0; //秒

  min=0; //分

  hour=0; //时

  week=0; //星期

  day=1; //日

  month=1; //月

  year=0; //年

  count=0; //中断次数清0

  n=-3; //设置键按下次数,第一行日期

  m=-3; //设置键按下次数,第二行时间

  P0=0xff; // 送全1到P0口

  int1(); // 初始化LCD

  delay(255);

  while(1)

  {

  key=keys(); //读取按键

  switch(key)

  {

  case 0xe0: //按下设置键

  {

  TR0=0;

  k=1;

  if(f==0)

  {

  n=n+3;

  if(n==9)

  {

  n=0;

  m=0;

  f=1;

  }

  }

  else

  {

  m=m+3;

  if(m==12)

  {

  m=0;

  n=0;

  f=0;

  }

  }

  if(f==0)

  {

  lcd_w_cmd(0x0d);

  lcd_w_cmd(0x86+n);

  }

  else

  {

  lcd_w_cmd(0x0d);

  lcd_w_cmd(0xc4+m);

  }

  } break;

  case 0xd0: //按下确认键

  {

  k=0;

  TR0=1;

  n=-3;

  m=-3;

  f=0;

  } break;

  case 0xb0: //按下加1键

  {

  if(k==1)

  {

  if(f==0)

  {

  if(n==0){year++;if(year==100) year=0;}

  else if(n==3) {month++;if(month==13) month=1;}

  else {day++;if(day==32) day=1;}

  dispd(); //调用第一行显示函数

  lcd_w_cmd(0x0d); //光标闪烁

  lcd_w_cmd(0x86+n);//返回设置值显示地址

  }

  else

  {

  if(m==0){hour++;if(hour==24) hour=0;}

  else if(m==3) {min++;if(min==60) min=0;}

  else if(m==6){sec++;if(sec==60) sec=0;}

  else {week++;if(week==7) week=0;}

  dispt(); //调用第二行显示函数

  lcd_w_cmd(0x0d); //光标闪烁

  lcd_w_cmd(0xc4+m);//返回设置值显示地址

  }

  }

  } break;

  case 0x70: //按下减1键

  {

  if(k==1)

  {

  if(f==0)

  {

  if(n==0){year--;if(year

  /*****定时中断函数*****/

  void timer0() interrupt 1

  {

  TH0=0x3c;

  TL0=0xb0;

  count++;

  if(count==10)

  {

  count=0;

  sec++;

  if(sec==60)

  {

  sec=0;

  min++;

  if(min==60)

  {

  min=0;

  hour++;

  if(hour==24)

  {

  hour=0;

  week++;

  day++;

  if(week==7) week=0;

  if(day==29&&month==2&&year%4!=0) {day=1;month++;}

  else if(day==30&&month==2&&year%4==0) {day=1;month++;}

  else if(day==31&&(month==4||month==6||month==9||month==11)) {day=1;month++;}

  else if(day==32&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12)) {day=1;month++;}

  if(month==13)

  {

  month=1;

  year++;

  if(year==100) year=0;

  }

  }

  }

  }

  }

  }

  /*按键扫描函数*/

  unsigned char keys()

  {

  unsigned char cod,del;

  P3=0xf0;

  cod=P3&0xf0; //读入P3口键值

  if(cod!=0xf0) //先检测有无按键按下

  {

  delay(100); //去抖

  if(cod!=0xf0)

  {

  cod=P3&0xf0; //读入键值

  do //等待键释放

  {

  P3=0xf0;

  del=P3&0xf0;

  }while(del!=0xf0);

  return(cod);//返回键值

  }

  }

  return(0xf0); //返回该值

  }

  /*第一行显示日期函数*/

  void dispd()

  {

  lcd_w_cmd(0x0c); //设置光标不显示、不闪烁

  delay(20);

  lcd_w_cmd(0x83); //第一行起始显示地址0x80+0x03

  delay(20);

  lcd_w_dat("2");

  delay(2);

  lcd_w_dat("0");

  delay(2);

  lcd_w_dat(lcdd[year/10]);

  delay(2);

  lcd_w_dat(lcdd[year%10]);

  delay(2);

  lcd_w_dat("-");

  delay(2);

  lcd_w_dat(lcdd[month/10]);

  delay(2);

  lcd_w_dat(lcdd[month%10]);

  delay(2);

  lcd_w_dat("-");

  delay(2);

  lcd_w_dat(lcdd[day/10]);

  delay(2);

  lcd_w_dat(lcdd[day%10]);

  delay(2);

  }

  /*第二行显示时间、星期函数*/

  void dispt()

  {

  lcd_w_cmd(0x0c); //设置光标不显示、不闪烁

  delay(20);

  lcd_w_cmd(0xc3); //第二行起始显示地址0x80+0x43

  delay(20);

  lcd_w_dat(lcdd[hour/10]);

  delay(2);

  lcd_w_dat(lcdd[hour%10]);

  delay(2);

  lcd_w_dat(":");

  delay(2);

  lcd_w_dat(lcdd[min/10]);

  delay(2);

  lcd_w_dat(lcdd[min%10]);

  delay(2);

  lcd_w_dat(":");

  delay(2);

  lcd_w_dat(lcdd[sec/10]);

  delay(2);

  lcd_w_dat(lcdd[sec%10]);

  delay(2);

  lcd_w_dat(" ");

  delay(2);

  lcd_w_dat("W");

  delay(2);

  lcd_w_dat(lcdd[week]);

  delay(2);

  }

扫描左侧的二维码

科技圈最新动态一手掌握
每日砸蛋,中奖率100%