【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度

简介: 【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度

在51开发板上面实现,晶振为:11.0592Mhz

电路如下:

LCD1602

蜂鸣器部分:

 

 

 

显示时间界面:

更改时间页面:

设置触发闹钟时间页面:

设置闹钟响铃时长页面:(O泡时间长度  为3秒)

k1按键

按下第1次,可以对小时进行校准
按下第2次,可以对分钟进行校准
按下第3次,可以对秒数进行校准
按下第4次,时间开始走动

k2按键

k3按键

k4按键

按下第一次,可以设置触发闹铃的小时
按下第二次,可以更改触发闹铃的分钟
按下第三次,可以设置闹铃的响铃时长,单位为秒
按下第四次,返回显示时间页面

实现代码:

#include <REGX52.H>
typedef unsigned char uchar;
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
char hour=23,minute=59,second=58;//时钟变量
char S=3,M=0,H=0;//闹钟初值,S代表闹钟要打铃 的秒数(时长)
uchar mode=0,T0_flag=0;
 
void Delay(unsigned int xms)
{//延时函数
  uchar i, j;
  while(xms--){
    i = 2;
    j = 239;
    do{
      while (--j);
    } while (--i);
  }
}
void LCD_WriteCmd(uchar Command)
{//写命令函数
  LCD_RS=0;
  LCD_RW=0;
  P0=Command;
  LCD_E=1;
  Delay(1);
  LCD_E=0;
  Delay(1);
}
void LCD_WriteData(uchar Data)
{//写数据函数
  LCD_RS=1;
  LCD_RW=0;
  P0=Data;
  LCD_E=1;
  Delay(1);
  LCD_E=0;
  Delay(1);
}
 
void LCD_Init(void)
{//初始化lcd1602
  LCD_WriteCmd(0x38);
  LCD_WriteCmd(0x0C);
  LCD_WriteCmd(0x06);
  LCD_WriteCmd(0x01);
}
void LCD_SetCursor(uchar Line,uchar Column)
{//选择显示的行和列,参数1:行,参数2:列
    LCD_WriteCmd(Column-1|(Line==1?0x80:0xC0));
}
 
void LCD_ShowString(uchar Line,uchar Column,char *String)
{//选择要显示的字字符串,参数1:行,参数2:列参数3:字符串
  unsigned char i;
  LCD_SetCursor(Line,Column);
  for(i=0;String[i]!='\0';i++)
    LCD_WriteData(String[i]);
}
void LCD_ShowTime(char h,char m,char s)
{ //在LCD1602上面 显示时间界面
        LCD_SetCursor(2,5);   
    LCD_WriteData(h/10+0x30);
        LCD_WriteData(h%10+0x30);
        LCD_WriteData(':');
        LCD_WriteData(m/10+0x30);
        LCD_WriteData(m%10+0x30);
        LCD_WriteData(':');
        LCD_WriteData(s/10+0x30);
        LCD_WriteData(s%10+0x30);             
}
 
void LCD_ShowSetSlarm()
{//显示 设置闹铃时间界面    
        LCD_ShowString(2,1,"hour:");                 
    LCD_WriteData(H/10+0x30);
        LCD_WriteData(H%10+0x30);
        LCD_ShowString(2,10,"min:");        
        LCD_WriteData(M/10+0x30);
        LCD_WriteData(M%10+0x30);        
}
void LCD_ShowSetDuration()
{//显示 设置闹铃时长界面
    LCD_ShowString(2,1,"duration:");
    LCD_WriteData(S/10+0x30);
    LCD_WriteData(S%10+0x30); 
     LCD_ShowString(2,12,"s");
}
void key_scan()
{//按键扫描,进行模式和档位的更改 
    static uchar flag=0;
    if(P3_1==0){   //档位选择
        Delay(20);
        while(P3_1==0);
        Delay(20);
        TR0=0;//关闭T0中断请求
        flag++;
        if(flag==4){
            flag=0;
            LCD_WriteCmd(0x01);//清屏
            TR0=1;
            }
    }
    if(P3_3==0){//模式切换按键
        Delay(20);
        while(P3_3==0);
        Delay(20);
        LCD_WriteCmd(0x01);
        mode++; 
        if(mode==4)//模式切换成时钟模式 
            mode=0;       
    }
    if(mode==0){    //时钟模式  
        if(flag!=0){
            LCD_ShowString(1,2,"Change Time");
            switch(flag){
                case 1:if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);hour++; if(hour>23) hour=0;}break;
                case 2:if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);minute++; if(minute>59) minute=0;}break;
                case 3:if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);second++; if(second>59) second=0;}break;
                default:break;
            }
            switch(flag){
                case 1:if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);hour--; if(hour<0) hour=23;}break;
                case 2:if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);minute--; if(minute<0) minute=59;}break;
                case 3:if(P3_2==0){ Delay (20);while(P3_2==0);Delay(20);second--; if(second<0) second=59;}break;
                default:break;
            }
        }else{
            LCD_ShowString(1,7,"Time");
        }
    }else if(mode==1){//闹钟时 设置
        LCD_ShowString(1,4,"Set alarm");
        if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);H++;if(H>23) H=0;}
        if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);H--;if(H<0) H=23;}        
    }else if(mode==2){//闹钟分 设置
        LCD_ShowString(1,4,"Set alarm");
        if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);M++;if(M>59) M=0;}
        if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);M--;if(M<0)  M=59;}        
    }else if(mode==3){//设置响铃时长,单位为秒
        LCD_ShowString(1,4,"O pao Time");       //O泡时间到
        if(P3_0==0){ Delay(20);while(P3_0==0);Delay(20);S++;if(S>59) S=0;}
        if(P3_2==0){ Delay(20);while(P3_2==0);Delay(20);S--;if(S<0)  S=59;}        
    }       
}
void Timer0Init()
{//定时器0初始化函数,定时:50毫秒  晶振为:11.0592MHz
  TMOD &= 0xF0;   //设置定时器模式
  TMOD |= 0x01;   //设置定时器模式
  TL0 = 0x00;       //设置定时初值
  TH0 = 0x4C;       //设置定时初值
  TF0 = 0;        //清除TF0标志
  TR0 = 1;        //定时器0开始计时
    ET0=1;              //打开定时器T0中断小开关
  EA=1;               //打开总开关   
}
 
void main()
{
    Timer0Init();   
  LCD_Init();             
    while(1){
        key_scan();
        if(hour==H&&minute==M&&second<S)
            P1_5=~P1_5;           
        switch(mode){
           case 0:LCD_ShowTime(hour,minute,second);break; 
           case 1:case 2:LCD_ShowSetSlarm();break;
           case 3: LCD_ShowSetDuration();                 
        }  
    }
}
 
void interrupt_T0()interrupt 1
{//定时器0中断函数
    TL0 = 0x00;       //重新设置定时初值
  TH0 = 0x4C;       //重新设置定时初值
    T0_flag++;
    if(T0_flag==20){
        T0_flag=0;     
        second++;
        if(second==60){
            second=0;
            minute++;
            if(minute==60){
                minute=0;
                hour++;
                if(hour==24)
                    hour=0;               
           }
        }
    }
}
相关文章
|
4月前
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
356 1
|
4月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
141 3
|
4月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
|
7月前
|
内存技术
模块化编程+LCD1602调试工具——“51单片机”
模块化编程+LCD1602调试工具——“51单片机”
模块化编程+LCD1602调试工具——“51单片机”
|
7月前
|
传感器
51单片机矩阵键盘超详解!(内含LCD1602代码)
51单片机矩阵键盘超详解!(内含LCD1602代码)
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
【51单片机】一文带你利用【Keil软件的模板功能】【自定义模板】简化操作(带图详解)
【51单片机】一文带你利用【Keil软件的模板功能】【自定义模板】简化操作(带图详解)
|
7月前
|
数据可视化 API
【51单片机】LCD1602(可视化液晶屏)调试工具的使用(6)
【51单片机】LCD1602(可视化液晶屏)调试工具的使用(6)
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
下一篇
DataWorks