[51单片机] 求助51单片机汇编数码管不能显示问题

[复制链接]
2694|22
 楼主| zbybass 发表于 2017-2-13 15:49 | 显示全部楼层 |阅读模式
新人一枚,如题。用C编程效果出来了,按着思路用汇编试了下死活出不来,究竟是哪里的问题呢?
        ORG 0000H
        AJMP MAIN
        ORG 0030H
MAIN:
        MOV P0,0C0H;给p0口字形码一个用来测试
        MOV P2,0FFH ;全部位选通
         SJMP 0030H ;循环
         END
顺便附上C的方法,送字形码后先给0再延时,干嘛用的呢?
#include <reg52.h>
#define uchar unsigned char
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
                        0xf8,0x80,0x90};
//void delay(uchar i)
//{
//uchar j,k;
// for(j=i;j>0;j--)
   // for(k=125;k>0;k--);
//}

void display()
{
  
   P0=table[0];
   P2_0 = 0;
   //delay(5);
  P2_0 = 1;

   P0=table[1];
  // P2_1 = 0;
  // delay(5);
   P2_1 = 1;

   P0=table[2];
  // P2_2 = 0;
  // delay(5);
   P2_2 = 1;

    P0=table[3];
  // P2_3 = 0;
//  delay(5);
   P2_3 = 1;
   
}

/*演示主程序*/
void main(void)
{
    unsigned int  a;
   
//while(1)
//{

  // for(a=100;a>0;a--)
   //{
     display();
  // }

//}
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
NE5532 发表于 2017-2-13 15:54 | 显示全部楼层
你的C和汇编等价么?C有延时,汇编的延时在哪里?那个送0叫“消隐”。
icesongjie 发表于 2017-2-13 16:07 | 显示全部楼层
最简单的方法就是把现成的C放到编译器里编译一下,看编译出来的汇编
continueloveyou 发表于 2017-2-13 16:17 | 显示全部楼层
P0=table[0];
   P2_0 = 0;                 //程序单步执行到这里后,数码管是可以亮的,但是程序很快就执行到了,P2_0 = 1;,又把数码管关闭了,由于这直接
                      //的时间很短,用眼睛基本上不出来,所以可以先把P2_0 = 1;屏蔽看看。还有要看看你用的是共阴还是共阳的数码管。

   //delay(5);
  P2_0 = 1;
continueloveyou 发表于 2017-2-13 16:19 | 显示全部楼层
P0=table[0];
   P2_0 = 0;                 //程序单步执行到这里后,数码管是可以亮的,但是程序很快就执行到了,P2_0 = 1;,又把数码管关闭了,由于这直接
                      //的时间很短,用眼睛基本上不出来,所以可以先把P2_0 = 1;屏蔽看看。还有要看看你用的是共阴还是共阳的数码管。

   //delay(5);
ningling_21 发表于 2017-2-13 16:23 | 显示全部楼层
continueloveyou 发表于 2017-2-13 16:19
P0=table[0];
   P2_0 = 0;                 //程序单步执行到这里后,数码管是可以亮的,但是程序很快就执 ...

C中低电平点亮一位数码管,汇编中没有低电平
ayb_ice 发表于 2017-2-13 16:32 来自手机 | 显示全部楼层
汇编的move指令传递立即数要加#符号
continueloveyou 发表于 2017-2-13 16:47 | 显示全部楼层
ningling_21 发表于 2017-2-13 16:23
C中低电平点亮一位数码管,汇编中没有低电平

C中低电平点亮一位数码管,汇编中没有低电平   顶
ningling_21 发表于 2017-2-13 17:35 | 显示全部楼层
continueloveyou 发表于 2017-2-13 16:47
C中低电平点亮一位数码管,汇编中没有低电平   顶

同时修正7楼指出的错误
例:MOV P2,#0FEH
 楼主| zbybass 发表于 2017-2-13 17:52 | 显示全部楼层
NE5532 发表于 2017-2-13 15:54
你的C和汇编等价么?C有延时,汇编的延时在哪里?那个送0叫“消隐”。

感谢指导,c的延时注销后也能显示,C里的程序是静态显示吧,这个能叫消隐吗?
 楼主| zbybass 发表于 2017-2-13 17:53 | 显示全部楼层
icesongjie 发表于 2017-2-13 16:07
最简单的方法就是把现成的C放到编译器里编译一下,看编译出来的汇编

感谢指导,我百度下方法试试看,我用的是keil
 楼主| zbybass 发表于 2017-2-13 18:14 | 显示全部楼层
continueloveyou 发表于 2017-2-13 16:17
P0=table[0];
   P2_0 = 0;                 //程序单步执行到这里后,数码管是可以亮的,但是程序很快就执 ...

p2.0~2.3控制三极管的基极,高电平激发后位选通,我把他们都设成了高电平,然后p0口给任何一个字形码也是应该能亮的,C中的延时注销后也是可以用的
 楼主| zbybass 发表于 2017-2-13 18:16 | 显示全部楼层
ayb_ice 发表于 2017-2-13 16:32
汇编的move指令传递立即数要加#符号

感谢指导。折腾到最后,有点晕了,竟然忘了加#号 ,但是补上也不行啊
 楼主| zbybass 发表于 2017-2-13 18:33 | 显示全部楼层
ayb_ice 发表于 2017-2-13 16:32
汇编的move指令传递立即数要加#符号

问题解决了,加上的 #号后,又加上了一句MOV p2,#00H,把位选关闭后再打开才能显示,不过表示不明白这是为什么?
ningling_21 发表于 2017-2-13 18:50 | 显示全部楼层
zbybass 发表于 2017-2-13 18:33
问题解决了,加上的 #号后,又加上了一句MOV p2,#00H,把位选关闭后再打开才能显示,不过表示不明白这是 ...

前面说过,是低电平驱动点亮某位数码管,不是高电平点亮
PS:电路用的是PNP 的三极管
 楼主| zbybass 发表于 2017-2-13 19:43 | 显示全部楼层
本帖最后由 zbybass 于 2017-2-13 20:03 编辑
ningling_21 发表于 2017-2-13 18:50
前面说过,是低电平驱动点亮某位数码管,不是高电平点亮
PS:电路用的是PNP 的三极管
...

明白了,三极管没看清类型,PNP的基极低电平时才导通
 楼主| zbybass 发表于 2017-2-13 19:44 | 显示全部楼层
continueloveyou 发表于 2017-2-13 16:47
C中低电平点亮一位数码管,汇编中没有低电平   顶

感谢回复,这个延时注释后也能出效果
czr012 发表于 2017-2-13 20:10 | 显示全部楼层
zbybass 发表于 2017-2-13 19:43
明白了,三极管没看清类型,PNP的基极低电平时才导通

P2控制位码,P0控制断码,  你的原理图应该是(1) P20为低电平时,P0口写入段码,D1对应的数码管显示。
(2)P21为低电平时,P0口写入段码,D2对应的数码管显示,..........
 楼主| zbybass 发表于 2017-2-13 20:31 | 显示全部楼层
czr012 发表于 2017-2-13 20:10
P2控制位码,P0控制断码,  你的原理图应该是(1) P20为低电平时,P0口写入段码,D1对应的数码管显示。
...

是的,感谢指导
NE5532 发表于 2017-2-14 09:29 | 显示全部楼层
4个数码管,肯定是动态扫描,不是静态,延时是必须的,请先想清楚扫描显示的基本原理,再动手,撞对的不算。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部