找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2974|回复: 14
打印 上一主题 下一主题
收起左侧

简单任务之四位数码管求助,新手求助

[复制链接]
跳转到指定楼层
楼主
在实验板上欲实现一个简单的功能,按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--);

}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:118098 发表于 2016-8-25 10:21 | 只看该作者
简单任务
回复

使用道具 举报

板凳
ID:136609 发表于 2016-8-25 10:31 | 只看该作者
case语句少了大括号吧,应该是case 0xe0:{SMG=DIG_CODE[1];ws1=0;delay5(1);ws1=1;}break;
回复

使用道具 举报

地板
ID:118098 发表于 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;

按你说的试了,不可以的
回复

使用道具 举报

5#
ID:137549 发表于 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;  
}
回复

使用道具 举报

6#
ID:39386 发表于 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;  
}
回复

使用道具 举报

7#
ID:118098 发表于 2016-8-25 16:53 | 只看该作者
找到问题出在那了,还是要谢谢你们
回复

使用道具 举报

8#
ID:118098 发表于 2016-8-25 16:54 | 只看该作者
huangfuxi2002 发表于 2016-8-25 15:18
switch(P1&0xf0)
{
    case 0xe0:

找到问题出在那了,还要是谢谢你
回复

使用道具 举报

9#
ID:118098 发表于 2016-8-25 16:54 | 只看该作者
huangfuxi2002 发表于 2016-8-25 15:18
switch(P1&0xf0)
{
    case 0xe0:

找到问题了,还是要谢谢你们
回复

使用道具 举报

10#
ID:118098 发表于 2016-8-25 16:56 | 只看该作者
找到问题了,还是要谢谢你们
回复

使用道具 举报

11#
ID:137239 发表于 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;  
              }
   }                       
         }
    }
}

回复

使用道具 举报

12#
ID:137239 发表于 2016-8-26 02:19 来自手机 | 只看该作者
likemanweb 发表于 2016-8-25 16:56
找到问题了,还是要谢谢你们

是哪里出了问题?可否告知一下?
回复

使用道具 举报

13#
ID:5564 发表于 2016-8-26 09:29 | 只看该作者
是不是没有采用动态扫描
回复

使用道具 举报

14#
ID:137239 发表于 2016-8-26 13:04 | 只看该作者
likemanweb 发表于 2016-8-25 16:53
找到问题出在那了,还是要谢谢你们

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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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