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

📄 lcd1602时钟显示.c

📁 数字时钟显示
💻 C
字号:
 /*  用1602LCD液晶做的一个时钟,包括星期,日期

 ***************************
  
 s1作为位选,每按一次,就选一位,按第九次屏幕恢复正常

 s2作为加法键 在s1按下的时候才能进行加法

 s3作为减法键 在s1按下的时候才能进行减法     */ 

#include "reg51.h"
 #define uchar unsigned char
 #define uint unsigned int
 uchar code table[]=" 0000-00-00 000" ;//初始化日期和星期
 uchar code table1[]="    00:00:00";//初始化时间
 uchar code table2[][3]={"MOD","TUE","WED","THU","FRI","SAT","SUN"};//定义星期数组
 uint code table3[]={31,31,28,31,30,31,30,31,31,30,31,30,31};
 //以下三个是定义LCD的引脚
 sbit lcden=P1^3;
 sbit lcdwrite=P1^1;
 sbit lcdrs=P1^2;
 //定义四个功能开关
 sbit s1=P1^4;
 sbit s2=P1^5;
 sbit s3=P1^6;
 sbit s=P1^7;
 //定义时间、时、分、秒、年、月、日等变量
 uchar time;
 char hour,min,sec,day,mon,year1,year2,xingqi,num;
//延时程序
 void delay(uint z)
{
   uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
//lcd的写指令
void write_com(uchar com)
{
 lcdrs=0;
 lcden=0;
 P2=com;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}
//lcd的写数据
void write_data(uchar da)
{
 lcdrs=1;
 lcden=0;
 P2=da;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}
//初始化
void init()
{
 uchar num;
    lcdwrite=0;jiao   
    lcden=0;
 write_com(0x38); //16*2显示,5*7点阵,8位数据
 write_com(0x0c);//显示开,关光标
 write_com(0x06); //移动光标
 write_com(0x01);//清除LCD的显示内容
 for (num=0;num<15;num++)
 {
  write_data(table[num]);
  delay(5);
 }
 write_com(0x80+0x40);
  for (num=0;num<12;num++)
  {
   write_data(table1[num]);
   delay(5);
  }
  TMOD=0x01;
  TL0=(65536-46080)%256;
    TH0=(65536-46080)/256;
  EA=1;
  ET0=1;
  TR0=1;
  
}
//时间走动的显示
write_hms(uchar add,uchar da)
{
 uchar shi,ge;
 shi=da/10;
 ge=da%10;
 write_com(0x80+0x40+add);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
//日期走动的显示
write_ymd(uchar add,uchar da)
{
 uchar shi,ge;
 shi=da/10;
 ge=da%10;
 write_com(0x80+add);
 write_data(0x30+shi);
 write_data(0x30+ge); 
}
//星期走动的显示
void write_xingqi(char xingqi)
{
char num;
write_com(0x80+12);
for(num=0;num<3;num++) 
  write_data(table2[xingqi][num]);

}

//键盘扫描
void keyscan()
{
 s=0;
 if(s1==0)//如果S1按下去,执行相应的操作
   {
  delay(5);//消除抖动
  if(s1==0)
  {
   num++;
   while(!s1);
   if(num==1)
   {
    TR0=0;//关定时器
    write_com(0x80+0x40+11);//选定秒
    write_com(0x0f);
   }
  }  
  if(num==2)//选定分
  {
   write_com(0x80+0x40+8);
  }
  if(num==3)//选定时
  {
   write_com(0x80+0x40+5);
  }
  if(num==4)//选定星期
  {
   write_com(0x80+12);
   write_com(0x0f);
  }
  if(num==5)//选定日
  {
   write_com(0x80+10);
  }
  if(num==6)//选定月
  {
   write_com(0x80+7);
  }
  if(num==7)//选定年后两位
  {
   write_com(0x80+4);
  }
  if(num==8)//选定年前两位
  {
   write_com(0x80+2);
  }
  if(num==9)//恢复
  {
   num=0;
   write_com(0x0c);
   TR0=1;//重复开定时器
  } 
 }
 if(num!=0)
 {
  if(s2==0)//如果s2按下调理参数
  {
   delay(5);
   if(s2==0)
   {
    while(!s2);
    if(num==1)
    {
     sec++;//调秒并显示加1
     if(sec==60)
     sec=0;
     write_hms(10,sec);
     write_com(0x80+0x40+11);
    }
    if(num==2)//调分并显示加1
    {
     min++;
     if(min==60)
      min=0;
      write_hms(7,min);
      write_com(0x80+0x40+8);
    }
    if(num==3)//调时并显示加1
    {
     hour++;
     if(hour==24)
      hour=0;
      write_hms(4,hour);
      write_com(0x80+0x40+5);
    }
    if(num==4)//调星期并显示加1
    {
     xingqi++;
     if(xingqi==7)
     xingqi=0;
     write_xingqi(xingqi);
     write_com(0x80+14);
    }
    if(num==5)
    {
     day++;//调日并显示加1
     if(day==table3[mon]+1)
      day=1;
      write_ymd(9,day);
      write_com(0x80+10);
    }
    if(num==6)//调月并显示加1
    {
     mon++;
     if(mon==13)
      mon=1;
      write_ymd(6,mon);
      write_com(0x80+7);
    }
    if(num==7)//调年前位并显示加1
    {
     year1++;
     if(year1==100)
      year1=0;
      write_ymd(3,year1);
      write_com(0x80+4);
    }
    if(num==8)//调年后位并显示加1
    {
     year2++;
     if(year2==100)
      year2=0;
      write_ymd(1,year2);
      write_com(0x80+2);
    }
   }
  }
  if(s3==0)
  {
   delay(5);
   if(s3==0)
   {
    while(!s3);
    if(num==1)//调秒并显示减1
    {
     sec--;
     if(sec==-1)
     sec=59;
     write_hms(10,sec);
     write_com(0x80+0x40+11);
    }
    if(num==2)//调分并显示减1
    {
     min--;
     if(min==-1)
      min=59;
      write_hms(7,min);
      write_com(0x80+0x40+8);
    }
    if(num==3)//调时并显示减1
    {
     hour--;
     if(hour==-1)
      hour=23;
      write_hms(4,hour);
      write_com(0x80+0x40+5);
    }
    if(num==4)//调星期并显示减1
    {
     xingqi--;
     if(xingqi==-1)
      xingqi=6;
      write_xingqi(xingqi);
      write_com(0x80+14);
    }
    if(num==5)//调日并显示减1
    {
     day--;
     if(day==0)
      day=table3[mon];
      write_ymd(9,day);
      write_com(0x80+10);
    }
    if(num==6)//调月并显示减1
    {
     mon--;
     if(mon==0)
      mon=12;
      write_ymd(6,mon);
      write_com(0x80+7);
    }
    if(num==7)//调年前两拉并显示减1
    {
     year1--;
     if(year1==-1)
      year1=0;
      write_ymd(3,year1);
      write_com(0x80+4);
    }
    if(num==8)//调年后两拉并显示减1
    {
     year2--;
     if(year2==-1)//减1到0重设为0
      year2=0;
      write_ymd(1,year2);
      write_com(0x80+2);
    }
   }
  }
 }
}

//主函数
void main ()
{
 init();
  while(1)
  {
  keyscan();
  }
}
//中断定时
void timer0() interrupt 1
{
   TL0=(65536-50000)%256;//定时50ms
   TH0=(65536-50000)/256;
   time++;
 if(time==20)//1s定时到
   {
  time=0;
  sec++;//秒加1
  if(sec==60)
  {
   sec=0;
   min++;//分钟加1
   if(min==60)
   {
    min=0;
    hour++;//小时加1
    if(hour==24)
    {
     hour=0;
     day++;//日期的日加1
        xingqi++;//星期加1
        if(day==table3[mon]+1)
        {
           day=1;
           mon++;//月加1
           if(mon==13)//加到13重设为1
         {
          mon=1;
          year1++;
          if(year1==100)//年前两位加到100重设为0
          {
             year1=0;
             year2++;//年后两位加1
             if(year2==100)//年后两位加到100重设为0
             {
               year2=0;
             }
        write_ymd(1,year2);
       }
       write_ymd(3,year1);
      }
      write_ymd(6,mon);
     }
     write_ymd(9,day);
     if(xingqi==7)//如果星期到七就设为0
     xingqi=0;
     write_xingqi(xingqi);
    }
    write_hms(4,hour);
   }
   write_hms(7,min);
  }
  write_hms(10,sec);
 } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -