LCD显示时钟

本文介绍了一个基于51单片机的时钟程序设计,该程序能够实时更新并显示时间,并具备整点报时功能。通过四个按键可以调整小时和分钟。程序还实现了简单的中断处理和服务功能。
#include<reg52.h> 
#define uchar unsigned char 
#define uint unsigned int 
#define KEY_IO P3 
#define LCD_IO P0 
sbit LCD_RS = P2^0; 
sbit LCD_RW = P2^1; 
sbit LCD_EN = P2^2; 
sbit SPK = P1^2; 
sbit LED = P2^4;  
bit new_s, modify = 0;  
char t0, sec = 50, min = 59, hour = 23;  
char code LCD_line1[] = "Clock!"; 
char code LCD_line2[] = " 00:00:00 "; 
char Timer_buf[] = "23:59:50";  //--------------------------------------------------- 
void delay(uint z) 
{      
uint  x, y;     
 for(x = z; x > 0; x--)  
for(y = 100; y > 0; y--);
}  
//--------------------------------------------------- 
void W_LCD_Com(uchar com)      //写指令 
{   
   LCD_RS = 0; 
 LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令   
  LCD_EN = 1; 
 delay(5); 
LCD_EN = 0; //用EN输入一个高脉冲
 }  
//--------------------------------------------------- 
void W_LCD_Dat(uchar dat)      //写数据 
{     
 LCD_RS = 1; 
 LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据   
  LCD_EN = 1; 
 delay(5);
 LCD_EN = 0; //用EN输入一个高脉冲
 }  
//---------------------------------------------------  
void W_LCD_STR(uchar *s)       //写字符串
 { 
     while(*s) 
 W_LCD_Dat(*s++);
 }  
//--------------------------------------------------- 
 void W_BUFF(void)              //填写显示缓冲区 
{    
  Timer_buf[7] = sec % 10 + 48;
 Timer_buf[6] = sec / 10 + 48;   
  Timer_buf[4] = min % 10 + 48;
 Timer_buf[3] = min / 10 + 48;   
  Timer_buf[1] = hour % 10 + 48;
Timer_buf[0] = hour / 10 + 48;    
 W_LCD_Com(0xc0 + 7);
 W_LCD_STR(Timer_buf);
}  
//--------------------------------------------------- 
uchar read_key(void)
 {    
  uchar  x1, x2;   
  KEY_IO = 255;   
  x1 = KEY_IO;  
   if (x1 != 255) 
{   
    delay(100);  
     x2 = KEY_IO;      
  if (x1 != x2) 
 return 255;     
   while(x2 != 255)
 x2 = KEY_IO;  
     if(x1 == 0x7f) 
 return 0;      
 else if 
(x1 == 0xbf) 
 return 1;   
    else if (x1 == 0xdf) 
 return 2;     
  else if (x1 == 0xef)  
return 3;      
 else if (x1 == 0xf7) 
 return 4;   
  }     
 return 255;
} 
 //--------------------------------------------------- 
void Init() 
{    
  LCD_RW = 0;  
    W_LCD_Com(0x38);
 delay(50);   
  W_LCD_Com(0x0c); 
    W_LCD_Com(0x06); 
    W_LCD_Com(0x01);  
    W_LCD_Com(0x80);
 W_LCD_STR(LCD_line1); 
    W_LCD_Com(0xC0);
 W_LCD_STR(LCD_line2); 
    TMOD = 0x01;   //T0定时方式1   
  TH0 = 0x4c;    
  TR0 = 1;       //启动T0    
  PT0 = 1;       //高优先级, 以保证定时精度   
  ET0 = 1;    
 EA = 1; 
}  //--------------------------------------------------- 
void main()
 {   
    uint i, j; 
    uchar Key; 
    Init();    
   while(1) 
  { 
 //-------------------------------    
    if (new_s) 
{ 
//如果出现了新的一秒, 修改时间      
   new_s = 0;  
  sec++;
  sec %= 60;   
      if(!sec)  
      {   
        min++; 
        min %= 60;  
         if(!min) 
 { 
hour++;
 hour %= 24;
}    
     }  
        W_BUFF();  //写显示
//-------------------------------  
        if (!sec && !min)
 { 
//整点报时       
    for (i = 0; i < 200; i++)
 {   
           SPK = 0;
 for (j = 0; j < 100; j++);  
           SPK = 1; 
for (j = 0; j < 100; j++);    
     } 
}      
 }  //-------------------------------     
   Key = read_key();  //读出按键      
  switch(Key) 
{    
  //分别处理四个按键    
   case  0: modify = 1; break;     
   case  1: if(modify) 
{
min++;
 min %= 60; 
 W_BUFF(); 
break;
} 
 case  2: if(modify) 
{
hour++;
 hour %= 24; 
W_BUFF();
 break;
}      
 case  3: modify = 0; break;     }
 } 
}  
//--------------------------------------------------- 
 void timer0(void) interrupt 1  //T0中断函数, 50ms执行一次 
{    
  TH0 = 0x4c;   
   t0++;
 t0 %= 20;  
 //20, 一秒钟    
  if(t0 == 0) 
 {
new_s = 1;
 LED = ~LED;
}    
 if(modify) 
 LED = 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XuLujuncsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值