求51单片机数码管动态显示“6688”的汇编程序~电路图如下~谢谢~ 51单片机汇编问题 数码管动态显示 代码如下

作者&投稿:博任 (若有异议请与网页底部的电邮联系)
s1 bit p0.0 ;数码管位定义
s2 bit p0.1
s3 bit p0.2
s4 bit p0.3
s5 bit p0.4
s6 bit p0.5
s7 bit p0.6
s8 bit p0.7

led_data equ p2 ;数码管数据定义

org 00h ;程序开始
jmp main ;主程序开始处

org 030h ;主程序从30H开始
main: MOV sp,#30h ;设置堆栈
lcall rest ;调用初始化程序
lcall pro_8led ;调用数码管显示程序
jmp main ;返回

;********* 初始化程序 **************

rest:MOV a,#00h ;清寄存器
MOV b,#00h ;清寄存器
MOV p0,#0 ;禁止数码管显示
MOV p2,#255 ;
MOV p1,0ffh ;禁止LED显示
clr beep ;禁止蜂鸣器
ret ;返回

;******** 数码管显示程序 ***************
pro_8led:
MOV b,#32 ;一共显示32个数字
clr psw.3 ;重新设置寄存器组
setb psw.4 ;

MOV r0,#00h ;数据显示从0开始
MOV r1,#01h ;数码管从第1个开始
loop:MOV p0,r1 ;点亮当前数码管
MOV a,r0 ;准备第一个数据
MOV dptr,#tab_nu ;获得表头
MOVc a,@a+dptr ;得到第一个数据
MOV led_data,a ;输出到显示数据口

lcall delay ; 500 ms 延时
lcall delay ; 1 s 延时
inc r0 ;准备下一个数据
MOV a,r1 ;准备下一位数码管
rlc a ;设置下一个数码管
jc c1 ;8位全部显示,转移
MOV r1,a ;否则,设置下一位
djnz b,loop ;32个数没有显示完,返回显示
ret ;否则返回主程序

c1: MOV r1,#1 ;8位显示完,重新开始循环
clr c ;设置显示位
djnz b,loop ;32位显示完则返回重新显示
ret ;否则返回到主程序
;************* 数码管显示 *******************************

;************* 软件延时 500ms *****************************
delay: push psw ; 保存原来的寄存器内容
clr psw.3 ;
clr psw.4 ; 设置新的寄存器组
MOV r0,#2 ; 延时参数1
MOV r1,#250 ; 延时参数2
MOV r2,#2 ; 延时参数3
dl1:djnz r0,dl1 ; 延时循环1
MOV r0,#250 ;
dl2:djnz r1,dl1 ; 延时循环2
MOV r0,#240 ;
MOV r1,#248 ;
dl3:djnz r2,dl1 ; 延时循环3
nop ; 定时精度调整
pop psw ; 恢复原来的寄存器
ret ; 返回
;**********************************************************

;**********************************************************
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推

tab_nu:
db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 数字0-7 不带小数点代码
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 数字8-f 不带小数点代码
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 数字0-7 带小数点代码
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 数字8-f 带小数点代码

  end

如果你这也只是为了固定显示这个就没有意思了,你关键是要理解是怎么实现这个动太显示功能那才叫学懂了,什么叫动态显示。。。
我说一下,看你能懂不如果不懂再问吧,首先你把显示全清了,然后输出位码,再送DU码,然后加一个延时,再关了这位,再输出下一个位码再送DU码,,后面的都是一样的,只要让这个一直循环下去就可以动态显示了,

ORG 0000H                     ;  附仿真图  仿真通过

       MOV  31H,#06H

       MOV  32H,#06H

       MOV  33H,#08H

       MOV  34H,#08H

       ACALL   D0

       JMP     $-2

D0:    MOV  R0,#31H

       MOV   R2,#11111110B

       MOV    DPTR,#TAB

D1:   MOV    R3, #250

       DJNZ   R3, $

       ORL    P3,#00001111B

       MOV   A,@R0

       MOVC   A,@A+DPTR

       MOV    P1, A

D2:    MOV    A, R2

       MOV   P3, A

       RL   A

       MOV   R2,A

       INC    R0

       JB   ACC.4,D1

       RET

TAB:     DB 3FH,06H,5BH,4FH

         DB 66H,6DH,7DH,07H

         DB 7FH,6FH,77H,7CH

         DB 39H,5EH,79H,71H

         DB 40H

         END



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

#include
#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位数字 即 1 和 9 吧 程序基本问题不大
只是延时子程序 要在最后加上一条子程序返回指令 即 RET
否则 程序在调用子程序后 将无法正确返回到你的主程序上。
DELAY: MOV R0,#5H
DELAY2: MOV R1,#50H
DELAY3: MOV R2,#50H
DJNZ R2,$
DJNZ R1,DELAY3
DJNZ R0,DELAY2
RET (修改)
END

呵呵 满意 就选满意回答

51单片机电子钟程序数码管显示
答:include<reg51.h> define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;sbit beep=P2^3;unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;unsigned int pp;unsigned char code table[]={0x3f,0x06...

51单片机数码管显示程序
答:你要数码管依次显示的话,我推荐有求余的方式即“%”。

用51单片机C语言编写程序实现6位共阴极数码管循环显示0123456789ABCDEF...
答:include<reg51.h># define uint unsigned int# define uchar unsigned charcode uchar shu[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, /* 0 1 2 3 4 56 7*/0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段选 /* 8 9a b c def*/...

51单片机接74ls164驱动数码管的C程序,实现控制数码管0到9循环显示
答:include<reg51.h> code table[16]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };unsigned char date;void delayms(unsigned int cc){ unsigned int x,y;for(y=cc;y>0;y--)for(x=500;x>0;x--);} void main(){ while(1...

keil51单片机数码管滚的显示
答:先要数码管动态显示要建一个数组。下图为断码 源代码:include#include#define uchar unsigned char#define uint unsigned intsbit duan=P2^6; sbit wei=P2^7; uchar code tab[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00,...

单片机 汇编 LED数码管动态显示
答:temp equ 40h ;置缓冲区首址 org 00h mov 30h,#2 ;存入数据 mov 31h,#0 mov 32h,#1 mov 33h,#0 mov 34h,#7 mov 35h,#1 mov r0,#dbuf mov r1,#temp mov r2,#6 ;六位显示器 mov dptr,#segtab ;段码表首地址 dp00: mov a,@r0 ;取要显示的数据 mov...

51单片机数码管动态显示的过程中,怎么实现让最后一个闪烁,其他的不受影...
答://有1的那一位数码管不亮 {0,0,0,0}不闪烁 {1,1,1,1} 4位全闪烁 uchar ia;uchar bai,shi,ge;uchar flag=0;uint a=0;//共阴数码管七段码,转成共阳的需取反,程序中已这样做了 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};...

用51单片机控制数码管显示
答:以单支共阴数码管为例,可将段极接到某端口Pn,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据如右图:16键码显示的程序 我们在P1端口接一支共阴数码管SLED,在P2、P3端口接16个按键,分别编号为KEY_0、KEY_1到KEY_F,操作时只能按一个键,按键后SLED显示对应键编号。代码 1. #...

51单片机数码管显示数据向左字
答:百度知道 51单片机数码管动态显示从右往左...展开 lycdl 高粉答主 醉心答题,欢迎关注 关注 成为第7101位粉丝 这是四位数码管从右从左流动显示,像滚动字幕一样的。用不着矩阵按键哪。其实程序很简单,没那么复杂。程序如下 include<reg51.h> define uchar unsigned char define uint  unsigned ...

51单片机数码管,用动态显示0到123怎么编程?
答:0-123,需要三位数码管。include<reg51.h>#define uchar unsigned char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到fuchar number,dat[3],nn=0,cnt=0;;void t0isr() interrupt 1{TH0=(65536-5000)...