找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2163|回复: 1
打印 上一主题 下一主题
收起左侧

用1602单片机设计的可调电子钟显示不正确

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0; //定义液晶显示器控制端口
sbit rw=P2^1;
sbit en=P2^2;
sbit s1=P1^0; //定义按键控制
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
uchar shi,fen,miao,ri,yue,nin;
uchar code table[]={"      clock"};
uchar code table1[]={"    00:00:57"};
uchar num,num1,count;
uint i,sh,ge,s,g;
void delay(uchar time)   //延时
{
   uint j;
   for(;time>0;time--)
   for(j=0;j<125;j++);
  }

void write_com(uchar com)    //写指令函数
{
  en=0;
  rs=0;
  delay(5);
  P0=com;
  delay(5);
   en=1;
  delay(5);
  en=0;
}
void write_data(uchar dat)   //写数据函数
{
   en=0;
  rs=1;
  delay(5);
   P0=dat;
  delay(5);
   en=1;
  delay(5);
  en=0;
}
void init()   //初始化
{
     en=0;
     rw=0;
    write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
    write_com(0x0c);//设置开显示,不显示光标
    write_com(0x06);//写一个字符后地址指针加1
    write_com(0x01);//显示清零,数据指针清零

for(i=0;i<(sizeof(table)-1);i++)   //第一行写
{
    write_com(0x80+i);
    write_data(table[i]);
}


for(i=0;i<(sizeof(table1)-1);i++) //第二行写
{
       write_com(0x80+0x40+i);
    write_data(table1[i]);
}
miao=56;
fen=59;
shi=23;
TMOD=0x01;    //time0作为定时器工作在模式1下
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
EA=1;  //开启总中断
ET0=1;   //开启time0中断
TR0=1;   //启动time0
}
void write_sfm(uchar add,uchar num)  //时分秒函数
{
    sh=num/10;   //分离出十位
    ge=num;    //分离出个位
   write_com(0x80+0x40+add); //第二行数据指针位置调整
   write_data(0x30+sh);   //更改显示数据的十位
   write_data(0x30+ge);  //更改显示数据的个位
}

void timer0() interrupt 1 //time0中断
{
   TH0=(65536-50000)/256;  //重装初始值
   TL0=(65536-50000)%6;
   count++;   
if(count==20)  //20次到则满一秒
  {
     count=0;
     miao++;
   if(miao==60)
    {
        miao=0;
        fen++;
      if(fen==60)
         {
             fen=0;
              shi++;
     if(shi==24)
                {
             shi=0;     
        }
          write_sfm(4,shi);      
          }
     write_sfm(7,fen);
     }   
   write_sfm(10,miao);
  }
}
void keyscan()    //键盘扫描
{  if(s1==0) //按下S1      
    {
      delay(5);
     if(s1==0)
       {
             num1++;   
         while(!s1);//等待释放         
            if(num1==1)
              {
                  TR0=0;
          write_com(0x0e);  //显示光标,不闪烁
      write_com(0x80+0x40+0x0b);  //数据指针移动到秒的个位处
             write_com(0x0f);//显示光标,闪烁
                }
                if(num1==2)
                  {
          write_com(0x80+0x40+0x08);  //数据指针移到到分钟的个位处
                   }
                            if(num1==3)
                              {        
                 write_com(0x80+0x40+0x05);  //数据指针移到到小时的个位处
                               }
                                    if(num1==4)
                                       {
                                         num1=0;    //清零
                                      write_com(0x0c);  //重新显示
                                       TR0=1;   //重新启动计时   
                                        }
        }
    }

           if(num1!=0)   //按下S2则选择时/分/秒加1
          {
             if(s2==0)
              {
                delay(5);
                 if(s2==0)
                  {
                    while(!s2);

               if(num1==1)   
                      {
                  delay(20);
                         miao++;
                       if(miao==60)  
                      miao=0;
                       write_sfm(10,miao);            
        write_com(0x80+0x40+0x0a);
                       }
                           if(num1==2)
                            {
                              fen++;
                             if(fen==60)
                             fen=0;
                          write_sfm(7,fen);            
                     write_com(0x80+0x40+0x07);
                               }
                                  if(num1==3)
                                    {
                                     shi++;
                                    if(shi==24)
                                     shi=0;
                                  write_sfm(4,shi);                       
                         write_com(0x80+0x40+0x04);
                                       }
                    }
              }
          }

     if(num1!=0)
               if(s3==0) //按下S3则选择时/分/秒 减1
               {
                  delay(5);
                  if(s3==0)
                  {
                  while(!s3);
                     if(num1==1)
                      {
                     delay(20);
                      miao--;
                         if(miao==-1)
                       miao=59;
              write_sfm(10,miao);      
             write_com(0x80+0x40+0x0a);
                       }
                         if(num1==2)
                          {
                               fen--;
                             if(fen==-1)
                           fen=59;
               write_sfm(7,fen);   
               write_com(0x80+0x40+0x07);
                           }
                              if(num1==3)
                               {
                                shi--;
                                if(shi==-1)
                                shi=23;
                             write_sfm(4,shi);         
               write_com(0x80+0x40+0x04);
                               }
                  }
               }

                              if(num1!=0)
            if(s4==0)   //确定按键
             {
                                     delay(5);
                                       if(s4==0)
                                         {
                                         while(!s4);
            num1=0;    //清零
                                           write_com(0x0c);  //重新显示
                                            TR0=1;   //重新启动计时   
            }
          }

}
void main()
{
    init();
     while(1)
     {
       keyscan();
     }
}

捕获.PNG (88.34 KB, 下载次数: 38)

捕获.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-11-19 19:19 | 只看该作者
本帖最后由 zl2168 于 2017-11-19 19:20 编辑

给你介绍一个正确有效的案例,自己对照查错吧!
实例91  具有校正功能的时钟1302LCD1602显示)

先Proteus仿真,确认有效。 实例91 带校正时钟1302(LCD1602显示).rar (52.68 KB, 下载次数: 6)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1,书中电路和程序设计有详细说明,程序语句条条有注解。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表