液晶显示屏-电子时钟

本文探讨了一种智能显示屏的时间管理与显示技术,详细介绍了如何通过编程实现时间的自动更新与显示,包括时间的存储、读取、显示以及按键控制等功能。重点阐述了EEPROM模块在时间存储中的应用,并提供了完整的代码实现。此外,还涉及了日期显示、时间显示、按键扫描、日期时间自然流逝、光标闪烁、星期几判断等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
液晶显示屏显示时间  : xxxx-xx-xx xxx
      xx-xx-xx
  可修改时间;
  缺陷,无法存贮数据
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define READ 0xa1
#define WRITE 0xa0

sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
sbit BUSY=P0^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit beep=P2^3;
sbit SDA=P2^0;
sbit SCL=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;

uint year,month,day,num;
uint hour,minite,second;
uint mon1[]={31,28,31,30,31,30,31,31,30,31,30,31};
uint mon2[]={31,29,31,30,31,30,31,31,30,31,30,31};
uchar code week[7][3]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
uchar i,j;
uint key,we_ju;

/***************延时*************/
void delay(uint x)
{
 uint i,j;
 for(i=0;i<110;i++)
  for(j=0;j<x;j++); 
}

/********************************/

/**************************EEPROM模块**************************************/

/*本来是用来保存时间,但功能无法实现*/

/********************************************************************************/
/*
void delayms(){;;}
void start()

 SDA=1;
 SCL=1; 
 delayms();
 SDA=0;
 delayms();
 SCL=0;  
}
void stop()
{
 SDA=0;
 SCL=1;
 delayms();
 SDA=1;
 delayms();
 SDA=0;
 SCL=0;
}
void write_byte(uchar dat)
{
 uchar i;
 for(i=0;i<8;i++)
 {
  dat<<=1;
  SCL=0;
  delayms();
  SDA=CY;
  delayms();
  SCL=1;
  delayms();
 }
 SCL=0;
 delayms();
 SDA=1;
 delayms();
}
uchar read_byte()
{
 uchar i,x;
 SCL=0;
 delayms();
 SDA=1;
 delayms();
 for(i=0;i<8;i++)
 {
  SCL=1;
  delayms();
  x<<=1;
  x|=(uchar) SDA;
  delayms();
 }    
 return x;
}
void respons()
{
 SCL=1;
 delayms();
 SCL=0;
 delayms(); 
}
void write_add(uchar add,uchar dat)
{
 start();
 write_byte(WRITE);
 respons();
 write_byte(add);
 respons();
 write_byte(dat);
 respons();
 stop();
 delayms();
}
uchar read_add(uchar add)
{
 uchar x;
 start();
 write_byte(WRITE);
 respons();
 write_byte(add);
 respons();
 start();
 write_byte(READ);
 respons();
 x=read_byte();
 stop();
 return x;
}
void write()
{
 write_add(0,second%10+'0');
 write_add(1,second/10+'0');
 write_add(2,minite%10+'0');
 write_add(3,minite/10+'0');
 write_add(4,hour%10+'0');
 write_add(5,hour/10+'0');
 write_add(6,day%10+'0');
 write_add(7,day/10+'0');
 write_add(8,month%10+'0');
 write_add(9,month/10+'0');
 write_add(10,year%10+'0');
 write_add(11,year/10%10+'0');
 write_add(12,year/100%10+'0');
 write_add(13,year/1000+'0');
}      
void read()
{
 second=(read_add(0)+read_add(1))-'0';
 minite=(read_add(2)+read_add(3))-'0';
 hour=(read_add(4)+read_add(5))-'0' ;
 day=(read_add(6)+read_add(7))-'0';
 month=(read_add(8)+read_add(9))-'0';
 year=(read_add(10)+read_add(11)+read_add(12)+read_add(13))-'0';
}  
*/
/**************************************************************************/

/***********************闰年判断****************/
int year_juge(uint y)
{
 if(y%4==0&&4%100!=0 || y%400==0) return 1;
 else return 0;
}
/*********************************************/

/**************判忙************/
void wait()
{
 P0=0xff;
 do
 {
   RS=0;
  RW=1;
  EN=0;
  EN=1;
 }while(BUSY==1);
 EN=0;
}
/*****************************/

/*************写命令********/
void write_cmd(uchar cmd)
{
 wait();
 EN=0;
 P0=cmd;
 RS=0;
 RW=0;
 EN=1;
 EN=0;
}
/****************************/

/*************写数据********/
void write_data(uchar dat)
{
 wait();
 EN=0;
 P0=dat;
 RS=1;
 RW=0;
 EN=1;
 EN=0;
}
/****************************/


/*************** 日期、时间自然流逝************/
void time_lapses()
{
 if(second>=60)
 {
  second=0;
  minite++;
  if(minite>=60)
  {
   minite=0;
   hour++;
   if(hour>=24)
   {
    hour=0;
    day++;
    if(year_juge(year))
    {
     if(day>=mon2[month])
     {
      day=0;
      month++;
      if(month>=12) month=0,year++;
      if(year>=9999) year=1;
     } 
    }
    else
    {
     if(day>=mon1[month])
     {
      day=0;
      month++;
      if(month>=12) month=0,year++;
      if(year>=9999) year=1;
     }
    }
   }
  }
 } 
}
/***************************************************************/

/*************光标闪烁*****************************/
void flicker()
{
 if(key==1) write_cmd(0x80+0x4a);
 else if(key==2) write_cmd(0x80+0x47);
 else if(key==3) write_cmd(0x80+0x44);
 else if(key==4) write_cmd(0x80+0x0c);
 else if(key==5) write_cmd(0x80+0x0a);
 else if(key==6) write_cmd(0x80+0x07);
 else if(key==7) write_cmd(0x80+0x04);
 if(key!=0) write_cmd(0x0f); 
}
/**************************************************/

/***************判断星期几*************************/
uint Week_day(uint y,uint m,uint d)
{
 if(m==1||m==2) m+=12,y--;
 return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7 ;
}
/************************************************/

/*****************时间显示**********************/
void display_time()

 we_ju=Week_day(year,month,day);

 time_lapses(); 
 write_cmd(0x80+0x01);
 write_data(year/1000+'0');
 write_data(year/100%10+'0');
 write_data(year/10%10+'0');
 write_data(year%10+'0');
 write_data('-');
 write_data(month/10+'0');
 write_data(month%10+'0');
 write_data('-');
 write_data(day/10+'0');
 write_data(day%10+'0');
 write_data(' ');
 for(i=0;i<3;i++) write_data(week[we_ju][i]);
 write_cmd(0x80+0x40+0x03);
 write_data(hour/10+'0');
 write_data(hour%10+'0');
 write_data(':');
 write_data(minite/10+'0');
 write_data(minite%10+'0');
 write_data(':');
 write_data(second/10+'0');
 write_data(second%10+'0');
// write();   
}
/************************************************/

/*************自增**********/
void add()
{
 if(key==1)
 {
   second++;
   if(second>=60) second=0;
 }
 else if(key==2)
 {
   minite++;
   if(minite>=60) minite=0;
 }
 else if(key==3)
 {
  hour++;
  if(hour>=24) hour=0;
 }
 else if(key==4) we_ju++;
 else if(key==5)
 {
  day++;
  if(year_juge(year))
  {
   if(day>=mon2[month-1]) day=1;
  }
  else if(day>=mon1[month-1]) day=1;
 }
 else if(key==6)
 {
  month++;
  if(month>12) month=1;
 }
 else if(key==7)
 {
  year++;
  if(year>9999) year=1;
 }
 display_time();
}
/*************************/

/**********自减***********/
void reduce()
{
 if(key==1)
 {
   second--;
   if(second<=0) second=59;
 }
 else if(key==2)
 {
   minite--;
   if(minite<=0) minite=59;
 }
 else if(key==3)
 {
   hour--;
   if(hour<0) hour=23;
 }
 else if(key==4) we_ju--;
 else if(key==5)
 {
   day--;
   if(day<=0)
   {
    if(year_juge(year)) day=mon2[month-1];
    else day=mon1[month-1];
   }
 }
 else if(key==6)
 {
   month--;
   if(month<=0) month=12;
 }
 else if(key==7)
 {
   year--;
   if(year<=0) year=9999;
 }
 display_time();
}
/***************************/

/***************键盘扫描****************/
void keyscan()
{
 if(k1==0)
 {
  delay(10);
  beep=0;
  if(k1==0)
  { 
   while(!k1);
   key++; 
   if(key==8) key=0;
   if(key==0) TR0=1,write_cmd(0x0c);
   else TR0=0;   
  }
  beep=1;
 }
 if(k2==0)
 {
  delay(10);
  beep=0;
  if(k2==0)
  { 
   while(!k2);
   add();  
  }
  beep=1;
 }
 if(k3==0)
 {
  delay(10);
  beep=0;
  if(k3==0)
  {
   while(!k3);
   reduce();
  }
  beep=1;
 }
}
/**************************************/

 

/*******************初*始*化****************/
void init()
{
 dula=0;
 wela=0;
 /********定时器初始化*********/
 TMOD=0x02;
 TH0=6;
 TL0=6;
 ET0=1;
 TR0=1;
 EA=1;
 /*****************************/

 /*******液晶显示屏初始化******/
 write_cmd(0x38);
 write_cmd(0x0c);
 write_cmd(0x06);
 write_cmd(0x01);
 /***************************/

 /*********时间初始化******/
 year=2014;
 month=7;
 day=29;
 hour=14;
 minite=31;
 second=22;
// read();
 /************************/
 
}
/**************************************/

/*************** 主函数 **************/
void main()
{
 init(); 
 while(1)
 {
  keyscan();
  if(key==0) display_time();
  else flicker();
  
 }
}
/**********************************/

void T0_time() interrupt 1
{
 num++;
 if(num==4000)
 {
  num=0;
  second++;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值