1602显示时钟可以调节时分秒(加减)

简介:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint  unsigned int
static  uchar count,j,s1num;
  char shi,fen,miao;
sbit RS = P2^4; //Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6; //Pin6


sbit s1=P3^0;   //矩阵键盘分离出独立键盘
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;


uchar code table1[]=" 2013-7-30  MON ";
uchar code table2[]="    00:00:00    ";
 
/******************************************************************/
/*                    延时函数                               */
/******************************************************************/
void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
       for(y=110;y>0;y--);


}
/******************************************************************/
/*                   写入命令函数                                 */
/******************************************************************/
void WriteCommand(unsigned char c)
{
 delay(5);//操作前短暂延时,保证信号稳定
 E=0;
 RS=0;
 RW=0;
 delay(5);
 E=1;
 P0=c;
 E=0;
}
/******************************************************************/
/*                   写入数据函数                                 */
/******************************************************************/
void WriteData(unsigned char c)
{
 delay(5);  //操作前短暂延时,保证信号稳定
 E=0;
 RS=1;
 RW=0;
 delay(5);
 E=1;
 P0=c;
 E=0;
 RS=0;
}


/******************************************************************/
/*                   初始化函数                                   */
/******************************************************************/
void InitLcd()
{
 //delay(15);
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x06); //显示光标移动位置
 WriteCommand(0x0c); //显示开及光标设置
 WriteCommand(0x01); //显示清屏
    // fen=59;   //测试用
   //  miao=53;
    // shi=23;
   delay(15);
   WriteCommand(0x80); //显示第一行
for(j=0;j<16;j++)
{
WriteData(table1[j]);
  delay(5);
}    
   WriteCommand(0x80+0x40);     //显示第二行
for(j=0;j<16;j++) 
{
WriteData(table2[j]);      
  delay(5);
}
}
/******************************************************************/
/*                   时分秒显示                                   */
/******************************************************************/
void writesfm(uchar add,uchar date)
{
    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    WriteCommand(0x80+0x40+add);
    WriteData(0x30+shi);
    WriteData(0x30+ge);
}
/******************************************************************/
/*                   键盘功能函数                                 */
/******************************************************************/
void keysan()
{
rd=0;
if(s1==0)
 {
  delay(5);
    if(s1==0)
 {
 s1num++;
 while(!s1);
 if(s1num==1)
 {
   TR0=0;
   WriteCommand(0x80+0x40+10);
   WriteCommand(0x0f);//显示光标
 }
      }   
      if(s1num==2)
 {    
   WriteCommand(0x80+0x40+7);
 } 
 if(s1num==3)
 {    
   WriteCommand(0x80+0x40+4);
 }
 if(s1num==4)
 {
   s1num=0;    
   WriteCommand(0x0c); //光标不闪烁
   TR0=1;
 }
       }
   if(s1num!=0)   //s1抬起时完成加减操作
{
  if(s2==0)
 {
   delay(5);
   if(s2==0)
     {
  while(!s2); 
  if(s1num==1)
  {
  miao++;
if(miao==60)
    miao=0;
writesfm(10,miao);
WriteCommand(0x80+0x40+10); 
  }
  if(s1num==2)
  { 
      fen++;
 if(fen==60)
    fen=0;
      writesfm(7,fen);
 WriteCommand(0x80+0x40+7);  
  }
  if(s1num==3)
  { 
      shi++;
 if(shi==24)
    shi=0;
 writesfm(4,shi);
 WriteCommand(0x80+0x40+4);  
  }
}
 }
  if(s3==0)
  {
  delay(5);
 if(s3==0)
 {
   while(!s3);
   if(s1num==1)
   {    
miao--;
if(miao==-1)
    miao=59;
writesfm(10,miao);
    WriteCommand(0x80+0x40+10);
   }
   if(s1num==2)
   {
    fen--;
if(fen==-1) 
     fen=59;
  writesfm(7,fen);
    WriteCommand(0x80+0x40+7);
   }
   if(s1num==3)
   {
    shi--;
if(shi==-1) 
     shi=23;
  writesfm(4,shi);
    WriteCommand(0x80+0x40+4);
   }  
 }
  }   
}
 
}   
/******************************************************************/
/*                   主函数                                       */
/******************************************************************/
void main(void)


{
     TMOD=0x01;  //定时器0 10ms in 12M crystal 用于计时
TH0=(65536-50000)/256;     //初值
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
     EA =1;    
     InitLcd();         //初始化LCD,送初值
     while(1)
 {
 keysan();
if(count==10)  
{
 count=0;
 miao++;
   if(miao==60)
   {
    miao=0;
    fen++;
      if(fen==60)
 {
  fen=0;
  shi++;
   if(shi==24)
      {
  shi=0;
 }
 writesfm(4,shi) ;
 }
 writesfm(7,fen) ;
   }
writesfm(10,miao) ;
}
    }
}
void timer0() interrupt 1   //定时器中断0
{
  TH0=(65536-50000)/256;     //初值
  TL0=(65536-50000)%256;
  count++;
}


目录
相关文章
|
11天前
|
存储 算法 异构计算
m基于FPGA的多功能信号发生器verilog实现,包含testbench,可以调整波形类型,幅度,频率,初始相位等
使用Vivado 2019.2仿真的DDS信号发生器展示了正弦、方波、锯齿波和三角波的输出,并能调整幅度和频率。DDS技术基于高速累加器、查找表和DAC,通过频率控制字和初始相位调整产生各种波形。Verilog程序提供了一个TEST模块,包含时钟、复位、信号选择、幅度和频率控制输入,以生成不同波形。
33 18
|
4月前
|
Linux
计算当前时间距离1970年的秒数
计算当前时间距离1970年的秒数
|
11月前
[STM32F10x] 利用定时器测量频率
[STM32F10x] 利用定时器测量频率
89 2
|
12月前
labview数值型数据实验输入显示时间滑动杆旋钮仪表相加相减相乘滚动条
LabVIEW是一种程序开发环境,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。LabVIEW软件是NI设计平台的核心,也是开发测量或控制系统的理想选择。LabVIEW开发环境集成了工程师和科学家快速构建各种应用所需的所有工具,旨在帮助工程师和科学家解决问题、提高生产力和不断创新。
81 0
|
12月前
labview布尔型数据开关控制指示灯比较数值颜色变化条件判断
labview布尔型数据开关控制指示灯比较数值颜色变化条件判断
435 0
|
12月前
|
C++ iOS开发
C++/PTA 温度单位转换
从键盘读取华氏温度,转换成摄氏温度并输出,保留1位小数。 转换公式为:c=5/9*(f-32), 其中,f为华氏温度,c为摄氏温度。
188 0
|
传感器 缓存 算法
基于STM32的心率计(二)动态阈值算法获取心率值
基于STM32的心率计(二)动态阈值算法获取心率值
677 0
基于STM32的心率计(二)动态阈值算法获取心率值
|
JavaScript 前端开发 算法
html+css+JavaScript实现简洁的圆形时钟数字时钟+指针时钟
使用前端三件套实现一个实时跟新的时钟,其中包括电子时钟和刻度时钟
239 0
html+css+JavaScript实现简洁的圆形时钟数字时钟+指针时钟
通过定时器T1查询方式控制LED1周期性闪烁(模模式)
通过定时器T1查询方式控制LED1周期性闪烁(模模式) 宏定义与函数声明 初始化 主函数
272 0
通过定时器T1查询方式控制LED1周期性闪烁(正计数/倒计数)
通过定时器T1查询方式控制LED1周期性闪烁(正计数/倒计数) 宏定义与函数声明 初始化 主函数
162 0