打印

小弟请求大家看看这个程序

[复制链接]
1662|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tyb520|  楼主 | 2011-4-6 23:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家帮我看看这个程序,用定时写的简单时钟,四位八段数码管显示,例:每次按键时候假如秒显示00,按加键时候到58就跳到00;假如按减键显示的不是59,而是乱的,为什么不是按程序写的加减,而是乱搞
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void display(uchar,uchar,uchar);
sbit key_sure=P0^0;          //***确定键***
sbit key_add=P0^1;          //***加键*****
sbit key_cut=P0^2;          //***减键*****
sbit key_move=P0^3;          //***移位键***
bit f_ks;f_ka;f_kc;f_km;//键标志位
uchar t_num;km_num;shi;fen;miao;
void delay(uchar ms)
{
        uchar i;
        while(ms--)
        for(i=0;i<200;i++);

}
void time_int()
{
  TMOD=0x01;
  TH0=(65536-10000)/256;
  TL0=(65536-10000)%256;
  ET0=1;
  TR0=1;
  EA=1;
}
void time() interrupt 1 using 0
{
      TH0=(65536-10000)/256;
      TL0=(65536-10000)%256;
          if(t_num++==100)
          {
                    t_num=0;
                  if(miao++==60)
                  {
                           miao=0;
                         if(fen++==60)
                         {
                             fen=0;
                                 if(shi++==25)
                                 {
                               shi=0;
                                  }
                          }
                   }
           }
    }

void key_scan()          //检测独立式键盘
{
   if(key_sure==0)
   {
              delay(5);
           if(key_sure==0)
           {
                      f_ks=1;
                   while(!key_sure)
                   display(shi,fen,miao);
                   delay(5);
                   while(!key_sure)
                   display(shi,fen,miao);
            }
    }
        if(key_add==0)
   {
              delay(5);
           if(key_add==0)
           {
                      f_ka=1;
                   while(!key_add)
                   display(shi,fen,miao);
                   delay(5);
                   while(!key_add)
                   display(shi,fen,miao);
            }
    }
        if(key_cut==0)
   {
              delay(5);
           if(key_cut==0)
           {
                      f_kc=1;
                   while(!key_cut)
                   display(shi,fen,miao);
                   delay(5);
                   while(!key_cut)
                   display(shi,fen,miao);
            }
    }
        if(key_move==0)
   {
              delay(5);
           if(key_move==0)
           {
                      f_km=1;
                   while(!key_move)
                   display(shi,fen,miao);
                   delay(5);
                   while(!key_move);
                   display(shi,fen,miao);
            }
    }
}
void key_control()        //键盘控制
{
    key_scan();
        if(f_km==1)
        {
           f_km=0;
           km_num++;
          if(km_num==4)
            {
                  km_num=0;
                  
                  }         
         }
        if(km_num!=0)
          TR0=0;
          else TR0=1;
        if(km_num==1)
         {
           if(f_ka==1)
           {
         f_ka=0;
                 miao=miao+1;
                if(miao==59)
                miao=0;
           }
           if(f_kc==1)
           {
                    f_kc=0;
                 miao=miao-1;
                 if(miao==0)
                 miao=59;
            }
          }
         if(km_num==2)
         {
                 if(f_ka==1)
                {
                  f_ka=0;
                  fen++;
                  if(fen==59)
                  fen=0;
                 }
                 if(f_kc==1)
                 {
                         f_kc=0;
                        fen--;
                        if(fen==0)
                        fen=59;
                  }
          }
          if(km_num==3)
          {
             
                   if(f_ka==1)
                 {
                         f_ka=0;
                        shi++;
                        if(shi==24)
                        shi=0;
                  }
                  if(f_kc==1)
                  {
                           f_kc=0;
                         shi--;
                         if(shi==0)
                         shi=24;
                   }
           }
          
  }                          

void main()        //主函数
{
       time_int();
           shi=0;fen=0;miao=0;km_num=0;
       while(1)
           {
              key_control();
          display(shi,fen,miao);
                  }
}       

下面调用的是显示函数:
#include<reg52.h>
#define uchar unsigned char
sbit LS138A=P2^2; //位选口
sbit LS138B=P2^3; //位选口
sbit LS138C=P2^4; //位选口,通过锁存器373控制
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,          
                     0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x86,0xc7,0xbf,0xff}; //段码
uchar N_data[8];dat;n;
void delayms(uchar ms)        //延时函数
{
        uchar j;
        while(ms--)
        for(j=0;j<20;j++);
}
    void display(uchar h,uchar m,uchar s)
     {
                uchar i;
                N_data[0]=table[h/10];
                N_data[1]=table[h%10];
                N_data[2]=table[19];
                N_data[3]=table[m/10];
                N_data[4]=table[m%10];
                N_data[5]=table[19];
                N_data[6]=table[s/10];
                N_data[7]=table[s%10];       
                for(i=0;i<8;i++)//位码扫描并送段码显示
                {
                         switch(i)
                         {
                    case 0:LS138A=0; LS138B=0; LS138C=0;  break;         
                    case 1:LS138A=1; LS138B=0; LS138C=0;  break;   
                           case 2:LS138A=0; LS138B=1; LS138C=0;  break;
                    case 3:LS138A=1; LS138B=1; LS138C=0;  break;
                     case 4:LS138A=0; LS138B=0; LS138C=1;  break;
                    case 5:LS138A=1; LS138B=0; LS138C=1;  break;
                            case 6:LS138A=0; LS138B=1; LS138C=1;  break;
                     case 7:LS138A=1; LS138B=1; LS138C=1;  break;
                     default:   break;     
                         
                         }
                          P1= N_data[i];
                          delayms(5);
                }
}

相关帖子

沙发
tyb520|  楼主 | 2011-4-6 23:39 | 只看该作者
不好意思,用的是LS138做位选的

使用特权

评论回复
板凳
joyme| | 2011-4-7 12:05 | 只看该作者
if(miao == 59)
                 miao = 0;
            else
                 miao++;

            if(miao == 0)
                 miao = 59;
            else
                 miao--;

程序写的不咋的,好好整理一下思路再把代码整理一下吧

使用特权

评论回复
地板
gongmaomao| | 2011-4-7 16:40 | 只看该作者
应该是
miao++;
if(miao==60)
miao=0;
吧 因为你的秒是要走到59,60秒的时候才跳到00的啊···

使用特权

评论回复
5
tyb520|  楼主 | 2011-4-7 16:59 | 只看该作者
谢谢大虾门箴言,小弟灰常感谢^^^

使用特权

评论回复
6
joyme| | 2011-4-7 17:24 | 只看该作者
应该是
miao++;
if(miao==60)
miao=0;
吧 因为你的秒是要走到59,60秒的时候才跳到00的啊···

执行到了这里就说明已经具备加的条件了,至于放前放后只是相差几个指令周期,无关紧要,结果是一样的

使用特权

评论回复
7
tyb520|  楼主 | 2011-4-7 22:24 | 只看该作者
:lol3楼说的对,我验证了果然是这里毛病,应该是先检测在计算,这样就不会乱搞了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:脚踏实地的做人,脚踏实地的做事……

7

主题

276

帖子

1

粉丝