找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2113|回复: 8
收起左侧

为什么单片机消隐总是不行?

[复制链接]
ID:644190 发表于 2019-11-18 11:35 | 显示全部楼层 |阅读模式
要求是初始值1234,随按键加减

第一段的阴影总是和最后一位一样……
求大神解答谢谢

#include<reg52.h>
sbit KEY=P3^4;
sbit KEY1=P3^5;
sbit seg1=P2^4;
sbit seg2=P2^5;
sbit seg3=P2^6;
sbit seg4=P2^7;
void delay(unsigned int xms);
int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int h;
  h=1234;
void main()
{

while(1)
  {
     if(KEY==0)
       {
         delay(1);
         if(KEY==0)
          {
             h++;
          }
                 while(!KEY)1;
       }

     if(KEY1==0)
       {
         delay(1);
         if(KEY1==0)
           {
            h--;  
           }
                 while(!KEY1);
       }

P2 = 0X10;
P0=a[h/1000];
delay(2);
P2 = 0X00;

P2=0X20;
P0=a[h%1000/100];
delay(2);
P2=0X00;


P2=0X40;
P0=a[h%100/10];
delay(2);
P2=0X00;


P2=0x80;
P0=a[h%10];
delay(2);
P2=0X00;
  }
}               

void delay(unsigned int xms)
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
{;}
}

51hei图片_20191118113414.png
回复

使用道具 举报

ID:263427 发表于 2019-11-18 12:09 | 显示全部楼层
您好,看程序没啥问题,是不是硬件的问题,可以考虑换个板子试一下。
回复

使用道具 举报

ID:466505 发表于 2019-11-18 12:27 | 显示全部楼层
尝试P0清零后,再给P2置位,再给P0斌值
回复

使用道具 举报

ID:213173 发表于 2019-11-18 12:55 | 显示全部楼层
消隐方式不当
  1. #include<reg52.h>
  2. sbit KEY1=P3^4;
  3. sbit KEY2=P3^5;
  4. sbit seg1=P2^4;
  5. sbit seg2=P2^5;
  6. sbit seg3=P2^6;
  7. sbit seg4=P2^7;
  8. void delay(unsigned int xms);
  9. unsigned char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  10. unsigned int h;

  11. void main()
  12. {
  13.         h=1234;
  14.         while(1)
  15.         {
  16.                 if(KEY1==0)
  17.                 {
  18.                         delay(10);
  19.                         if(KEY1==0)
  20.                         {
  21.                                 h++;
  22.                         }
  23.                         while(!KEY1);
  24.                 }
  25.                 if(KEY2==0)
  26.                 {
  27.                         delay(10);
  28.                         if(KEY2==0)
  29.                         {
  30.                                 h--;  
  31.                         }
  32.                         while(!KEY2);
  33.                 }
  34.                 P2=0X10;
  35.                 P0=a[h/1000];
  36.                 delay(2);
  37.                 P0=0X00;
  38.                
  39.                 P2=0X20;
  40.                 P0=a[h%1000/100];
  41.                 delay(2);
  42.                 P0=0X00;

  43.                 P2=0X40;
  44.                 P0=a[h%100/10];
  45.                 delay(2);
  46.                 P0=0X00;
  47.                
  48.                 P2=0x80;
  49.                 P0=a[h%10];
  50.                 delay(2);
  51.                 P0=0X00;
  52.         }
  53. }               

  54. void delay(unsigned int xms)
  55. {
  56.         int i,j;
  57.         for(i=xms;i>0;i--)
  58.                 for(j=110;j>0;j--);
  59. }
复制代码
回复

使用道具 举报

ID:245004 发表于 2019-11-18 13:19 | 显示全部楼层
本帖最后由 bh2030693 于 2019-11-18 13:50 编辑
  1. P2 = 0X10;
  2. P0=a[h/1000];
  3. delay(2);
  4. P2 = 0X00;
复制代码
次序不对,改成:
  1. <blockquote>P2 = 0x00;  // 先关闭公共端
复制代码

编辑一下原因:直接粘贴的代码还是显示不全,要先粘贴到text,再复制粘贴到这里才能显示全。


回复

使用道具 举报

ID:644190 发表于 2019-11-18 14:06 | 显示全部楼层
解决了谢谢 最后一行 P0清零后先赋值位选后段选 代码如下#include<reg52.h>
sbit KEY=P3^4;
sbit KEY1=P3^5;
sbit seg1=P2^4;
sbit seg2=P2^5;
sbit seg3=P2^6;
sbit seg4=P2^7;
void delay(unsigned int xms);
int a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int h;

void main()
{
  h=6152;
while(1)
  {
     if(KEY==0)
       {
         delay(1);
         if(KEY==0)
          {
             h++;
          }
                 while(!KEY);
       }

     if(KEY1==0)
       {
         delay(1);
         if(KEY1==0)
           {
            h--;  
           }
                 while(!KEY1);
       }

P2 = 0X00;
P0=a[h/1000];
P2 = 0X10;
delay(500);
P2 = 0X00;

P0=a[h%1000/100];
P2=0X20;
delay(500);
P2=0X00;


P0=a[h%100/10];
P2=0X40;
delay(500);
P2=0X00;



  P0=a[h%10];
  P2=0x80;
delay(500);
P2=0X00;

  }
}       


void delay(unsigned int xms)
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
{;}
}


回复

使用道具 举报

ID:466578 发表于 2019-11-18 14:57 | 显示全部楼层
消隐的是led的段数据P0,而不是位数据P2,可按下面模式修改,并调整delay时间
                P2=0X10;
                P0=a[h/1000];
                delay(2);
               P0=0x00
               delay();
回复

使用道具 举报

ID:346097 发表于 2019-11-18 16:52 | 显示全部楼层
延时做的不好,再改进一下
回复

使用道具 举报

ID:644190 发表于 2019-11-18 23:20 | 显示全部楼层
807964046 发表于 2019-11-18 16:52
延时做的不好,再改进一下

嗯嗯打错了 改5功能就对了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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