标题: 简单任务之四位数码管求助,新手求助 [打印本页]

作者: likemanweb    时间: 2016-8-25 10:20
标题: 简单任务之四位数码管求助,新手求助
在实验板上欲实现一个简单的功能,按K1键 数码管LED1 显1  按K2键 数码管LED2 显2  按K3键 数码管LED3 显3 按K4键 数码管LED1 显4问题?现在按K1四个管子同时显示1,其它按键也是四个数码管同时显示,不知问题出在那里,请高手指正,万分感谢!
实验板图纸




下面是C代码
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P2
#define SMG P0                          //数码管段选
#define GPIO_PLACE P1        //位选
sbit K1=P1^4;                          //位操作
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;

sbit ws1=P1^0;                         //数码管位选
sbit ws2=P1^1;
sbit ws3=P1^2;
sbit ws4=P1^3;

unsigned char code DIG_CODE[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码


void delay5(uint);

main()
{
        SMG=0xff;
        while(1)
        {
                if((P1&0xf0)!=0xff){
                        delay5(1);
                        SMG=0xff;
                        switch(P1&0xf0)
                        {
                                case 0xe0:SMG=DIG_CODE[1];ws1=0;delay5(1);ws1=1;break;
                            case 0xd0:SMG=DIG_CODE[2];ws2=0;delay5(1);ws2=1;break;
                                case 0xb0:SMG=DIG_CODE[3];ws3=0;delay5(1);ws3=1;break;
                            case 0x70:SMG=DIG_CODE[4];ws4=0;delay5(1);ws4=1;break;  
                        }
                }
        }
}

void delay5(uint c)                 //延时5ms
{
         uchar a,b;
         for(;c>0;c--)
                 for(b=19;b>0;b--)
                        for(a=130;a>0;a--);

}




作者: likemanweb    时间: 2016-8-25 10:21
简单任务
作者: thest    时间: 2016-8-25 10:31
case语句少了大括号吧,应该是case 0xe0:{SMG=DIG_CODE[1];ws1=0;delay5(1);ws1=1;}break;
作者: likemanweb    时间: 2016-8-25 10:38
thest 发表于 2016-8-25 10:31
case语句少了大括号吧,应该是case 0xe0:{SMG=DIG_CODE[1];ws1=0;delay5(1);ws1=1;}break;

按你说的试了,不可以的
作者: xnandoux    时间: 2016-8-25 10:38
按key1的时候把LED1为1其他的全部写为0;
switch(P1&0xf0)
{
    case 0xe0:
          ws1=1;ws2=0;ws3=0;ws4=0;
          SMG=DIG_CODE[1];
          break;
   case 0xd0:;;break; 同上打开相应的led位
   case 0xb0:;;;break;
   case 0x70:;;break;  
}
作者: huangfuxi2002    时间: 2016-8-25 15:18
switch(P1&0xf0)
{
    case 0xe0:
          ws1=1;ws2=0;ws3=0;ws4=0;
          SMG=DIG_CODE[1];
          break;
   case 0xd0:;;break; 同上打开相应的led位
   case 0xb0:;;;break;
   case 0x70:;;break;  
}
作者: likemanweb    时间: 2016-8-25 16:53
找到问题出在那了,还是要谢谢你们
作者: likemanweb    时间: 2016-8-25 16:54
huangfuxi2002 发表于 2016-8-25 15:18
switch(P1&0xf0)
{
    case 0xe0:

找到问题出在那了,还要是谢谢你
作者: likemanweb    时间: 2016-8-25 16:54
huangfuxi2002 发表于 2016-8-25 15:18
switch(P1&0xf0)
{
    case 0xe0:

找到问题了,还是要谢谢你们
作者: likemanweb    时间: 2016-8-25 16:56
找到问题了,还是要谢谢你们
作者: STC89C51    时间: 2016-8-26 01:04
读输入的时候要把P1^4~P1^7拉高,也就是置一,其他的写零,也就是P1=0xf0;除此之外,还要考虑到按键抖动,这点楼主是考虑到了,不过感觉有些不妥,有些啰嗦,不知道楼主把数码管段选都置一是什么意思?建议楼主可以这样写:
void main()
{
    P1=0xf0;
while(1)
    {
         if((P1|0x00)!=0xf0)
         {
      delay5(1);//延时消抖
   if((P1&0x00)!=0xf0)
   {
     switch(P1&0xf0)
              {
                    case 0xe0:SMG=DIG_CODE[1];ws1=1;delay5(400);ws1=0;break; //延时加长,这样看到的时间长点
                    case 0xd0:SMG=DIG_CODE[2];ws2=1;delay5(400);ws2=0;break;//NPN型三极管,发射极接地,高电平导通,做开关用
                    case 0xb0:SMG=DIG_CODE[3];ws3=1;delay5(400);ws3=0;break;
                    case 0x70:SMG=DIG_CODE[4];ws4=1;delay5(400);ws4=0;break;  
              }
   }                       
         }
    }
}


作者: STC89C51    时间: 2016-8-26 02:19
likemanweb 发表于 2016-8-25 16:56
找到问题了,还是要谢谢你们

是哪里出了问题?可否告知一下?
作者: mojiaxia    时间: 2016-8-26 09:29
是不是没有采用动态扫描
作者: STC89C51    时间: 2016-8-26 13:04
likemanweb 发表于 2016-8-25 16:53
找到问题出在那了,还是要谢谢你们

楼主方便说说是哪里出了问题吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1