[求助] pic秒表的问题!!!!急求!!!

ageless   2009-12-23 15:24 楼主
#include
#define uchar unsigned char
#define uint unsigned long int
#define RS RB4
#define E RE2
#define UPKEY RB1
#define DOWNKEY  RB2
#define CLRKEY  RB5

uchar table[]="  000:000:000  ";
uchar ys,count,TMR1_H,TMR1_L;
uint  ms1=0,ms2=0,sec1=0,sec2=0,us=0;
void init_pic()
{

TRISB=0X00;
TRISD=0X00;
TRISE=0x00;
        GIE=1;
        PEIE=1;
         TMR1IE=1;
         TMR1IF=0;
          
         //TMR1H=0Xfe;
         //TMR1L=0X70;  //0.1ms
        //T1CON=0X01;
}





//**********延时函数*************/
void delay_a(uchar z)
{
        uint i,j;
        for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}


/********************************************************************\
|* 函 数 名: write_command(uchar tempdata)                                                        *|
|* 功能描述: 将数据码写入LCD数据寄存器                                                                     *|
\********************************************************************/
void write_command(uchar tempdata)
{
          
        RS=0;          //RS=0/RW=0 时写指令;
         for(ys=10;ys>0;ys--);//)       
        PORTD=tempdata;
         for(ys=10;ys>0;ys--);//
        E=1;
        for(ys=10;ys>0;ys--);//
        E=0;
}


/********************************************************************\
|* 函 数 名: void write_data(uchar tempdata)                                                *|
|* 功能描述: 写LCD1602使能程序                                                                      *|
\********************************************************************/
void write_data(uchar tempdata)
{       
       
        RS=1;           //RS=1/RW=0 时写数据;
         for(ys=10;ys>0;ys--);//delay_a(5);
        PORTD=tempdata;
         for(ys=10;ys>0;ys--);//delay_a(5);
        E=1;
         for(ys=10;ys>0;ys--);//delay_a(5);
        E=0;       
}
void init_LCD(void)
{

        write_command(0x38); // lcd为两行显示8位数据线有效         
        write_command(0x0c); // 显示字符  关闭光标
        write_command(0x06); // 输入方式设置 光标向右移动一位 ac-1
        write_command(0x01);
        write_command(0x80);//第一行显示

}



void write_ms(uchar add,uchar date) //*定义ms显示位置*/
{
        uchar shi,ge;

        shi=date/10;
        ge=date%10;
       
        write_command(0x80+add);
        write_data(0x30+shi);
        write_data(0x30+ge);

}
void write_us(uchar add,uint data)//us
{         uchar a;
        a=(data*100)/100;

        write_command(0x80+add);
        write_data(0x30+a);

}
void zifu_disp()
{
        uchar i;
           write_command(0x80);//第1行第1列:(0x00------0x0F)+0x80;
        for(i=0;i<15;i++)
        {
                write_data(table);
                delay_a(5);
        }
}





//*************主函数*******************/
void main()
{       
        init_pic();
        init_LCD();
        zifu_disp();
               
        while(1)
        {        if(UPKEY==1)
               
                {        delay_a(5);
                        if(UPKEY==1)
                        {               
                       
                                TMR1_H=0xfe;
                                TMR1_L=0x70;       
                                  T1CON=0x01;
                                while(UPKEY==1);
                        }
               
       
                }
                if(DOWNKEY==0)
                        {        delay_a(5);
                                if(DOWNKEY==0)               
                                {       
                                 
                                        TMR1ON=0;
                               
                                        while(DOWNKEY==0);       
                                }

                        }
                               
                       
                        write_us(2, sec2);
                        write_ms(3,sec1);
                        write_us(6, ms2);
                        write_ms(7, ms1);
                        write_us(10,us);               
        }
                       

       
}


//********中断服务子程序**************
void interrupt time(void)
{
        TMR1H=TMR1_H;
        TMR1L=TMR1_L;
        TMR1IF=0;

        us++;
        if(us==9)
                          {
                                  ms1++;
                                us=0;
                                  if(ms1==100)
                                          {        ms2++;
                                                ms1=0;
                                        if(ms2==10)
                                                {        sec1++;
                                                          ms2=0;
                                                        if(sec1==100)
                                                        {        sec2++;
                                                                sec1=0;
                                                        }
                                               
                                                  }
                                       
                                        }
                       
                        }
       
               
}

我在进行调试时,发现按下UPKEY后可以计时,按下DOWNKEY健后计时停止。但是问题也出现了,之后按下那个键都没有反应了?我想做的是重新按下UPKEY键后重新在开始计时,请各位帮帮忙!

回复评论 (4)

我这边有用PIC单片机实现秒表的详细设计与源代码,
qq:604914729,晚上7点把相关资料给你吧;到时QQ聊
点赞  2009-12-23 15:43
你的按键硬件是怎么接的?有上拉电阻或下拉电阻么,没有的化处理完按键要恢复按键状态吧!
点赞  2009-12-24 11:02
引用: 引用 1 楼 kyzf 的回复:
我这边有用PIC单片机实现秒表的详细设计与源代码,
qq:604914729,晚上7点把相关资料给你吧;到时QQ聊

全才啊!干这行的有你这么博学的还很少见啊!
点赞  2009-12-24 16:50
顶啊!
点赞  2009-12-24 17:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复