新手向高手求助!!为什么我调整时间时没反应?

2019-07-16 07:06发布

本帖最后由 kamfun 于 2011-5-5 13:56 编辑

要求如下:
(1. 开机时,显示12:00:00的时间开始计时;  
(2. P0.0/AD0控制“秒”的调整,每按一次加1秒;  
(3. P0.1/AD1控制“分”的调整,每按一次加1分;  
(4. P0.2/AD2控制“时”的调整,每按一次加1个小时;  

我的程序没错,但功能不能实现,为什么??
要求如下:
(1. 开机时,显示12:00:00的时间开始计时;
(2. P0.0/AD0控制“秒”的调整,每按一次加1秒;
(3. P0.1/AD1控制“分”的调整,每按一次加1分;
(4. P0.2/AD2控制“时”的调整,每按一次加1个小时;

我的程序没错,但功能不能实现,为什么??
#include<reg52.h>
#define        SEG                P0        
#define uchar unsigned char
#define uint  unsigned int
sbit  AD0=P3^2;     //定义按键
sbit  AD1=P3^3;     //定义按键
sbit  AD2=P3^4;     //定义按键
void delay(int);//延迟函数
unsigned long times=120000;
int ID=0;
uchar  TAB[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   // 0~9
uchar  LED_W[6] = {2,3,4,5,6,7};                //通过38译码器选中特定的 数码管
char disp[6]={0x06,0x5b,0x3f,0x3f,0x3f,0x3f};  //初始显示120000
unsigned long  save_hours,save_minutes,save_seconds,pass_num;
void pass( unsigned long);
void display( void);
void dispose(void);
void scan(void);
void init(void);
void main()                                
{
         
        while(1)               
        {         
           
            dispose();
            display();
               
        }                                                                        
}
void init(void)
{
                        uchar i = 0,j = 0;
                         SEG = disp;                 // i 值的 个位数
                                P2 = LED_W[j];                 //点亮第一位数码管利用三八译码器依次选择点亮八数码管,
                                delay(2);
                                j++;
                                i++;
                        if(j ==6)                         //利用 j 值的变化,来控制数码管数值变化间隔的时间
                                {
                                        j = 0;
                                        i = 0;
                                }        
               
}                                                                                         
void dispose(void)
{
               
  if(AD0==0)
          {
                 delay(20);
                while(AD0!=1);
                        delay(20);
                if(times<235959)
                    save_hours=times+=10000;
                        ID=1;
                   }
   if(AD1==0)
          {
                  delay(20);
                while(AD1!=1);
                        delay(20);
                if(times<235959)
                    save_minutes=times+=100;
                        ID=2;
                   }        
        if(AD2==0)
          {
          delay(20);
                while(AD0!=1);
                delay(20);
                if(times<235959)
                    save_seconds=times++;
                        ID=3;
          }                                                  
}


void display( )
{

        switch(ID)
                {   case 0:            pass(times);
                                                init();break;
                        case 1:     pass(save_hours);
                                                scan();break;
                        case 2:     pass(save_minutes);
                                                scan();break;
                        case 3:     pass( save_seconds);
                                                scan(); break;                                 
            }
}


void scan(void)
{               
        uchar i = 0,j = 0;
            SEG = TAB[disp];                 // i 值的 个位数
                P2 = LED_W[j];                 //点亮第一位数码管利用三八译码器依次选择点亮八数码管,
                delay(2);
                j++;
                i++;
        if(j ==6)                         //利用 j 值的变化,来控制数码管数值变化间隔的时间
                {
                        j = 0;
                        i = 0;
                }
}
void pass( unsigned long  x)
{
                disp[5]=TAB[x/100000];                        //时
                        disp[4]=TAB[x/10000];      
                    disp[3]=TAB[x/1000];                         //分
                        disp[2]=TAB[(x/100)%10];        
                    disp[1]=TAB[(x/10)%10];        // 秒
                        disp[0]=TAB[x%10];        
}

//===延迟函数================================
void delay(int x)                // 延迟函数开始
{        
     int i,j;                                // 声明变量
        for(i=0;i<x;i++)                 // 连数x次,约xms
                for(j=0;j<120;j++); // 数120次,约1ms
}                                                        // 延迟函数结束
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
lirongqing
1楼-- · 2019-07-16 12:51
(2. P0.0/AD0控制“秒”的调整,每按一次加1秒;  
(3. P0.1/AD1控制“分”的调整,每按一次加1分;  
(4. P0.2/AD2控制“时”的调整,每按一次加1个小时;
sbit  AD0=P3^2;     //定义按键
sbit  AD1=P3^3;     //定义按键
sbit  AD2=P3^4;     //定义按键
定义的管脚跟要求不一样.小心不要接错脚了.
int 是16位,最多可以计数为2的16次方,为65536,
int times=120000;溢出了.
yunpeng
2楼-- · 2019-07-16 12:53
版主分析的对,应该是数据溢出的问题。
kamfun
3楼-- · 2019-07-16 14:53
回复 lirongqing 的帖子

呵呵~原来这样,那先谢啦。上面是我改之后的,用unsigned long类型,管脚我也定义好了,但是当我初始化时不会显示120000旭,而是显示奇怪的5,按下自会出现5,6,7一个数字的跳变,是我的程序编得不好还是什么的?请高手再指点一下小弟,谢谢~~
lirongqing
4楼-- · 2019-07-16 20:49
 精彩回答 2  元偷偷看……

一周热门 更多>