找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2735|回复: 6
收起左侧

显示出问题了,求大神们帮我看看,就小时和分钟显示出问题了

[复制链接]
ID:138194 发表于 2016-9-30 17:47 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="0123456789:";
sbit en=P2^5;                                          //使能端
sbit rs=P1^0;                                          //数据选择端
sbit rw=P1^1;                                          //读写选择端
sbit key1=P3^4;                                          //功能选择键
sbit key2=P3^5;                                          //时间加 按键
sbit key3=P3^6;                                          //时间减按键
sbit key4=P3^7;                                          //暂停按键
sbit dula=P2^6;                                          //申明U1锁存器的锁存端
sbit wela=P2^7;                                          //申明U1锁存器的锁存端
uint num,num1,shi=0,fen=0,miao=0; //声明全局变量
void delayms(uint z);

//////////                   定时器0的使用                         //////////                       
void T0_time() interrupt 1                   //选用定时器0方式一
{
         TH0=(65536-45872)/256;                   //重装初值
            TL0=(65536-45872)%256;
         num++;
         if(num>=20)                                   //1秒到
         {
                        miao++;
                        num=0;                                           //重新对num赋值,重新计时
                if(miao==60)
                {
                                   fen++;
                                miao=0;
                        if(fen==60)
                        {
                                    shi++;
                                        fen=0;
                                if(shi==24)
                                        {
                                                shi=0;
                                        }
                        }
                }
         }
}
//////////////                                用1602显示                                         ////////////
void Wcom(uchar com)                                  //写命令
{
        rs=0;                                                          //选择数据段
        P0=com;                                                          //将要写的命令传送到数据总线
        delayms(5);
        en=1;                                                          //使能端给一高脉冲,将命令送入液晶控制器
        delayms(5);
        en=0;
}
void Wdate(uchar date)                                  //写数据
{
        rs=1;                                                          //选择数据段
        P0=date;
        delayms(5);
        en=1;                                                          //使能端给一高脉冲,将数据送入液晶控制器
        delayms(5);
        en=0;
}
void init()                                                   //初始化函数
{
        dula=0;                                                   //关闭数码管
        wela=0;
        rs=0;                                                   //选择数据端
        rw=0;                                                   //选择读数据端
        en=0;                                                   //使能端给低电平
        Wcom(0x38);                                           //设置16x2显示,8位数据接口
        Wcom(0x0c);                                           //设置开显示。不显示光标,不闪烁光标
        Wcom(0x06);                                           //写一个字符地址指针加1
        Wcom(0x01);                                           //所有显示清零
        Wcom(0x80+0x42);
}
void show()                                                   //显示
{
        uint shi1,shi2,fen1,fen2,miao1,miao2;
        shi1=shi/10;                                   //小时的十位
        shi2=shi%10;                                   //小时的个位
        fen1=fen/10;                                   //分钟的十位
        fen2=fen%10;                                   //分钟的个位
        miao1=miao/10;                                   //秒十位
        miao2=miao%10;                                   //秒个位
        Wcom(0x80+0x42);
        for(num1=0;num1<8;num1--)
        {
                Wdate(table[shi1]);
                delayms(5);
                Wdate(table[shi2]);
                delayms(5);
                Wdate(table[10]);
                delayms(5);
                Wdate(table[fen1]);
                delayms(5);
                Wdate(table[fen2]);
                delayms(5);
                Wdate(table[10]);
                delayms(5);
                Wdate(table[miao1]);
                delayms(5);
                Wdate(table[miao2]);
                delayms(5);
        }
}
/////////////                                按键检测                                        /////////////////
void keyscan()
{
                if(key1==0);
                        {
                                shi++;
                                if(shi==24)
                                   shi=0;
                                   while(!key1);
                        }
                if(key2==0);
                        {
                                fen++;
                                if(fen==60)
                                {
                                        fen=0;
                                        shi++;
                                }
                                        while(!key2);
                        }
                if(key3==0)
                        {
                                 miao++;
                                if(miao==60)
                                  {
                                          fen++;
                                    miao=0;
                                  }
                                  while(!key3);
                        }
                 if(key4==0)
                         {
                                TR0=~TR0;
                        }
         
}

void main()
{
        init();
        TMOD=0X01;                                           //设置定时器0为工作方式1
        TH0=(65536-45872)/256;                   //赋初值
        TL0=(65536-45872)%256;
        EA=1;                                                   //开启总中断
        ET0=1;                                                   //开启定时器0中断
        TR0=1;                                                   //启动定时器0
        while(1)
        {
                 keyscan();
                 show();
        }
}

void delayms( uint z)                                  //延时子程序
{
        uint x,y;
        for(x=z;x>0;x--)
          for(y=110;y>0;y--);
}








回复

使用道具 举报

ID:138194 发表于 2016-10-7 12:13 | 显示全部楼层
谢谢,问题找到了,是按键没加延时
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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