OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4300|回复: 8

急求大神帮忙,不知代码哪里出了问题,按键程序老是无法使用

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-12-5
在线时间
9 小时
发表于 2016-2-21 21:43:41 | 显示全部楼层 |阅读模式
1金钱
此代码是数码管显示时钟,利用四个按键实现暂停、切换、加、减。调用key();的时候,发现在单片机实训板上,四个按键均无反应。在此搞不懂什么原因造成,请大神们帮忙解答,谢谢,拜托拜托~
代码奉上:
#include <reg51.h>
sbit        P2_0 = P2^0;
sbit        P2_1 = P2^1;
sbit        P2_2 = P2^2;
sbit        P2_3 = P2^3;
sbit        P2_4 = P2^4;
sbit        P2_5 = P2^5;
sbit        P2_6 = P2^6;
sbit        P2_7 = P2^7;
#define CONT1 80                 //加减常量
#define CONT2 20                 //连续加减速度变量
/***********************************************************************************************/
unsigned char code led_code[12]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XD8,0X80,0X90,0xBF,
                                                               ~0X40};
                                                          //定义0~9以其带小数点和“-”的显示码
unsigned char led_reg[8]={0,0,11,0,0,11,0,0};  //定义显示数码缓存器
unsigned char hour;                                        //定义时钟变量
unsigned char min;                                          //定义分钟变量
unsigned char sec;                                          //定义秒钟变量
//unsigned char T;
unsigned char inputkey;                                                //定义键盘输入存储变量
unsigned char shift_r;                                                //定义键盘移位变量
unsigned char key_delay,flash_adj;
unsigned int T=0;                                //定义秒钟调整变量
unsigned char jian,jia,zt,qh;
unsigned int numqh,numzt;
bit task_f;                                //定义任务标志位
bit        key_mark;                        //定义按键记录标志位
/************************************************************************************************
**function:delay(unsigned char i)
**功    能:延时程序
************************************************************************************************/
void delay(unsigned char i)
{        unsigned char j,k;
                for(k=0;k<i;k++)
                {        for(j=0;j<255;j++);
                }
}
/************************************************************************************************
**function:led_show()
**功    能:显示函数
************************************************************************************************/
//void led_show( )
//{        static unsigned char led_shift=0x00;        //定义静态变量
//        P2=0xFF;                                                                //关闭数码管控制端口                                       
//        P0=led_code[led_reg[led_shift]];                //把字符代码送到P0端口
//        switch(led_shift)                                                //选择数码管控制位
//        {        case 0: P2_0=0;break;                                //控制左1数码管
//                case 1: P2_1=0;break;                                //控制左2数码管
//                case 2: P2_2=0;break;                                //控制左3数码管
//                case 3: P2_3=0;break;                                //控制左4数码管
//                case 4: P2_4=0;break;                                //控制左5数码管
//                case 5: P2_5=0;break;                                //控制左6数码管
//                case 6: P2_6=0;break;                                //控制左7数码管
//                case 7: P2_7=0;break;                                //控制左8数码管
//                default:break;
//        }
//        led_shift++;                                                        //数码管控制变量自加
//        if(led_shift==0x08)                                                //判断是否扫描一轮
//                led_shift=0x00;                                                //归零进行下一轮扫描
//}
void led_con(unsigned char i)                                                        //数码管位选控制程序
{        switch(i)                                                                                        //选择数码管控制位
        {        case 0: P2=0xFE;break;                                                        //控制左1数码管
                case 1: P2=0xFD;break;                                                        //控制左2数码管
                case 2: P2=0xFB;break;                                                        //控制左3数码管
                case 3: P2=0xF7;break;                                                        //控制左4数码管
                case 4: P2=0xEF;break;                                                        //控制左5数码管
                case 5: P2=0xDF;break;                                                        //控制左6数码管
                case 6: P2=0xBF;break;                                                        //控制左7数码管
                case 7: P2=0x7F;break;                                                        //控制左8数码管
                default:break;
        }
}
//************************************************************************************************
void led_show( )
{        static unsigned char led_shift=0x00;                                //定义静态变量
        P2=0xFF;                                                                                        //关闭数码管控制端口                                       
        P0=led_code[led_reg[led_shift]];                                        //把字符代码送到P0端口
        if(shift_r==(led_shift+1))                                                        //判断哪位数码管需要闪烁
        {        flash_adj++;
                if(flash_adj<0x05)   led_con(led_shift);                //0~5时,调用数码管位选控制程序,数码管亮
                else if(flash_adj<0x0A)  P2=0XFF;                                //5~A时,数码管灭
                else   flash_adj=0x00;                                                        //清闪烁速度调整变量
        }
        else                                                                                            //所有数码管不需要闪烁
                led_con(led_shift);                                                         //调用数码管位选控制程序
        led_shift++;                                                                                //数码管控制变量自加
        if(led_shift==0x08)                                                                        //判断是否扫描一轮
                led_shift=0x00;                                                                        //归零进行下一轮扫描
}
/************************************************************************************************
**function:clock()
**功    能:时钟函数
************************************************************************************************/
void clock()
{       
        if(T==20)                                                //判断1秒钟是否到
        {        T=0;                                                        //到了1秒钟,秒调整变量清零
                sec++;                                                                //秒钟变量加1
                if(sec>59)                                                        //判断1分钟是否到
                {        sec=0;                                                        //到了1分钟,秒钟变量清零
                        min++;                                                        //分钟变量加1
                        if(min>59)                                                //判断1小时是否到
                        {        min=0;                                                //到了1小时,分钟变量清零
                                hour++;                                                //时钟变量加1
                                if(hour>23)                                        //判断24小时是否到
                                {        hour=0;                                        //24小时到了,时钟变量清零
                                }
                        }
                }
                led_reg[0]=hour/10;                                        //提取时钟的十位
                led_reg[1]=hour%10;                                        //提取时钟的个位
                led_reg[3]=min/10;                                        //提取分钟的十位
                led_reg[4]=min%10;                                        //提取分钟的个位
                led_reg[6]=sec/10;                                        //提取秒钟的十位
                led_reg[7]=sec%10;                                        //提取秒钟的个位
        }


}
/***********************************************************************************************
                           中断与定时器
************************************************************************************************/

void T1_ini()
{
        //AUXR &= 0xBF;                //定时器时钟12T模式
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x10;                //设置定时器模式
        TL1 = 0x00;                //设置定时初值
        TH1 = 0x4C;                //设置定时初值
        TF1 = 0;                //清除TF1标志
        TR1 = 1;                //定时器1开始计时
        ET1 = 1;
        EA = 1;

}
void timer1()interrupt 3
{
          TL1 = 0x00;                //设置定时初值
        TH1 = 0x4C;                //设置定时初值
// TF1 = 0;
  T++;
   task_f = 1;                                        //使能任务标志位
  }

/************************************************************************************************
                                                                按键程序
************************************************************************************************/
void key()
{
if(zt==0)
{
delay(8);
if(zt==0)
{
numzt++;
if(numzt>1)numzt=0;
if(numzt==0)
   TR0=0;
if(numzt==1)
   TR0=1;
}         
}
  if(qh==0)
  {
     delay(10);
if(qh==0)
{
  numqh++;
P1=0xff;
TR0=0;
if(numqh>4)numqh=1;
}
while(!qh);
   }
   if(jia==0)
   {
  P1=0xff;  
      delay(10);
  if(jia==0&&numqh==1)
  {
     sec++;
if(sec>59)sec=0;
  }
  if(jia==0&&numqh==2)
  {
     min++;
if(min>59)min=0;
  }
  if(jia==0&&numqh==3)
  {
    hour++;
if(hour>23)hour=0;
  }
  while(!jia);
}
if(jian==0)
    {
P1 =0xff;
      delay(10);
  if(jian==0&&numqh==1)
  {
     sec--;
if(sec<0)sec=59;
  }
  if(jian==0&&numqh==2)
  {
     min--;
if(min<0)min=59;
  }
  if(jian==0&&numqh==3)
  {
     hour--;
if(hour<0)hour=23;
  }
  while(!jian);
}
if(numqh==4)
{
      TR0=1;
    numqh=0;
}
}
/************************************************************************************************
                                                                mian()
************************************************************************************************/
void main()
{        P0=0X00;                                //P0端口输出低电平
        P2=0XFF;                                //P2端口输出高电平
        T1_ini();
        while(1)
        {          
                   clock();                         //调用时钟函数
//                if (task_f)         //判断任务标志位是否有效                               
//                {       
//                task_f=0;                         //标志位清零
                led_show();                        //调用显示函数
        //        key();                                 //调用按键函数
                }
        }
//}



最佳答案

查看完整内容[请看2#楼]

我设了P1^0~1^3,结果暂停功能可以,切换扫描就是扫得有点快。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-12-5
在线时间
9 小时
 楼主| 发表于 2016-2-21 21:43:42 | 显示全部楼层
TinyBoy 发表于 2016-2-22 19:59
你确定按键是好的,当然4个按键同时坏的概率很小。你首先测试按键,4个按键,每个按键按下LED取反,先确定 ...

我设了P1^0~1^3,结果暂停功能可以,切换扫描就是扫得有点快。
回复

使用道具 举报

36

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2015-12-13
在线时间
243 小时
发表于 2016-2-21 23:43:50 | 显示全部楼层
……可惜我不是大神,所以我帮不上忙…………
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-2-21 23:44:00 | 显示全部楼层
帮顶!!!!
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2016-2-22 19:59:28 | 显示全部楼层
你确定按键是好的,当然4个按键同时坏的概率很小。你首先测试按键,4个按键,每个按键按下LED取反,先确定按键扫描是可以用的先。
回复

使用道具 举报

36

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2015-12-13
在线时间
243 小时
发表于 2016-2-23 23:10:55 | 显示全部楼层
个人感觉while(!key);这种扫描方式最垃圾的了!!!!假如按键坏了或者按住不放,那就是死循环了!!! 我从来都不会用这种方式!!
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2016-2-24 08:37:55 | 显示全部楼层
小莊 发表于 2016-2-23 22:25
我设了P1^0~1^3,结果暂停功能可以,切换扫描就是扫得有点快。

你的按键扫描方法可以换种方式来做,不过测试如此扫描也行,你确定4个按键扫描都可以得到键值,就是其他问题了,不要老纠结在这块,除非你单独测试按键扫描。
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-12-5
在线时间
9 小时
 楼主| 发表于 2016-3-2 14:54:25 | 显示全部楼层
HER107 发表于 2016-2-23 23:10
个人感觉while(!key);这种扫描方式最垃圾的了!!!!假如按键坏了或者按住不放,那就是死循环了!!! 我 ...

有没有其他的参考?
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-12-5
在线时间
9 小时
 楼主| 发表于 2016-3-2 14:54:50 | 显示全部楼层
TinyBoy 发表于 2016-2-24 08:37
你的按键扫描方法可以换种方式来做,不过测试如此扫描也行,你确定4个按键扫描都可以得到键值,就是其他 ...

我再试试吧~
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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