由定时器做到时钟,现在想改为矩阵按键,请各位大神帮忙指点?

2019-07-15 09:27发布

  请看看我这个程序,原来由定时器做到时钟,现在想改为矩阵按键,按下按键数码管显示,现在是可以正常显示8个0,但是按下按键无效,不知道怎么去改,请各位大神帮忙指点一二,谢谢#include<stc90.h>
#include<intrins.h>
#define  uint     unsigned  int
#define  uchar  unsigned  char
sbit shuA=P1^0;
sbit shuB=P1^1;
sbit shuC=P1^2;
uchar code table []={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x40};
uint  cnt100us; //定义100us变量//
uchar  hour=0,min=0,sec=0;//定义时分秒变量//
/****************************
定时器0初始化程序100us
*******************************/
//void timer0Init()
//{
//        TMOD=0X02;   //8位自动重装载定时器//
//        TH0=0X9C;    //设置定时初值//
//        TL0=0X9C;   //设置定时初值//
//        TF0=0;       //清除TF0标志//
//        TR0=1;     //定时器0开始记时//
//}/
/********************************
计时子程序
********************************/
//void time()
//{
//        if(TF0==1)    //如果查询定时器溢出标志TF0为1
//        {
//                TF0=0;     //定时器溢出周期100us
//                cnt100us++;   //定时器溢出标志TF0清0
//                if(cnt100us>=10000)    //时间变量Cnt100us自+1
//                {
//                        cnt100us=0;    //变量Cnt100us清0
//                        sec ++;      //秒自+1
//                        if(sec>=60)    //如果秒>=60
//                        {
//                                sec=0;   //秒清0
//                                min++;    //分自+1
//                                if(min>=60)    //分>=60
//                                {
//                                        min=0;    //分清0
//                                        hour++;   //小时自+1
//                                        if(hour>=24)  //小时>=24
//                                                hour=0;  //小时清0
//                                }
//                        }
//                }
//               

//        }
//}  

/**************************
按键扫描程序
***************************/
extern unsigned char keyboard_matrix()
{
        unsigned char num_key=0;//按键号
        unsigned char temp=0;//读取P2口线数据
        static unsigned char temp_code=0;//用于保存按键值
        static unsigned char temp_circle=0xFE;//保存P2线上的循环扫描值
        static unsigned char num_check=0;//低电平计数
        static unsigned char key_flag=0;//按键有效标识

        P2=temp_circle;//0xFX
        temp=P2;//读取P2口线数据
        if(temp!=temp_circle)//有按键动作
        {
                num_check++;//低电平计数|逢低电平加1
                if(num_check==10)//连续10次(10ms)低电平有效
                {
                        key_flag=1;//按键有效标识置1
                        temp_code=temp;//保存按键值
                }
        }
        else//松手OR无按键动作,此时应该改变扫描线
        {
                num_check=0;
                if(key_flag==1)//按键有效判断
                {
                        key_flag=0;
                        switch(temp_code)//读取按键号
                        {
                                //P2^0线
                                case 0xEE: num_key=1;         
                                           break;
                                case 0xDE: num_key=2;
                                           break;
                                case 0xBE: num_key=3;
                                           break;
                                case 0x7E: num_key=4;
                                           break;
                                //P2^1线
                                case 0xED: num_key=5;
                                           break;
                                case 0xDD: num_key=6;
                                           break;
                                case 0xBD: num_key=7;
                                           break;
                                case 0x7D: num_key=8;
                                           break;
                                //P2^2线
                                case 0xEB: num_key=9;
                                           break;
                                case 0xDB: num_key=10;
                                           break;
                                case 0xBB: num_key=11;
                                           break;
                                case 0x7B: num_key=12;
                                           break;
                                //P2^3线
                                case 0xE7: num_key=13;
                                           break;
                                case 0xD7: num_key=14;
                                           break;
                                case 0xB7: num_key=15;
                                           break;
                                case 0x77: num_key=16;
                                           break;
                        }
                }
                temp_circle=_crol_(temp_circle,1);//改变扫描线
                if(temp_circle==0xEF)
                {
                        temp_circle=0xFE;
                }
        }
        return(num_key);//返回按键号
}

/*******************************
数码管显示程序
*********************************/
void display()
{        
        static uchar aa=0;     //时分显示变量
        static uchar bb=0;     //计数延时变量
        bb++;
        if(bb>=40)        // //1~255可调,数码管闪烁可减小,有鬼影可加大
        {
                bb=0;
                switch (aa)
                {
                        case 0: P0=0X00;  shuA=0; shuB=0;shuC=0;
                        P0=table[hour/100%10];           
                        aa=1;
                        break;

                        case 1: P0=0X00; shuA=1; shuB=0;shuC=0;  
                        P0=table[hour/10];           
                        aa=2;
                        break;

                        case 2: P0=0X00;  shuA=0; shuB=1;shuC=0;
                        P0=table[hour%10];                     
                        aa=3;
                        break;

                        case 3: P0=0X00; shuA=1; shuB=1;shuC=0;
                        P0=table[min/100%10];
                        aa=4;
                        break;

                        case 4: P0=0X00;  shuA=0; shuB=0;shuC=1;
                        P0=table[min/10];
                        aa=5;
                        break;

                        case 5: P0=0X00;  shuA=1; shuB=0;shuC=1;
                        P0=table[min%10];
                        aa=6;
                        break;

                        case 6: P0=0X00;  shuA=0; shuB=1;shuC=1;
                        P0=table[sec/10];
                        aa=7;
                        break;

                        case 7: P0=0X00; shuA=1; shuB=1;shuC=1;
                        P0=table[sec%10];
                        aa=0;
                        break;

                }
        }
        

}
void  main(void)
{
//        timer0Init();   //初始化定时器0 //
        while(1)         //大循环//
        {
                keyboard_matrix();  //按键扫描//
//                time        ();  //计时//
                display   ();  //显示//
        }

}


数码管1.jpg
按键.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。