求一个51单片机汇编程序,让四个数码管动态显示1 2 3 4,不是静态轮流显示,简单点有代表性,注释好,谢谢

如题所述

第1个回答  2012-07-22
#include<stc89c51RC.h>
#define uchar unsigned char
#define uint unsigned int
int counter=0;
sbit w0=P2^7;
sbit w1=P2^6;
sbit w2=P2^5;
sbit w3=P2^4;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay_nms(uint z) //延时子
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void DisplayShumaguan(uchar* shuzi)
{
w0=1;
w1=0;
w2=0;
w3=0;
P0=table[*shuzi];
delay_nms(40);

w0=0;
w1=1;
w2=0;
w3=0;
P0=table[*(shuzi+1)];
delay_nms(40);
w0=0;
w1=0;
w2=1;
w3=0;
P0=table[*(shuzi+2)];
delay_nms(40);
w0=0;
w1=0;
w2=0;
w3=1;
P0=table[*(shuzi+3)];
delay_nms(40);
}
void main()
{
uchar ii[4]={1,2,3,4};
while(1)
{
DisplayShumaguan(ii);
}
}
第2个回答  2012-07-21
为啥不用C51语言编呢?追问

那可以请你给我一个c51的程序吗,谢咯

第3个回答  推荐于2018-05-10

                       

                         ORG    0000H

                         LJMP    0100H

MAIN:                MOV    60H,#1        ;给显示缓冲区送显示的初值

                         MOV    61H,#2

                         MOV    62H,#3

                         MOV    63H,#4

 LY:                  LCALL     DISP      ;调用显示子程序

                         MOV        R3,#15;   延时

LK:                    LCALL    YS1MS

                         DJNZ        R3,LK       

                         MOV       64H,60H

                         MOV       60H,61H

                         MOV       61H,62H

                         MOV       62H,63H

                         MOV       63H,60H     

                         SJMP      LY

DISP:                MOV    R0,#60H          ;指针指向显示缓冲区

                         MOV    R7,#4          ;设循环显示的次数  显示4位数据

                         CLR     C

                         MOV    R6,#00000001B   ;从p2.0开始显示  即先显示1

LL:                    MOV    DPTR,#TAB         ;数据指针指向显示编码表达首地址

                         MOV    A,@R0

                         MOVC  A  ,  @ A+ DPTR ;取显示编码

                         MOV     P0,A                     ;送P0口显示

                         MOV     A,R6

                         MOV     P2,A                    ;控制显示位

                         RLC      A                      ;修改显示位

                         MOV     R6,A

                         INC       R0                     ;指向下一个要显示的数据

                         LCALL    YS1MS            ;延时显示时间

                         DJNZ      R7,LL              ;4位数据没显示完 则转LL继续显示

                         RET

TAB:                 DB        0C0H,0F9H,0A4H,0B0H,99H    ;显示编码

                         DB        92H,82H,0F8H,80H,98H

 

 

YS1MS:            MOV    R5,#45            ;延时子程序

YSLL:               MOV    R4,#200

 YYLL:              DJNZ    R4,YYLL

                         DJNZ   R5,YSLL

                         RET

                      你是想要显示的数据是动态变化的吧                       

                      试好了   给加分啊  呵呵 

本回答被提问者和网友采纳
相似回答